11.6复杂的布局管理
之前用过边框布局和流布局和网格布局只有这些还不够
自从java1.0开始,AWT就含有网格包布局,这种布局将组件按行和列排列。行和列的大小可以灵活改变,而且组件可以跨多行多列
11.6.1 网格包布局
网格包布局时所有布局管理器之母,可以将网格包布局看成是没有任何限制的网格布局,在网格包布局中,行和列的大小可以改变
为了向网格包管理器描述这个布局,需要完成以下过程:
- 创建一个GridBagLayout类型的对象,不需要指定底层的行数和列数。实际上,布局管理器会根据后面所给的信息猜测行数和列数。
- 将这个GridBagLayout对象设置为组建的布局管理器。
- 对于每个组件,创建一个GridBagConstraints类型的对象。设置GridBagConstraints对象的字段来指定组件在网格包中如何布局
- 最后,通过下面的调用为各个组件增加约束
add(component,constraints);
11.6.1.1 gridx、gridy、gridwidth和gridheight 参数
gridx、gridy、gridwidth、gridheight约束定义了组件在网格中的位置。
gridx和gridy值制定了所添加组件左上角的行和列的位置,
gridwidth和gridheight值确定组件占据的行数和列数,网格的坐标从0开始,具体地,gridx=0和gridy=0指示左上角。
例如:
文本区的gridx=2,gridy=0,这是文本区起始于0行2列(即第三列),它的giridwidth=1,gridheight=4,因为它占据了4行1列。
11.6.1.2增量字段
总是需要为网格包布局中的每个区域设置增量字段(widthx和widthy),如果将增量字段设置为0,那么这个区域的在该方向上永远为初始大小,不会扩大或收缩。
如果将所有区域增量都设置为0,容器就会挤在所分配的区域的中间,不会拉伸来增添空间。
如果想让一行或者一列保持大小不变,就需要将其中的所有组件的增量字段设置为0
11.6.1.3 fill和anchor参数
如果不希望组件拉伸至填满整个区域,就需要设置fill约束,这个参数有4个可能的取值:GridBagConstraints.NONE、GridBagConstraints.HORIZONTAL(水平),GridBagConstraint.VERTICAL(垂直)、GridBagConstrant.BOTH
如果组件没有填充至整个区域,就需要设置anchor字段指定它在这个区域中的位置,有效值为,GridBagConstraints.CENTER(默认值)、GridBagConstraints.NORTH、GridBagCOnstraints.NOTtHEAST
、GridBagConstraints.EAST等
11.6.1.4 填充
可以通过设置GridBagConstraints的insets字段在组件周围增加额外的空白区域,通过设置Insets对象的left,top,right,和bottom值只当组件周围的空间大小,这被称作外部填充。
ipadx和ipady值可以制定内部填充,这两个值会加到组件的最小宽度和最小高度上,这样就可以保证组件不会收缩至其最小尺寸以下。
11.6.1.5 指定gridx和gridy,gridwidth,gridheight参数的备用方法
AWT建议不要将gridx和gridy设置为绝对位置,而应该将它们设置为常量,然后按照标准的顺序将组件添加到网格包布局中,即首先在第一行从左向右增加,然后再转到新的一行,以此类推。
11.6.1. 6 网格包布局技巧
- 在纸上画出组件布局草图
- 找出一个网格,小组件分别包含在一个单元格内,更大的祖籍安徽跨越多个单元格。
- 用0,1,2,3…标识网格的行和列。现在可以得出gridx,gridy,gridwidth,gridheight的值
- 对于每个组件需要考虑以下问题是否需要水平或垂直填充它所在的单元格?希望如何看其?这些就是fill和anchor参数的设置
- 将所有的增量设置为100,不过,如果希望某行某列始终保持默认的大小,就将这行或者列中的所有组件的weightx和weighty设置为0。
- 编写代码。仔细地检查GridBagConstraints的设置,错误的约束可能会破坏整个布局。
- 编译并运行,你会看到一个满意的布局
11.6.1.7 使用帮助类管理网格包约束
网格包布局最乏味的方面就是要编写代码设置约束。为此,大多数程序员会编写一个帮助类。
- 名字简短:GBC而不是GridBagConstraints。
- 它扩展了GridBagConstraints,因此常量可以使用更短的名字,如GBC.EAST.
- 当添加组件时,使用GBC对象,如:
add(component,new GBC(1,2))
;- 有两个构造器可以用来设置最常用的参数:gridx,gridy,gridwidth,gridheight。
add(component,new GBC(1,2,1,4);)
- 对于以x/y值对出现的字段,提供了便捷的设置方法:
add(component,new GBC(1,2).setWeight(100,100));
- 设置器方法将返回this,所以可以串链这些方法的调用
add(component,new GBC(1,2).setAnchor(GBC.))
- setInsets方法将构造Insets对象,要想获取1个像素的insets,可以调用:
add(component,new GBC(1,2).setAnchor(GBC.EAST).setInsets(1));
add(faceLable,new GBC(0,0).setAnchor(GBC.EAST));
add(face,new GBC(1,0).setFill(GBC.HORIZONTAL).setWeight(100,0).setInsets(1))
add(sizeLable,new GBC(0,1).setAnchor(GBC.EAST));
add(size,new GBC(1,1).setFill(GBC.HORIZONTAL).setWeight(100,0).setInsets(1));
add(bold,new GBC(0,2,2,1).setAnchor(GBC.CENTER).setWeight(100,100));
add(italic,new GBC(0,3,2,1).setAnchor(GBC.CENTER).setWeight(100,100));
add(sample,new GBC(2,0,1,4).setFill(GBC.BOTH).setWeigh(100,100))
常用属性:
- int gridx,gridy
指定的单元格的起始行和列,默认值为0; - int gridwidth,gridheight
指定单元格的行和列范围,默认值为1 - double weightx,weighty
指定单元格扩大的容量。默认值为0 - int anchor
表示组件在单元格内的对齐方式 - int fill
指定组件在单元格内的填充行为,取值为NONE、BOTH、HORIZONTAL、VERTICAL。默认值为NONE。 - int ipadx,ipady
指定组件周围的”内部“填充。默认值为0. - Insets insets
指定组件边框周围的”外部“填充,默认不填充