3

我正在尝试使用 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 放入的所有嵌入。所以,恐怕我们又回到了图片链接。而且现在好像不能发两个以上的超链接,所以最后一个链接已经被杀掉了,需要复制粘贴进去。

谢谢,山姆

4

4 回答 4

1

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

如果你想确保你的中间列有更多的宽度,把一些只在这个列中的组件放在那里。

于 2011-03-27T14:30:00.533 回答
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中应该什么时候真正存在。

另外,顺便说一句,底部面板的 weightx 不会增加到 1.00,它们会增加到 0.99。只是觉得你应该知道。

于 2011-03-27T05:02:15.667 回答
0

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

    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);

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

在此处输入图像描述

于 2011-03-27T14:06:08.480 回答
0

你只是想让布局工作吗?

我做了一些修改。

 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);
于 2011-03-27T15:04:45.947 回答