对你们来说,这是一个艰难的问题:)
基本上我有一个包含2列的GridBagLayout:列表包含在每个列中的滚动窗口中。滚动窗格在 BOTH 方向拉伸。
如果我逐渐减小此面板的高度(通过拖动窗口的边缘),我会看到滚动窗格上发生“随机”调整大小:
当第一个Hscroll栏出现时,第二个宽度会减少
然后,第二个人的宽度无缘无故再次缩小......
如果我不包装我的组件,请不要这样做。
如果您使用树替换右侧列表,它的行为将有所不同:
缩小窗口的高度380-ich px,树得到调整大小......
如果我不包装我的组件,如果你继续调整窗口的大小,那么树会被调整大小!
你们有什么想法发生了什么???
PS:我试图构建的实际布局比这个例子更复杂。与此同时,我使用SpringLayout来做我想要的事情,但它需要设置很多(不那么漂亮)的东西
protected static ListModel newListModel(int n) {
DefaultListModel lm = new DefaultListModel();
for (int i = 0; i < n; ++i)
lm.addElement("AAA");
return lm;
}
protected static JComponent createContentPane() {
JPanel pane = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.CENTER;
gbc.fill = GridBagConstraints.BOTH;
gbc.weightx = 1;
gbc.weighty = 1;
gbc.gridy = 0;
gbc.gridx = 0;
pane.add(new JScrollPane(new JList(newListModel(12))), gbc);
++gbc.gridx;
pane.add(new JScrollPane(new JList(newListModel(4))), gbc);
return pane;
}
public static void main(String[] args) {
JFrame f = new JFrame();
f.getContentPane().add(createContentPane());
f.setSize(800, 400);
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
f.setVisible(true);
}
答案 0 :(得分:9)
我在GridBagLayout中有一个带有多个ScrollPanes的应用程序,当我调整窗口大小时,它们也会突然显示调整大小。当ScrollPane的实际大小超过其“首选大小”时,似乎会发生跳转。我找到了一个解决方法:将首选大小设置为1x1像素。如果该组件具有正重量并且延伸两倍,它仍将占据整个细胞,但不会跳跃。如果需要多个单元格以不同的比例调整大小,可以将另一个单元格的首选大小设置为2x1像素。
答案 1 :(得分:2)
anchor
,然后您就可以将已放置的JComponent
修复为重新Poin
t,我认为GridBagLayout
使您的GUI复杂化,LayoutManager可以更好地将大量JComponents
放置到一个容器中(不使用nested layout
)例如
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
public class BorderPanels extends JFrame {
private static final long serialVersionUID = 1L;
public BorderPanels() {
setLayout(new GridBagLayout());// set LayoutManager
GridBagConstraints gbc = new GridBagConstraints();
JPanel panel1 = new JPanel();
Border eBorder = BorderFactory.createEtchedBorder();
panel1.setBorder(BorderFactory.createTitledBorder(eBorder, "20pct"));
gbc.gridx = gbc.gridy = 0;
gbc.gridwidth = gbc.gridheight = 1;
gbc.fill = GridBagConstraints.BOTH;
gbc.anchor = GridBagConstraints.NORTHWEST;
gbc.weightx = gbc.weighty = 20;
add(panel1, gbc); // add compoenet to the COntentPane
JPanel panel2 = new JPanel();
panel2.setBorder(BorderFactory.createTitledBorder(eBorder, "60pct"));
gbc.gridy = 1;
gbc.weightx = gbc.weighty = 60;
//gbc.insets = new Insets(2, 2, 2, 2);
add(panel2, gbc); // add component to the COntentPane
JPanel panel3 = new JPanel();
panel3.setBorder(BorderFactory.createTitledBorder(eBorder, "20pct"));
gbc.gridy = 2;
gbc.weightx = gbc.weighty = 20;
gbc.insets = new Insets(2, 2, 2, 2);
add(panel3, gbc);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // important
pack();
setVisible(true); // important
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() { // important
public void run() {
BorderPanels borderPanels = new BorderPanels();
}
});
}
}
避免使复杂的事情复杂化
使用GridLayout(所有JComponents
在屏幕上显示相同的Dimmension