
GridBagLayout 网格包布局管理器
网格包布局管理是最复杂和灵活的布局管理,在下面偶会作详细的介绍。
与网格布局管理器不同的是,网格包布局管理器允许容器中各个组件的大小各不相同,还允许组件跨越多个网格,也
允许组件之间相互部分重叠。
网格包布局理解为网格单元布局更合理,因为一个容器被划分为若干个网格单元,而每个组件放置在一个或多个网格
单元中。
要注意的是, 网格包布局不能指定一个容器的网格单元的大小其网格单元的划分是通过 weightx 和 weighty 参数来设置
的,但也不是直接指定其网格单元的大小。当把一个组件放置在网格单元中时,组件所占据的位置和大小是由一组与
他们相关联的约束来决定的。这些约束是由 GridBagConstraints 类型的对象来设置的,关于 GridBagConstraints 类型,
后面会做专门的介绍。
由上所述使用网格包布局的一般步骤为:
1、创建一个 GridBagLayout 网格包布局对象,并使其成为当前容器的布局管理器。
2、创建一个 GridBagConstraints 类型的约束对象,然后使用该对象设置各种约束条件,注意这里设置的约束条件
并没有针对某一组件,要使某一组件具有设置的约束,需要使用第 3 步骤的方法。
3 、然后使用 GridBagLayout 网格包布局中的 setConstraints(Component com, GridBagConstraints cons)方法将
GridBagConstraints 类型对象设置的约束添加到被设置的组件中,这样该组件就具有了 GridBagConstraints 设置
的约束。 其中 setConstraints()的第一个参数是将要添加的组件, 第二个参数是 GridBagConstraints 类型的约束对
象。
4、最后将设置了约束的组件添加到容器中。
使用网格包布局的第二种方法为:
1、使 GridBagLayout 布局成为当前容器的布局管理器,这里也可以不用创建 GridBagLayout 对象。
2、创建一个 GridBagConstraints 类型的约束对象,然后使用该对象设置约束条件。注意这里设置的约束条件并没
有针对某一组件,要使某一组件具有设置的约束,需要使用第 3 步骤的方法。
3、然后使用 add(Component com, Object cons) 方法将组件和约束同时添加进容器中, 这样添加进容器的组件就具有
了第 2 步的约束。注意其中的 add(Component com, Object cons); 第一个参数是将要添加的组件,第二个参数是要
添加的 GridBagConstraints 类型的约束对象。
GridBagConstraints 类型的约束参数:
double weightx 和 double weighty 参数 (默认值为 0)
这是两个非常重要的参数,该参数直接影响到怎样设置网格单元的大小,因此常握好该参数就可以对网格包布局应用
自如。
该参数对 x 方向和 y 方向指定一个加权值。这个加权值直接影响到网格单元的大小,比如 weightx 的值分别为 10,20,
30,则在容器的 x 方向也就是列的方向,按一定的比例 (比如 1:2:3 其具体算法请参看 java 文件 )分配三个网格单元,其
中加权值越大网格单元就越大,可以看出值的大小是没有关系的,加权值的作用是让容器以设定的值的比例在横向和
纵向分配网格,且在容器的大小改变时这个比例不改变。
如果 weightx 只设置了一个值, 而组件却不只一个以上, 则被设置了的这个组件的网格单元的大小为容器在 x 方向的大
小减去那两个组件的最小尺寸就是该组件的网格单元大小。默认情况下组件的最小尺寸是比较小的。
如果两个参数都为 0(默认值 ),则组件会被显示在容器的中央, 不管容器是放大还是缩小组件都只会显示在容器的中央。
由上所述,在使用网格包布局时首先应先使用 weightx 和 weighty 来划分网格单元 (不是直接划分 ,而是按一定比例来划
分),网格单元划分出来后,组件放置在网格单元中的位置和大小就由后面介绍的约束来决定。
一定要注意的是设置权值后要使当前的设置生效应使用 setConstraints()函数一次,如果连续设置多个同一方向的权值,
则只有最后一次设置的权值有效,比如出现同时两行都设置了 x 方向的权值,则以最后一行设置的 x 方向的权值为标
准来划分网格单元。
因此在使用 GridBagLayout 网格包布局管理器之前应先设置好网格单元, 即要把容器划分为几行几列的网格单元, 每行
每列在容器中的宽度和高度比例,每个组件应在哪个网格单元。
int fill 参数 (默认值为 GridBagConstraints.NONE)
fill 参数指定组件填充网格的方式,当某组件的网格单元大于组件的大小时被使用,一般情况下组件是以最小的方式
被显示的,如果不使用 fill 参数,则有可能组件占不完整个网格单元,也就是说组件占据的空间比划分的网格单元小,
这时组件将显示在网格单元中的某个位置 (具体在什么位置由网格包中的参数来设置 )。其可取的值如下:
GridBagConstraints.NONE 默认值,不改变组件的大小。
GridBagConstraints.HORIZONTAL 使组件足够大, 以填充其网格单元的水平方向, 但不改变高度, 其值等于整数 2。
GridBagConstraints.VERTICAL 使组件足够大,以填充其网格单元的垂直方向,但不改变宽度,其值等于整数 3。
GridBagConstraints.BOTH 使组件足够大,以填充其整个网格单元,其值等于整数 1。
int gridwidth 和int gridheight 参数 (默认值为 1)
该参数指定组件占据多少个网格单元, gridwidth 指定组件占据多少个网格单元的宽度, gridheight 指定组件占据多