微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我在我的代码上应用 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 对我的代码的影响不起作用,我不知道问题出在哪里,我有点需要解释一下。

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

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 一次。

看一些教程就习惯了这种代码结构

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

当我使用 NetBeans 仅通过拖放组件来制作 GUI 时

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。