GridBagLayout(网格包布局管理器)是在网格基础上提供复杂的布局,是最灵活、 最复杂的布局管理器。GridBagLayout 不需要组件的尺寸一致,允许组件扩展到多行多列。每个 GridBagLayout 对象都维护了一组动态的
矩形网格单元,每个组件占一个或多个单元,所占有的网格单元称为组件的显示区域。
GridBagLayout 所管理的每个组件都与一个 GridBagConstraints 约束类的对象相关。这个约束类对象指定了组件的显示区域在网格中的位置,以及在其显示区域中应该如何摆放组件。除了组件的约束对象,GridBagLayout还要考虑每个组件的最小和首选尺寸,以确定组件的大小。
为了有效地利用网格包布局管理器,在向容器中添加组件时,必须定制某些组件的相关约束对象GridBagConstraints 对象的定制是通过下列变量实现的。
1. gridx 和 gridy
用来指定组件左上角在网格中的行和列。容器中最左边列的 gridx 为 0,最上边行的 gridy 为 0。这两个变量的默认值是GridBagConstraints.RELATIVE,表示对应的组件将放在前一个组件的右边或下面。
2. gridwidth 和 gridheight
用来指定组件显示区域所占的列数和行数,以网格单元而不是像素为单
位,默认值为 1。
3. fill
指定组件填充网格的方式,可以是如下值:GridBagConstraints.NONE(默认值)、
GridBagConstraints.HORIZONTAL(组件横向充满显示区域,但是不改变组件高度)、GridBagConstraints.VERTICAL(组件纵向充满显示区域,但是不改变组件宽度)以及 GridBagConstraints.BOTH(组件横向、纵向充满其显示区域)。
4. ipadx 和 ipady
指定组件显示区域的内部填充,即在组件最小尺寸之外需要附加的像素数,默认值为 0。
5. insets
指定组件显示区域的外部填充,即组件与其显示区域边缘之间的空间,默
认组件没有外部填充。
6. anchor
指定组件在显示区域中的摆放位置。可选值有GridBagConstraints.CENTER(默认值)GridBagConstraints.NORTH、GridBagConstraints.NORTHEAST、GridBagConstraints.EAST、GridBagConstraints.SOUTH、GridBagConstraints.SOUTHEAST、GridBagConstraints.WEST、GridBagConstraints.SOUTHWEST 以及GridBagConstraints.NORTHWEST。
7. weightx 和 weighty
用来指定在容器大小改变时,增加或减少的空间如何在组件间分配,默认值为 0,即所有的组件将聚拢在容器的中心,多余的空间将放在容器边缘与网格单元之间。weightx 和 weighty 的取值一般在 0.0 与 1.0 之间,数值
大表明组件所在的行或者列将获得更多的空间。
在使用Swing的GridBagConstraints时,每次添加一个组件时创建一个新的GridBagConstraints对象是更安全和推荐的做法。这是因为GridBagConstraints对象包含了组件的布局信息,如果复用同一个对象,可能会导致之前设置的属性影响到后续组件的布局。
以下是详细的步骤和代码示例:
- 创建一个JPanel并设置其布局管理器为GridBagLayout。
- 每次添加一个组件时,创建一个新的GridBagConstraints对象。
- 设置GridBagConstraints对象的属性。
- 使用GridBagLayout的addLayoutComponent方法将组件添加到JPanel中。
import javax.swing.*;
import java.awt.*;
public class GridBagLayoutExample {
public static void main(String[] args) {
JFrame frame = new JFrame("GridBagLayout Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 300);
JPanel panel = new JPanel();
panel.setLayout(new GridBagLayout());
// Adding first component
GridBagConstraints gbc1 = new GridBagConstraints();
gbc1.gridx = 0;
gbc1.gridy = 0;
gbc1.insets = new Insets(5, 5, 5, 5);
panel.add(new JButton("Button 1"), gbc1);
// Adding second component
GridBagConstraints gbc2 = new GridBagConstraints();
gbc2.gridx = 1;
gbc2.gridy = 0;
gbc2.insets = new Insets(5, 5, 5, 5);
panel.add(new JButton("Button 2"), gbc2);
// Adding third component
GridBagConstraints gbc3 = new GridBagConstraints();
gbc3.gridx = 2;
gbc3.gridy = 0;
gbc3.insets = new Insets(5, 5, 5, 5);
panel.add(new JButton("Button 3"), gbc3);
frame.add(panel);
frame.setVisible(true);
}
}
这段代码创建了一个包含三个按钮的JPanel,每个按钮都使用了不同的GridBagConstraints对象来设置其位置和大小。