Java列问题中的GridBagLayout

我正在尝试使用GridBagLayout布局管理器来实现此目的:

在此处输入图像描述

但是,我目前得到的是:

在此处输入图像描述

问题是橙色和棕色/灰色面板应该占据第二列,但似乎只想在运行代码时占据第三列。

我用于布局的代码:

Container contentPane = form.getContentPane(); contentPane.setLayout(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); JPanel pnlGame = new JPanel(); pnlGame.setBackground(Color.green); //temp c.gridx = 0; c.gridy = 0; c.gridwidth = 2; c.gridheight = 2; c.fill = GridBagConstraints.BOTH; c.weightx = 0.85; c.weighty = 0.65; contentPane.add(pnlGame, c); JPanel pnlBuy = new JPanel(); c.gridx = 2; pnlBuy.setBackground(Color.blue); //temp c.gridy = 0; c.gridwidth = 1; c.gridheight = 1; c.fill = GridBagConstraints.BOTH; c.weightx = 0.15; c.weighty = 0.46; contentPane.add(pnlBuy, c); JPanel pnlUpgrade = new JPanel(); pnlUpgrade.setBackground(Color.yellow); //temp c.gridx = 2; c.gridy = 1; c.gridwidth = 1; c.gridheight = 1; c.fill = GridBagConstraints.BOTH; c.weightx = 0.15; c.weighty = 0.19; contentPane.add(pnlUpgrade, c); JPanel pnlStats = new JPanel(); pnlStats.setBackground(Color.red); //temp c.gridx = 0; c.gridy = 2; c.gridwidth = 1; c.gridheight = 2; c.fill = GridBagConstraints.BOTH; c.weightx = 0.61; c.weighty = 0.35; contentPane.add(pnlStats, c); JPanel pnlSpeed = new JPanel(); pnlSpeed.setBackground(Color.orange); //temp c.gridx = 1; c.gridy = 2; c.gridwidth = 2; c.gridheight = 1; c.fill = GridBagConstraints.BOTH; c.weightx = 0.38; c.weighty = 0.04; contentPane.add(pnlSpeed, c); JPanel pnlRounds = new JPanel(); pnlRounds.setBackground(Color.gray); //temp c.gridx = 2; c.gridy = 3; c.gridwidth = 2; c.gridheight = 1; c.fill = GridBagConstraints.BOTH; c.weightx = 0.38; c.weighty = 0.31; contentPane.add(pnlRounds, c); 

那么,我做错了什么? 对不起,如果我的英语有点蹩脚,和/或我犯的错误很明显……早上20到5点,我度过了漫长的一天。 很快就应该打干草了。

更新:

似乎如果我改变棕色/灰色面板的网格宽度,一切似乎都正确对齐,但我的布局中最终出现了一个令人讨厌的差距。 这里:

i.imgur.com/6JUx2.png

该小组的代码(包括Kevin S建议的修正案):

 JPanel pnlRounds = new JPanel(); pnlRounds.setBackground(Color.gray); //temp c.gridx = 1; c.gridy = 3; c.gridwidth = 1; c.gridheight = 1; c.fill = GridBagConstraints.BOTH; c.weightx = 0.38; c.weighty = 0.31; contentPane.add(pnlRounds, c); 

那么,有什么我做错了,或者这只是GridBagLayout的一些奇怪的行为,我将不得不忍受?

不幸的是,感谢我的编辑,我已经失去了Bala R在那里所有的嵌入。 所以,我害怕,我们回到图像的链接。 现在似乎我不能发布超过两个超链接,所以链接已经在最后一个中被杀死,你需要复制并粘贴它。

谢谢,山姆

中间列中的所有组件也至少在另一列中。 因此,GridBagLayout将中间列的首选宽度计算为0,这就是您所看到的效果。

如果要确保中间列的宽度更大,请在其中放置一些仅在此列中的组件。

所以看起来你需要修复pnlRounds JPanel:

 JPanel pnlRounds = new JPanel(); pnlRounds.setBackground(Color.gray); //temp c.gridx = 1; // NEEDS TO BE 1 (NOT 2) c.gridy = 3; c.gridwidth = 2; c.gridheight = 1; c.fill = GridBagConstraints.BOTH; c.weightx = 0.38; c.weighty = 0.31; contentPane.add(pnlRounds, c); 

