【问题标题】:GridBagLayout is not working when I add it to the JFrame当我将它添加到 JFrame 时,GridBagLayout 不起作用
【发布时间】:2016-08-16 09:36:15
【问题描述】:

我的 GridBagLayout 有一些问题。我创建了一个 JPanel(在本例中称为 mainPanel),其布局已设置为 GridBagLayout。我已经为每个 JButton 指定了约束,并将约束添加到每个按钮。现在,当我运行我的代码时,无论我在约束中指示的 gridx/gridy 值如何,按钮总是彼此相邻。此外,当我希望一个按钮出现在右上角、左上角和南边时,按钮始终位于 JFrame 的中心。

import javax.swing.*;
import java.awt.*;

public class test {
public static void main (String[] args) {
    myJFrame test = new myJFrame();
    }
}

class myJFrame extends JFrame {
   public myJFrame () {
      setSize(500,500);
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      mainPanel myPanel = new mainPanel();
      add(myPanel);

     setVisible(true);
 }
}

class mainPanel extends JPanel {
    public mainPanel(){
       setLayout(new GridBagLayout());
       GridBagConstraints c = new GridBagConstraints();

        c.anchor =      GridBagConstraints.NORTHWEST;
        c.gridx =       1000;
        c.gridy=        1;
        add(new JButton("1"),c);

        c.anchor =      GridBagConstraints.NORTHEAST;
        c.gridx =       100;
        c.gridy=        1;
        add(new JButton("2"),c);

        c.anchor =      GridBagConstraints.SOUTH;
        c.gridx =       200;
        c.gridy=        1;
        add(new JButton("3"),c);
   }
}

This is what i get when i run the code

【问题讨论】:

    标签: java swing layout-manager gridbaglayout


    【解决方案1】:

    现在,当我运行我的代码时,无论我在约束中指定的 gridx/gridy 值如何,按钮总是彼此相邻。

    正确,您不能只指定随机单元格。一个组件必须位于每个单元格中。

    此外,按钮总是在 JFrame 的中心,

    是的,如果您不指定 weightx/weighty 约束,这是默认行为。

    阅读 How to Use GridBagLayout 上的 Swing 教程部分,了解有关约束和工作示例的更多信息。

    为什么要随机选择 x 个位置,例如 100、200、1000?也许水平的BoxLayout 会是一个更好的布局管理器。您可以添加组件,然后在它们之间添加空间:

    panel.add( button1 );
    panel.add( Box.createHorizonalStrut(100);
    panel.add( button2 );
    panel.add( Box.createHorizonalStrut(200);
    

    或者可以使用 FlowLayout 并指定每个组件之间的“间隙”。

    【讨论】:

    • 谢谢!确实你是对的,这是权重的问题——一旦我修改了这个,我就能得到我期望的行为。至于 x 位置,只是为了表明,无论 x 坐标中位置的大小如何,项目都彼此相邻出现。谢谢!
    • @newbieJavaDev,很高兴它有帮助。不要忘记通过单击复选标记“接受”答案,以便人们知道问题已解决。
    猜你喜欢
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 2016-08-27
    • 1970-01-01
    相关资源
    最近更新 更多