Java 组件在GridBagLayout中只占用一列

Java 组件在GridBagLayout中只占用一列,java,swing,gridbaglayout,Java,Swing,Gridbaglayout,我正在尝试制作一个非常简单的布局,这在其他布局管理器中非常容易。但是,我需要让它为GridBagLayout工作。在一段代码之后: GridBagConstraints c = new GridBagConstraints(); JPanel smallLogoPanel = new JPanel(); smallLogoPanel.setBorder(new LineBorder(Color.red, 1));//for visualizing components' display are

我正在尝试制作一个非常简单的布局,这在其他布局管理器中非常容易。但是,我需要让它为
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);
…结果如下所示:

顶行的宽度变得不同,特别是带有图标的面板变得更宽。另一个问题——最后一行。我希望两个标签的宽度相等。然而,左边的一列似乎只占1列,与带有图标的面板的宽度相同


我真的很高兴有人能帮我解决这个问题,因为我现在完全被卡住了。

GridBagLayout的一列中的所有组件都具有完全相同的
权重x
:属于该列中任何组件的任何GridbagConstraint的最大权重x

最初,第0列的权重X为0.01。但随后在第0列的另一行添加了其他内容,权重x为0.5,因此现在GridBagLayout将第0列中的所有组件视为权重x为0.5

同样的规则适用于行和权重值


顺便说一句,
gridwidth=9
可以使单元格比其约束条件仅为
gridwidth=1
时宽九倍,这是一种常见的误解。事实并非如此。gridwidth为9不会再宽,除非另一行在这些列中实际包含非空单元格。这是因为GridBagLayout单元格大小是灵活的,除非包含组件,否则其宽度为零。只有权重决定单元格的相对大小。gridwidth和gridheight不适用。

请编辑问题,并说明这些JC组件是否可以/将如何调整大小,这对于回答问题非常重要唯一定义大小的组件是带有图标的面板。此外,每个组件仅使用c.fill=gridbagstraints填充区域的其余部分。我们知道,
gridwidth
并不意味着以像素为单位指定宽度。我为什么使用gridwidth=9,在接下来的步骤中我需要10列。不管怎样,你关于非空电池的提示非常有用,我相信我能自己继续下去。干杯