GridBagLayout布局管理器是功能最强大,也是最复杂的布局管理器。与GridLayout管理器相比其特点是,一个组件可以跨越多个网格,而且各个组件的大小可以分别设置。
使用GridBagLayout管理需要与GridBagConstraints类的对象一起。该对象与特定的组件关联,控制其大小以及跨越性。使用GridBagLayout的过程大概如下:
Frame f = new Frame("Test Window");
GridBagLayout gbl = new GridBagLayout();
Component comp = new Button();
f.setLayout(gbl);
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.BOTH;
gbl.setConstraints(comp, gbc);
f.add(comp);
每增加一个组件前,用一个GridBagConstraints对象保存该组件的一些显示的要求。
因此,使用好GridBagLayout管理器的关键在于GridBagConstraints对象的操作。
GridBagConstraints类成员主要是一些属性,除了两个构造方法以及一个clone()方法外没有创建或重写其他方法。所以对它的学习主要就是要了解其各个成员属性的意义和作用,这些成员都是public权限的,因此直接修改即可。
GridBagConstraints类的非静态成员变量列举如下:
int anchor
int fill //规定组件大小比为其提供的空间小时的行为
int gridheight
int gridwidth //规定组件水平/垂直方向所占的网格数
int gridx
int gridy //规定组件放置的水平/垂直坐标位置
Insets insets //规定组件与其周围组件的空隙
int ipadx
int ipady //规定组件的内部填充
double weightx
double weighty //规定在容器的宽度或高度大于所有组件宽度或高度之和时如何分配额外的空间
下面一一进行详细解释,实际的效果可以通过小程序进行验证。
anchor和fill都是在为组建设置的空间较大时的设置(比如设置组件跨越多个网格时),两者的区别在于:anchor规定的是组建存放位置而fill规定的是组建的大小是否在横向和纵向按比例增大。
anchor的值可以取三类:方向相对(orientationrelative)、基线相对(baseline relative)和绝对定位(absolute),默认情况下为绝对定位方式的CENTER,即放在中心。
方向相对(orientation relative)方式会根据组件盛放容器的方向行为,有如下几个合法值:
PAGE_START
,PAGE_END
,LINE_START
,LINE_END
,FIRST_LINE_START
,FIRST_LINE_END
, LAST_LINE_START
,LAST_LINE_END
。
PAGE_START
指将组建放在区域第一行的中间,与BorderLayout的North相似;
LINE_START
指将组建放在区域第一列的中间,与BorderLayout的West相似;
FIRST_LINE_START
指将组建放在区域第一行的开始;
其他的依此类推。
绝对定位(absolute)方法将区域分为九个区域,分别用东、西、南、北等八个方向和中心(CENTER)标示。
将区域按如下分为九个区域
|
|
|
|
|
|
|
|
|
则有如下对应关系:
1:NORTHWEST
和FIRST_LINE_START
2:NORTH
和PAGE_START
3:NORTH_EAST
和LAST_LINE_START
4:WEST
和LINE_START
5:CENTER
6:EAST
和LINE_END
7:SOUTHWEST
和LAST_LINE_START
8:SOUTH
和PAGE_END
9:SOUTHEAST
和LAST_LINE_END
基线相对(baselinerelative)方式指放置组件时以基线为根据,可选的值有BASELINE_LEADING
,BASELINE_TRAILING
,ABOVE_BASELINE
,ABOVE_BASELINE_LEADING
,ABOVE_BASELINE_TRAILING
,BELOW_BASELINE
,BELOW_BASELINE_LEADING
,BELOW_BASELINE_TRAILING
。
BASELINE_LEADING
:水平上组件应放置在第一条基线上,对于方向为从左到右的组件,就是放在最左边,垂直方向上应该与主导行的基线一致,如果没有在垂直方向就放在中间。
BASELINE_TRAILING
:同上,但水平方向上放在最后一条基线上。
ABOVE_BASELINE
:水平方向上会放置在中心,垂直方向上,组件应放到使得其底部与开始行相接触,如果开始行没有基线,就放在中心。
ABOVE_BASELINE_LEADING
:同上,但水平上被放在第一条基线上,即最左边。
ABOVE_BASELINE_TRAILING
:同上,但水平上被放在第一条基线上,即最右边。
BELOW_BASELINE
:与
ABOVE_BASELINE的区别在于垂直方向上组件应放到使得其顶部与开始行相接触,如果开始行没有基线,就放在中心。其他几个BELOW开头的则可以类比。
fill
属性标示组件区域大小大于组件大小时,是否扩大组件的大小。可以取如下四个值,默认为NONE,即不改变大小。
NONE:
不改变其大小
HORIZONTAL:
增加组件的宽度以覆盖区域但不改变高度
VERTICAL:
增加组件的高度以覆盖区域但不改变其宽度
BOTH:
同时增加组件的宽度和高度。
gridheight、gridwidth属性设置组件在水平和垂直方向上占的网格的数目。应该是一个非负值,其初始值为1;另外可以使用两个常量:
REMAINDER
:表示为组件分配从gridx(gridy)以后一行(列)所有的网格
RELATIVE
:表示为组件分配从gridx(gridy)到改行(列)倒数第二个网格
gridx
、gridy属性设置组件显示区域第一个网格的坐标,第一个放置的组件,对应值会被设置为0、0。另外设置的值不应超出当前已有的最大网格数+1,即不能出现某一行(或列)没有一个组件,而其下一行(或列)有组件,那该行(或列)不会被显示。
Insets属性指定容器必须在组件各个边缘留出的空间,是Inset类的一个对象,初始化的方法为new Insets(int top,int left,int bottom,int right);依此标示上、左、下、右四个方向的空隙的宽度。
ipadx、ipady属性设置组件的内部填充,即在组建的最小大小上再加若干个像素。
weighx、weighty规定如何分布额外的空间,管理器计将一列的所有组件中最大的weightx(weighty)设置为该列(行)的weightx(weighty)
。如果得到的布局在水平(垂直)方向上比需要填充的区域小,则系统会将额外的空间按照其权重比例分布到每一列(行)。权重为零的列(行)不会得到额外的空间。这里取的是一列(或行)的组件该属性的最大值,因此会出现有些组件设置weightx(或weighty)为0拉伸界面时组件大小仍会改变的情况。
如果所有的权重都为零,则所有的额外空间都将出现在单元格的网格之间和左右边缘之间。
此字段的默认值为 0
。weightx(weighty)
应为非负值。