我正在尝试制作一个非常简单的布局,这在其他布局管理器中非常容易。但是,我需要让它适用于GridBagLayout
。在一段代码之后:
GridBagConstraints c = new GridBagConstraints();
JPanel smallLogoPanel = new JPanel();
smallLogoPanel.setBorder(new LineBorder(Color.red, 1));//for visualizing components' display are
smallLogoPanel.setSize(50, 50);
c.gridx = 0;
c.gridy = 0;
c.gridwidth = 1;
c.gridheight = 2;
c.weightx = 0.01;
c.weighty = 0.1;
c.fill = GridBagConstraints.BOTH;
JLabel smallLogoLabel = new JLabel(some code to get ImageIcon);
smallLogoPanel.add(smallLogoLabel);
this.infoPanel.add(smallLogoPanel, c);
JLabel label1 = new JLabel("Label 1");
label1.setFont(new Font("Verdana", Font.BOLD, 30));
label1.setBorder(new LineBorder(Color.red, 1));
c.gridx = 1;
c.gridy = 0;
c.gridwidth = 9;
c.gridheight = 1;
c.weightx = 0.99;//for some reason smallLogoLabel takes much more space if this weightx is any smaller
c.weighty = 0.075;
this.infoPanel.add(label1, c);
JLabel label2 = new JLabel("Label 2");
label2.setFont(new Font("Verdana", Font.BOLD, 10));
label2.setBorder(new LineBorder(Color.red, 1));
c.gridx = 1;
c.gridy = 1;
c.gridwidth = 9;
c.gridheight = 1;
c.weightx = 0.99;
c.weighty = 0.025;
this.infoPanel.add(label2, c);
......我得到了这样的结果:
......这绝对没问题。问题是当我在它下面再添加两个标签时:
JLabel label3 = new JLabel("Label 3");
label3.setFont(new Font("Verdana", Font.BOLD, 20));
label3.setBorder(new LineBorder(Color.red, 1));
c.gridx = 0;
c.gridy = 2;
c.gridwidth = 5;
c.gridheight = 1;
c.weightx = 0.5;
c.weighty = 0.05;
c.anchor = GridBagConstraints.CENTER;
this.infoPanel.add(label3, c);
JLabel label4 = new JLabel("Label 4");
label4.setFont(new Font("Verdana", Font.BOLD, 20));
label4.setBorder(new LineBorder(Color.red, 1));
c.gridx = 5;
c.gridy = 2;
c.gridwidth = 5;
c.gridheight = 1;
c.weightx = 0.5;
c.weighty = 0.05;
c.insets.left = 0;
this.infoPanel.add(label4, c);
......结果如下:
顶行的宽度变得不同,特别是带图标的面板变得更宽。另一个问题 - 底线。我希望两个标签的宽度相等。但是,似乎左边的一列只占用了带有图标的面板宽度相同的列。
我很高兴我能帮助我,因为我现在完全陷入困境。
答案 0 :(得分:1)
GridBagLayout的单个列中的所有组件具有完全相同的weightx
:属于该列中任何组件的任何GridBagConstraints的最大权重x。
最初,第0列的权重为0.01。但是你在第0列的另一行添加了一些其他行,权重为0.5,所以现在<0>第0列中的所有组件都被GridBagLayout处理,好像它们的权重x为0.5。
相同的规则适用于行和weighty
值。
顺便说一下,如果gridwidth = 9
的约束只是gridwidth = 1
,那么{{1}}可以使细胞宽9倍,这是一种常见的误解。这不是实际发生的事情。除非另一行实际包含那些列中的非空单元格,否则网格宽度9将不会更宽。这是因为GridBagLayout单元格大小是灵活的,除非它们包含组件,否则它们的宽度为零。只有权重确定细胞的相对大小。 gridwidth和gridheight没有。