我的问题是类似这样的( 如何获得一个JScrollPane内JScrollPanes跟随父母的调整大小 ),但这个问题并不清楚,答案有没有帮助我..
我有这个SSCCE(使用MigLayout ):
public static final int pref_height = 500;
public static void main(String[] args) {
JPanel innerPanel = new JPanel(new MigLayout());
innerPanel.setBorder(new LineBorder(Color.YELLOW, 5));
for(int i = 0; i < 15; i++) {
JTextArea textArea = new JTextArea();
textArea.setColumns(20);
textArea.setRows(5);
textArea.setWrapStyleWord(true);
textArea.setLineWrap(true);
JScrollPane jsp = new JScrollPane(textArea);
innerPanel.add(new JLabel("Notes" + i));
innerPanel.add(jsp, "span, grow");
}
JScrollPane jsp = new JScrollPane(innerPanel) {
@Override
public Dimension getPreferredSize() {
setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
Dimension dim = new Dimension(super.getPreferredSize().width + getVerticalScrollBar().getSize().width, pref_height);
setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
return dim;
}
};
jsp.setBorder(new LineBorder(Color.green, 5));
JPanel outerPanel = new JPanel();
outerPanel.setBorder(new LineBorder(Color.RED, 5));
outerPanel.add(jsp);
JFrame frame = new JFrame();
JDesktopPane jdp = new JDesktopPane();
frame.add(jdp);
jdp.setPreferredSize(new Dimension(800, 600));
frame.pack();
JInternalFrame jif = new JInternalFrame("Title", true, true, true, true);
jif.pack();
jif.add(outerPanel);
jdp.add(jif);
jif.pack();
jif.setVisible(true);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
我想JScrollPane
来调整每当父母JPanel
调整大小。 基本上,我想绿色边框与红色边框排队。 眼下,绿色边框保持相同的大小,不管红色边框(除非你调整太小)。
JPanel outerPanel = new JPanel();
一个JPanel默认使用的FlowLayout总是尊重添加到它的部件的尺寸。 作为一个猜测,也许你可以使用:
JPanel outerPanel = new JPanel( new BorderLayout() );
一个BorderLayout
给所有可用的空间添加到面板的组件。 默认情况下,一个是JInternalFrame还采用了BorderLayout的。 如此以来,你的滚动窗格的所有父组件使用BorderLayout的所有空间应该去滚动窗格。
在您发表SSCCE你应该使用从模拟你的问题,让大家可以测试你的SSCCE的JDK类POST代码。
我注意到这一点并没有使用原来的布局所以这里是一个答案。
为了使JScrollPane
调整当父JPanel
调整大小,你需要做两件事情。
1)设置面板成长的布局。 这可以用下面的代码。
new MigLayout("", //Layout Constraints
"grow", //Column Constraints
"grow"); //Row Constraints
2)设置组件成长。 这是在增加一个额外的参数作为简单add()
函数。
add(jsp, "grow");
额外
为了使JTextArea
,当你调整列成长JScrollPane
,您可以更改布局只会使第二列的变化。 例如
new MigLayout("", //Layout Constraints
"[/*Column 1*/][grow /*Column 2*/]", //Column Constraints
""); //Row Constraints
另外,我建议你使用wrap
代替span
使用下一行的span
是指使用这么多列。 例如span 2 //Means use 2 columns for this component
。 当您添加这意味着jsp
到innerPanel
它会成为
innerPanel.add(jsp, "wrap, grow");
编辑SSSCE
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
import net.miginfocom.swing.MigLayout;
public class JSPR extends JFrame {
public static final int pref_height = 500;
public static void main(String[] args) {
JPanel innerPanel = new JPanel(new MigLayout("", "[][grow]", ""));
innerPanel.setBorder(new LineBorder(Color.YELLOW, 5));
for(int i = 0; i < 15; i++) {
JTextArea textArea = new JTextArea();
textArea.setColumns(20);
textArea.setRows(5);
textArea.setWrapStyleWord(true);
textArea.setLineWrap(true);
JScrollPane jsp = new JScrollPane(textArea);
innerPanel.add(new JLabel("Notes" + i));
innerPanel.add(jsp, "wrap, grow");
}
JScrollPane jsp = new JScrollPane(innerPanel) {
@Override
public Dimension getPreferredSize() {
setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
Dimension dim = new Dimension(super.getPreferredSize().width + getVerticalScrollBar().getSize().width, pref_height);
setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
return dim;
}
};
jsp.setBorder(new LineBorder(Color.green, 5));
JPanel outerPanel = new JPanel(new MigLayout("", "grow", "grow"));
outerPanel.setBorder(new LineBorder(Color.RED, 5));
outerPanel.add(jsp, "grow");
JFrame frame = new JFrame();
JDesktopPane jdp = new JDesktopPane();
frame.add(jdp);
jdp.setPreferredSize(new Dimension(800, 600));
frame.pack();
JInternalFrame jif = new JInternalFrame("Title", true, true, true, true);
jif.pack();
jif.add(outerPanel);
jdp.add(jif);
jif.pack();
jif.setVisible(true);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}