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 生成器。
我在我的代码上应用 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 生成器。