GridBagLayout
GridBagLayout用法
前言
使用Swing进行Java的GUI编程,其中一个难点就是页面布局。弄好了页面布局,就像是跨越了一个初级的里程碑。我主要是从事B/S的系统开发,基于新的应用需要,现在才来补一回Swing,一些简单的布局不想多说,只是看到一个比较实用,而且比起那些简单的布局复杂一点的GridBagLayout来说一下。作为自己的笔记,也希望当作和想学习此局布的朋友的谈资。
指定约束(constrains)
比起其它的布局,GridBagLayout多了一个约束的概念。可以这样理解,由于GridBagLayout对于内部的单元格的定制性很强,所以,此布局需要设置很多属性,而这些属性就被抽象成为GridBagConstraints对象。由此,只是需要搞清楚GridBagConstraints控制哪些属性,和GridBagConstraints如何作用于布局内的单元格。那么,这个布局可以说是差不多了。
作为补允,贴出一段典型代码:
JPanel pane = new JPanel(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
//对于每一个需要添加到容器中的组件进行如下操作:
//...创建需要的组件...
//...设置GridBagConstraints实例的实例变量...
pane.add(theComponent, c);
从上面的代码可见,其实同一个GridBagConstrains实例(这里是实例变量c),可以同时作用于多个布局内的组件,有的资料上建议不要使用单个约束实例,因为担心忘记将某些值设回来而出现一个很难查觉的bug。这是有道理的,但对于熟练一些的朋友,使用单个约束实例也未尝不可。
GridBagConstrains的实例变量
前面提过GridBagLayout通过属性控制布局内的每个单元格,而这些属性就是GridBagConstrains的实例变量。下面详解每一个实例变量的含义(以下是基于从左到右组织组件方向):
gridx,gridy
指定组件左上角的行和列,最左边的列是gridx=0,最上边的行是gridy=0。实际上就是从(0, 0)开始的坐标。GridBagConstrains.RELATIVE,是这两个实例变量的默认值,它表示的意思是,将正要添加的组件,放在上一个被添加的组件的右边或者下边其中之一(实际就是紧贴上一组件)。有资料建议,对于每一个组件,都重新设置gridx和gridy,而不是使用默认的GridBagConstrains.RELATIVE,我十分同意这种做法,因为得出的结果与预期的偏差减少。
gridwidth,gridheight
分别指定组件显示区域的行数和列数。默认是1。GridBagConstrains.REMAINDER指组件是此行(gridwidth为此值时),此列(gridheight为此值时)的最后一个组件,就是包含此行/列中所有剩下的单元格。GridBagConstrains.RELATIVE表示当前的组件占用上一个被添加的组件的下一行/列。对于这两个属性,也有和前两个属性相同的使用建议,使结果减少偏差。
注意:只有当组件是最左边的组件或者组件被指定正值的gridx和gridy时,才能使组件跨越多行。
fill
当组件所在的单元格比组件显示所需的区域大时,fill实例变量控制组件是否/怎样重设组件的大小。有效的GridBagConstrains常量有四个,分别是:NONE – 默认值,表示水平和垂直都不扩展。HORIZONTAL – 表示组件水平填满它所在的单元格,垂直方向不扩展。VERTICAL – 表示组件垂直方法填满所在的单元格,水平方向不扩展。BOTH – 表示水平/垂直方向都填满所在的单元格。
ipadx,ipady
指定组件的内容填充空间。默认值是0。组件的宽的最小值将会是,组件的宽的最小值加上2*ipadx个像数点,乘以2是因为垂直方向上有两条边。组件的长也是同样的计算方法。
insets
指定组件的外填充空间——组件和显示单元格边缘的最小空间。此值通过Inset对象指定,默认是没有外填充空间。
anchor
锚(anchor)用于当组件比它所在的显示单元格小的时候,决定组件在单元格内放置的位置。有效的GridBagConstrains常量是:CENTER (默认),PAGE_START,PAGE_END,LINE_START,LINE_END,FIRST_LINE_START,FIRST_LINE_END,LAST_LINE_END和LAST_LINE_START。
以下是一个页面以组件方向从左向右组件的示图:
-------------------------------------------------
|FIRST_LINE_START PAGE_START FIRST_LINE_END|
| |
| |
|LINE_START CENTER LINE_END|
| |
| |
|LAST_LINE_START PAGE_END LAST_LINE_END|
-------------------------------------------------
weightx,weighty
指定份量(weight),可以显著地影响GridBagLayout所管理的组件的外观。份量用来决定在行(weighty)与列(weighty)它们各自之间如何分配空间。这在改变面板大小时十分重要。
除非你为weightx和weighty指定最少一个非0值,否则,所有的组件会在聚在它们所在的容器的中间。这是因为当份量的值是0.0(默认)时,会将额外的空间放到单元格之间和容器的边缘。
一般地,份量的值被指定为0.0到1.0,中间的数字按需要进行设置。更大的数字表示组件的行/列应获得更多的空间。对于每一列,份量与该列中被指定最大weightx的组件相关,而每一个多列的组件的份量,会以某一方式将分量分配到组件所在的各列中。行的情况与列类似。多出的空间一般会被放置在最右边的列和最下边的行。