看起来你的问题是你的代码中有c.gridx = 2 ,而c.gridx = 1应该是真正存在的。

另外,作为旁注,底部面板的重量不会增加到1.00,它们会增加到0.99。 只是认为你应该知道。

不完全是你的解决方案,但更像是一个临时的解决方法。 如果你添加这个新的面板

  JPanel pnlTemp = new JPanel(); pnlTemp.setBackground(Color.pink); //temp c.gridx = 1; c.gridy = 3; c.gridwidth = 1; c.gridheight = 1; c.fill = GridBagConstraints.BOTH; c.weightx = 0.38; c.weighty = 0.31; contentPane.add(pnlTemp, c); 

在灰色面板之后,它修复了布局。 不知道为什么,但也许这会有所帮助,直到你(或其他人)能够找到正确的解决方案。 这个新的粉红色面板不可见,但只是帮助修复布局。 这是布局后的样子

在此处输入图像描述

你只是希望布局工作吗?

我做了一些修改。

  Container contentPane = form.getContentPane(); contentPane.setLayout(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); JPanel pnlGame = new JPanel(); pnlGame.setBackground(Color.green); //temp c.gridx = 0; c.gridy = 0; c.gridwidth = 1; // one row c.gridheight = 1; // one column c.fill = GridBagConstraints.BOTH; c.weightx = 0.60; c.weighty = 0.40; contentPane.add(pnlGame, c); // Added two new components // pnlgGame and pnlggGame // Covers up 2nd column and rows 0 and 1 JPanel pnlgGame = new JPanel(); pnlgGame.setBackground(Color.green); //temp c.gridx = 1; c.gridy = 0; c.gridwidth = 1; // one row c.gridheight = 2; // two column c.fill = GridBagConstraints.BOTH; c.weightx = 0.20; c.weighty = 0.40; contentPane.add(pnlgGame, c); // Covers 2nd row and column 1 JPanel pnlggGame = new JPanel(); pnlggGame.setBackground(Color.green); //temp c.gridx = 0; c.gridy = 1; c.gridwidth = 1; c.gridheight = 1; c.fill = GridBagConstraints.BOTH; c.weightx = 0.60; c.weighty = 0.20; contentPane.add(pnlggGame, c); JPanel pnlBuy = new JPanel(); pnlBuy.setBackground(Color.blue); //temp c.gridx = 2; c.gridy = 0; c.gridwidth = 1; c.gridheight = 1; c.fill = GridBagConstraints.BOTH; c.weightx = 0.20; c.weighty = 0.40; contentPane.add(pnlBuy, c); JPanel pnlUpgrade = new JPanel(); pnlUpgrade.setBackground(Color.yellow); //temp c.gridx = 2; c.gridy = 1; c.gridwidth = 1; c.gridheight = 1; c.fill = GridBagConstraints.BOTH; c.weightx = 0.20; c.weighty = 0.20; contentPane.add(pnlUpgrade, c); JPanel pnlSpeed = new JPanel(); pnlSpeed.setBackground(Color.BLUE); //temp c.gridx = 1; c.gridy = 2; c.gridwidth = 2; c.gridheight = 1; c.fill = GridBagConstraints.BOTH; c.weightx = 0.40; c.weighty = 0.05; contentPane.add(pnlSpeed, c); JPanel pnlStats = new JPanel(); pnlStats.setBackground(Color.red); //temp c.gridx = 0; c.gridy = 2; c.gridwidth = 1; c.gridheight = 2; c.fill = GridBagConstraints.BOTH; c.weightx = 0.60; c.weighty = 0.40; contentPane.add(pnlStats, c); JPanel pnlRounds = new JPanel(); pnlRounds.setBackground(Color.gray); //temp c.gridx = 1; c.gridy = 3; c.gridwidth = 2; c.gridheight = 1; c.fill = GridBagConstraints.BOTH; c.weightx = 0.40; c.weighty = 0.35; contentPane.add(pnlRounds, c); form.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); form.setVisible(true);