转自 http://www.boxcode.cn/html/JAVA/J2SE/2009/0812/616.html
无序网格布局管理器
无序网格布局(GridBagLayou)是最灵活,同时也是最复杂的布局管理器,其布局机制多少有些复杂并且令人感到棘手。无序网格布局可以使组件扩充到多行多列,而无须所有组件都具有同样的大小。这可以通过设置一个与容器关联的单元的矩形网格并把每个组件放在一个或多个单元内这个办法来实现。这些单元形成了组件的显示区域。
GridBagLayout构造函数
无序网格布局使用两个类来排列组件:java.awt.GridBagLayout和java.awt.GridBagConstraints。而构造函数:
public GridBagLayout()
创建一个新的无序网格布局管理器,再用setLayout(GridBagLayout gridbag)方法将其设置成一个容器。
无序网格约束
无序网格布局管理器放置组件的模式依赖于下面这个方法施加在组件上的约束条件:
public void GridBagConstraints(Component comp, GridBagConstraints constraint);
这里的约束条件由GridBagConstraints类中的一组公共字段表示。这些字段可以被赋以特定的值,或者被赋以该类中已有的一组值。下一节中将描述GridBagConstraints类中的这些公共字段。
gridx和gridy
放置一个组件时需要两个坐标(x, y),例如,确定位于网格单元中某个按钮B1的位置时就需要有坐标。然后,就可以把该按钮的某一角,最好是左上角,放在这个特定的坐标位置(x, y)了。
字段gridx和gridy分别表示x坐标和y坐标。gridx表示组件显示区域左侧单元的个数,其中,最左边单元的gridx=0。gridy表示组件显示区域上方单元的个数,其中,最上面单元的gridy=0。上图的(x, y)是(2, 2)。
gridx和gridy也可以取GridBagConstraints类中所提供的常数RELATIVE。该常数规定,将新加入的组件按照特定的坐标方向放在上一个加入的组件的下一个位置。缺省地,gridx和gridy都取数值RELATIVE。
gridwidth和gridheight
当按照(x, y)坐标放置了组件子后,就可以确定组件的大小了。组件的大小可以用gridwidth和gridheight表示,他们分别表示沿行和列方向所扩充的单元数。在前面的图中,gridwidth和gridheight的值分别是3和2。
也可以用REMAINDER作为gridwidth和gridheight的取值,分别表示该组件扩充到最后一行或最后一列。gridwidth和gridheight可取的另一个常数是RELATIVE,它表示,按照特定的行列值将该组件放在上一个加入的组件的后一个位置。缺省地,gridwidth和gridheight的值均为1。
weightx和weighty
当改变容器大小时,字段weightx和weighty用于分别指定怎样分配多余的水平空间和垂直空间。为了取得所需的用户界面效果,这两个值起着关键的作用。它们可以设置为界于0.0和1.0之间任何双精度类型的值。如果组件的某个权数取了较大的值,那么该组件就会占据该方向上额外的空间。权数为零的组件不占据额外的空间。缺省地,weightx和weighty都设置为0。
fill
当组件的尺寸比其显示区域小时,字段fill就可以发挥作用了,它指定了一个组件在其显示区域内是如何分布的。可以将NONE、HORIZONTAL、VERTICAL以及BOTH中的任何一个值赋给字段fill。当把fll设为NONE时,它表示组件将不会填充显示区域。第二个常数HORIZONTAL使得组件的宽度能够达到仅沿水平方向填满显示区域。常数VERTICAL使得组件的高度能够达到仅沿垂直方向填满显示区域。最后一个常数BOTH使得组件沿水平方向和垂直方向完全填满显示区域。缺省地,fill的值设置为0。
anchor
字段anchor指定当组件小于显示区域时停靠的位置。停靠位置按照地理方位确定。该字段可能的取值有NORTH、NORTHEAST、EAST、SOUTHEAST、SOUTH、SOUTHWEST、WEST、NORTHWEST以及CENTER。缺省地,组件位于显示区域的中心。
insets
insets是AWT中提供的类Insets的类型字段。这个字段用于指定组件的外部填充区域的大小(external padding)——界于组件与其显示区域的边界之间的空间。通过利用Insets类的构造函数Insets(int top, int left, int bottom, int right)创建Insets对象,可以设置这个字段的值。参数top、left、bottom、right分别是四个方向上相对于显示区域边界留出的空间。缺省地,insets字段已经设置成对象Insets(0, 0, 0, 0),也就是没有外部填充区域。
ipadx和ipady
字段ipadx和ipady指定组件的内部填充区域(internal padding)——加在组件现有宽度和高度上的额外宽度和高度值。扩充的部分对组件的宽度和高度同时起作用。因此,额外的宽度和高度分别是ipadx和ipady的两倍。缺省情况下,组件没有内部填充区域。
GridBagLayout代码示例
下面代码清单演示了怎样用无序网格布局在容器内放置组件。程序使用了数值坐标,而不是常数RELATIVE和REMAINDER。