GridBagLayout 如何工作
只要你希望组件不会彼此相邻显示,就会使用布局。GridBagLayout
是一个很有用的,因为它将窗口划分为行和列,然后决定将组件放入哪个行和列,以及组件的大小和列数。
我们以此窗口为例。已标记网格线以显示布局。
在这里,我创建了 6 个组件,使用 GridBagLayout 布局。
零件 | 位置 | 尺寸 |
---|---|---|
JLabel :我惊人的秋千应用 |
0, 0 |
3, 1 |
JButton :“按钮 A” |
0, 1 |
1, 1 |
JButton :“按钮 B” |
1, 1 |
1, 1 |
JButton :“按钮 C” |
2, 1 |
1, 1 |
JSlider |
0, 2 |
3, 1 |
JScrollBar |
0, 3 |
3, 1 |
请注意,位置 0, 0
位于左上角:x
(列)值从左向右增加,y
(行)值从上到下增加。
要开始在 GridBagLayout
中布置组件,首先要设置 JFrame
或内容窗格的布局。
frame.setLayout(new GridBagLayout());
//OR
pane.setLayout(new GridBagLayout());
//OR
JPanel pane = new JPanel(new GridBagLayout()); //Add the layout when creating your content pane
请注意,你永远不会定义网格的大小。这是在添加组件时自动完成的。
之后,你将需要创建一个 GridBagConstraints
对象。
GridBagConstraints c = new GridBagConstraints();
要确保组件填满窗口大小,你可能需要将所有组件的权重设置为 1.权重用于确定如何在列和行之间分配空间。
c.weightx = 1;
c.weighty = 1;
你可能想要做的另一件事是确保组件占用尽可能多的水平空间。
c.fill = GridBagConstraints.HORIZONTAL;
如果你愿意,还可以设置其他填充选项。
GridBagConstraints.NONE //Don't fill components at all
GridBagConstraints.HORIZONTAL //Fill components horizontally
GridBagConstraints.VERTICAL //Fill components vertically
GridBagConstraints.BOTH //Fill components horizontally and vertically
在创建组件时,你需要设置它应该在网格上的位置,以及它应该使用多少个网格图块。例如,要将按钮放在第 2 列的第 3 行中,并占用 5 x 5 网格空间,请执行以下操作。请记住,网格从 0, 0
开始,而不是 1, 1
。
JButton button = new JButton("Fancy Button!");
c.gridx = 2;
c.gridy = 1;
c.gridwidth = 5;
c.gridheight = 5;
pane.add(buttonA, c);
向窗口添加组件时,请记住将约束作为参数传递。这可以在上面的代码示例的最后一行中看到。
你可以为每个组件重复使用相同的 GridBagConstraints
- 添加组件后更改它不会更改以前添加的组件。
例
这是本节开头的示例代码。
JFrame frame = new JFrame("Super Awesome Window Title!"); //Create the JFrame and give it a title
frame.setSize(512, 256); //512 x 256px size
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //Quit the application when the JFrame is closed
JPanel pane = new JPanel(new GridBagLayout()); //Create a pane to house all content, and give it a GridBagLayout
frame.setContentPane(pane);
GridBagConstraints c = new GridBagConstraints();
c.weightx = 1;
c.weighty = 1;
c.fill = GridBagConstraints.HORIZONTAL;
JLabel headerLabel = new JLabel("My Amazing Swing Application");
c.gridx = 0;
c.gridwidth = 3;
c.gridy = 0;
pane.add(headerLabel, c);
JButton buttonA = new JButton("Button A");
c.gridx = 0;
c.gridwidth = 1;
c.gridy = 1;
pane.add(buttonA, c);
JButton buttonB = new JButton("Button B");
c.gridx = 1;
c.gridwidth = 1;
c.gridy = 1;
pane.add(buttonB, c);
JButton buttonC = new JButton("Button C");
c.gridx = 2;
c.gridwidth = 1;
c.gridy = 1;
pane.add(buttonC, c);
JSlider slider = new JSlider(0, 100);
c.gridx = 0;
c.gridwidth = 3;
c.gridy = 2;
pane.add(slider, c);
JScrollBar scrollBar = new JScrollBar(JScrollBar.HORIZONTAL, 20, 20, 0, 100);
c.gridx = 0;
c.gridwidth = 3;
c.gridy = 3;
pane.add(scrollBar, c);
frame.setVisible(true); //Show the window