11.3.4 GridBagLayout布局管理器
11.3.4 GridBagLayout布局管理器
GridBagLayout
布局管理器的功能最强大,但也最复杂。
GridBagLayout
与GridLayout
布局管理器的不同
与GridLayout
布局管理器不同的是,在GridBagLayout
布局管理器中,一个组件可以跨越一个或多个网格,并可以设置各网格的大小互不相同,从而增加了布局的灵活性。当窗口的大小发生变化时,GridLayout
布局管理器也可以准确地控制窗口各部分的拉伸。
为了处理GridLayout
中GUI
组件的大小、跨越性,Java
提供了GridBagConstraints
对象,该对象与特定的GUI
组件关联,用于控制该GUI
组件的大小、跨越性。
使用GridBagLayout
布局管理器的步骤
使用GridBagLayout
布局管理器的步骤如下:
- 创建
GridBagLayout
布局管理器,并指定GUI
容器使用该布局管理器:1
2GridBagLayout gb = new GridBagLayout();
container.setLayout(gb); - 创建
GridBagConstraints
对象,并设置该对象的相关属性(用于设置受该对象控制的GUI
组件的大小、跨越性等)。1
2
3
4gbc.grid=2; //设置受该对象控制的GUI组件位于网格的横向索引
gbc.grid=1; //设置受该对象控制的GUI组件位于网格的纵向索引
gbc.gridwidth=2; //设置受该对象控制的GUI组件横向跨越多少网格
gbc.gridheight=1; //设置受该对象控制的GUI组件纵向跨越多少网格 - 调用
GridBagLayout
对象的方法来建立GridBagConstraints
对象和受控制组件之间的关联1
gb.setConstraints(c,gbc);//设置c组件受gbc对象控制
- 添加组件,与采用普通布局管理器添加组件的方法完全一样:
1
container.add(c);
如果需要向一个容器中添加多个GUI
组件,则需要多次重复步骤2~4。由于GridBagConstraints
对象可以多次重用,所以实际上只需要创建一个GridBagConstraints
对象,每次添加GUI
组件之前先改变GridBagConstraints
对象的属性即可。
从上面介绍中可以看出,使用GridBagLayout
布局管理器的关键在于GridBagConstraints
,它才是精确控制每个GUI
组件的核心类,该类具有如下几个属性。
gridx
,gridy
:- 设置受该对象控制的
GUI
组件左上角所在网格的横向索引、纵向索引(GridLayout
左上角网格的索引为0、0)。这两个值还可以是GridBagConstraints
.RELATIVE
(默认值),它表明当前组件紧跟在上一个组件之后。
- 设置受该对象控制的
gridheight
,gridwidth
:- 设置受该对象控制的
GUI
组件横向、纵向跨越多少个网格,两个属性值的默认值都是1。 - 如果设置这两个属性值为:
GridBagConstraints.REMANDER
,这表明受该对象控制的GUI
组件是横向、纵向最后一个组件; - 如果设置这两个属性值为:
GridBagConstraints.RELATIVE
,这表明受该对象控制的GUI
组件是横向、纵向倒数第二个组件。
- 设置受该对象控制的
fill
:- 设置受该对象控制的
GUI
组件如何占据空白区域。该属性的取值如下 GridBagConstraints.NONE
:GUI
组件不扩大。GridBagConstraints.HORIZONTAL
:GUI
组件水平扩大以占据空白区域GridBagConstraints.VERTICAL
:GUI
组件垂直扩大以占据空白区域。GridBagConstraints.BOTH
:GUI
组件水平、垂直同时扩大以占据空白区域
- 设置受该对象控制的
ipadx
、ipady
:设置受该对象控制的GUI
组件横向、纵向内部填充的大小,即在该组件最小尺寸的基础上还需要增大多少。如果设置了这两个属性,则组件横向大小为最小宽度再加ipade*2
像素,纵向大小为最小高度再加ipad*2
像素。insets
:设置受该对象控制的GUI
组件的外部填充的大小,即该组件边界和显示区域边界之间的距离。anchor
:设置受该对象控制的GUI
组件在其显示区域中的定位方式。定位方式如下GridBagConstraints.CENTER
(中间)GridBagConstraints.NORTH
(上中)GridBagConstraints.NORTHWEST
(左上角)GridBagConstraints.NORTHEAST
(右上角)GridBagConstraints.SOUTH
(下中)GridBagConstraints.SOUTHEAST
(右下角)GridBagConstraints.SOUTHWEST
(左下角)GridBagConstraints.EAST
(右中)GridBagConstraints.WEST
(左中)
weight
、weighty
:设置受该对象控制的GUI
组件占据多余空间的水平、垂直增加比例(也叫权重,即weight
的直译),这两个属性的默认值是0,即该组件不占据多余空间。假设某个容器的水平线上包括三个GUI
组件,它们的水平增加比例分别是1、2、3,但容器宽度增加60像素时,则第一个组件宽度增加10像素,第二个组件宽度增加20像素,第三个组件宽度增加30像素。如果其增加比例为0,则表示不会增加。
设置某个组件随容器的增大而增大
如果希望某个组件的大小随容器的増大而増大,则必须同时设置控制该组件GridBagConstraints
对象的fill
属性和weight
、weighty
属性。
程序示例
下面的例子程序示范了如何使用GridBagLayout
布局管理器来管理窗口中的10个按钮:
1 | import java.awt.*; |
运行上面程序,会看到如图11.12所示的窗口。
从图11.12中可以看出,虽然设置了按钮4、按钮5横向上不会扩大,但因为按钮4、按钮5的宽度会受上一行4个按钮的影响,所以它们实际上依然会变大;同理,虽然设置了按钮8、按钮9纵向上不会扩大,但因为受按钮7的影响,所以按钮9纵向上依然会变大(但按钮8不会变高)。
推荐使用init方法完成界面的初始化工作
上面程序把需要重复访问的AWT
组件设置成成员变量,然后使用init()
方法来完成界面的初始化工作,这种做法比前面那种在main
方法里把AWT
组件定义成局部变量的方式更好。