【问题标题】:GridBagLayout in Java Column IssueJava 列问题中的 GridBagLayout
【发布时间】:2011-07-23 18:06:03
【问题描述】:

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

谢谢,山姆

【问题讨论】:

    标签: java swing gridbaglayout


    【解决方案1】:

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

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

    【讨论】:

    • ŭlo 谢谢你,我现在明白这个问题了。
    【解决方案2】:

    看来您需要修复 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。只是觉得你应该知道。

    【讨论】:

    • 我已按照您的建议进行了两项修改(修复了列问题并使底部 weightx 加起来为 1),但输出仍然相同且不正确。对不起,虽然感谢您的帮助。 ://
    【解决方案3】:

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

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

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

    【讨论】:

    • 谢谢!我暂时实现了这个解决方法,以便我可以专注于程序的其余部分。对我来说,这确实看起来是 GridBagLayout 中的一个错误。
    • 实际上 Paŭlo Ebermann 的回答解释了添加此临时面板如何修复布局。
    【解决方案4】:

    你只是想让布局工作吗?

    我做了一些修改。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-11
      • 2021-06-21
      • 1970-01-01
      • 2014-02-23
      • 2014-02-19
      相关资源
      最近更新 更多