java 布局管理器 gridbaglayout使用

来源:互联网 发布:淘宝彩印 编辑:程序博客网 时间:2024/04/28 08:25

前言
使用Swing进行Java的GUI编程,其中一个难点就是页面布局。弄好了页面布局,就像是跨越了一个初级的里程碑。我主要是从事B/S的系统开发,基于新的应用需要,现在才来补一回Swing,一些简单的布局不想多说,只是看到一个比较实用,而且比起那些简单的布局复杂一点的GridBagLayout来说一下。作为自己的笔记,也希望当作和想学习此局布的朋友的谈资。

指定约束(constrains)
        比起其它的布局,GridBagLayout多了一个约束的概念。可以这样理解,由于GridBagLayout对于内部的单元格的定制性很强,所以,此布局需要设置很多属性,而这些属性就被抽象成为GridBagConstraints对象。由此,只是需要搞清楚GridBagConstraints控制哪些属性,和GridBagConstraints如何作用于布局内的单元格。那么,这个布局可以说是差不多了。

        作为补允,贴出一段典型代码: 

  1. JPanel pane = new JPanel(new GridBagLayout());   
  2.   
  3. GridBagConstraints c = new GridBagConstraints();    
  4.   
  5. //对于每一个需要添加到容器中的组件进行如下操作:   
  6.   
  7. //...创建需要的组件...   
  8.   
  9. //...设置GridBagConstraints实例的实例变量...   
  10.   
  11. pane.add(theComponent, c);   
  12.   

        从上面的代码可见,其实同一个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的组件相关,而每一个多列的组件的份量,会以某一方式将分量分配到组件所在的各列中。行的情况与列类似。多出的空间一般会被放置在最右边的列和最下边的行。



设置网袋布局参数时,注意:


如果只有三个元素,并且坐标为 <0.0> ,<0,1>, <0,2>时,设置weightx时候,只能设置为1,1,1,因为一共三行。

如果想设置一个占两行,一个占一行,一个占三行,需要改变坐标,以6行来定坐标,可设置为<0,0> weightx=3和<0,3>,weightx=2以及<0,5>weightx=1




原创粉丝点击