Java Swing如何正确使用GridBagLayout和GridBagConstraints?

Java Swing How to use GridBagLayout and GridBagConstraints properly?

我在我的代码上应用 GridBagLayout 时遇到问题。我有两个版本的代码,一个有效,另一个无效。

这个不工作:

public class Tutorial extends JFrame{

JButton button1, button2, button3, button4, button5;
JPanel panel;
GridBagConstraints grid;

public Tutorial() {
    super("Java Program");
    setVisible(true);
    setSize(500, 500);
    setLocation(new Point(500, 150));
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    addComponents();
}

public void addComponents() {
    panel = new JPanel();
    grid = new GridBagConstraints();
    panel.setLayout(new GridBagLayout());

    button1 = new JButton();
    button1.setText("Button 1");
    grid.gridx = 0;
    grid.gridy = 0;
    panel.add(button1, grid);

    button2 = new JButton();
    button2.setText("Button 2");
    grid.gridx = 1;
    grid.gridy = 1;
    panel.add(button2, grid);

    button3 = new JButton();
    button3.setText("Button 3");
    grid.gridx = 2;
    grid.gridy = 2;
    panel.add(button3, grid);

    button4 = new JButton();
    button4.setText("Button 4");
    grid.gridx = 3;
    grid.gridy = 3;
    panel.add(button4, grid);

    button5 = new JButton();
    button5.setText("Button 5");
    grid.gridx = 4;
    grid.gridy = 4;
    panel.add(button5, grid);

    panel.add(button1);
    panel.add(button2);
    panel.add(button3);
    panel.add(button4);
    panel.add(button5);

    add(panel);
}

public static void main(String[] args) {

    Tutorial frame = new Tutorial();
    frame.setVisible(true);

}

}

为了提供一些上下文,我在观看一些教程时已经习惯了这种代码结构。我还注意到,当我使用 NetBeans 仅通过拖放组件来制作 GUI 时,代码结构与我当前使用的代码结构几乎相同,因此,我尝试坚持使用这种编码结构。但问题是 GridBagLayout 对我的代码的影响不起作用,我不知道问题出在哪里,我有点需要解释。

所以我在这里做了一个简单的,没有 class 变量、构造函数和方法,这个也可以工作:

public class TestClass {

public static void main(String[] args) {

    JFrame frame = new JFrame();
    JPanel panel = new JPanel();
    GridBagConstraints grid = new GridBagConstraints();

    JButton button1 = new JButton("Button 1");
    JButton button2 = new JButton("Button 2");
    JButton button3 = new JButton("Button 3");
    JButton button4 = new JButton("Button 4");
    JButton button5 = new JButton("Button 5");

    frame.setVisible(true);
    frame.setSize(500, 300);
    frame.setLocation(new Point(500, 150));
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    panel.setLayout(new GridBagLayout());

    grid.gridx = 1;
    grid.gridy = 1;
    panel.add(button1, grid);

    grid.gridx = 2;
    grid.gridy = 2;
    panel.add(button2, grid);

    grid.gridx = 3;
    grid.gridy = 3;
    panel.add(button3, grid);

    grid.gridx = 4;
    grid.gridy = 4;
    panel.add(button4, grid);

    grid.gridx = 5;
    grid.gridy = 5;
    panel.add(button5, grid);

    frame.add(panel);

}

}

所以基本上它们都是一样的,只是结构不同而已。

请注意,在添加所有组件后应该调用方法 setVisible

在不起作用的代码中,您犯了一些错误。

  • 您添加了两次按钮。一次有 GridBagConstraints 一次没有。您只需添加一次组件。
  • 您正在调用方法 setVisible 两次。一次在构造函数中,一次在方法中 main。您只需要调用方法 setVisible 一次。

I got used to this kind of code structure while watching some tutorials

推荐Oracle的教程:Creating a GUI With JFC/Swing.

when I use NetBeans to make GUI just by drag and dropping components

如果您真的想学习 Swing 编程,我建议不要 使用 GUI 生成器。