您的位置:首页 > 编程语言 > Java开发

Java布局管理器(四)之GridBagLayout(网格包布局管理)

2013-07-13 16:46 337 查看
GridBagLayout(网格包布局管理)
GridLayout布局管理器中要求放入网格中的组件的大小与网格大小一致,而且放入的顺序是相对固定的,即不能使前面的网格的内容为空,各组件样式的尺寸大小要保持一致,这样的严格要求使各组件大小一致匀称,在容器中排列整齐划一,所设计出来的界面也非常的规整。但是这样的设计风格对于某些需求灵活的应用界面设计来说相对过于苛刻。所以为让网格布局管理器的适应能力更强,就产生了另外一种GridBagLayout布局管理器,在这种管理器中,一格组件可以占多格,也可以占一格或者是一格之中的一个部分,并且组件的布局和加入的顺序是相对自由多变的,每个组件可以有不同的尺寸,这样的特性使得每一个组件动态地维持一个单元网格。而实际网格的大小是依据位于GridBagLayout以及其助手类GridBagConstraints中的组件数目而定的。每个由 GridBagLayout 管理的组件都与 GridBagConstraints 的实例相关联,因此Constraints 对象可用以指定组件在网格中的显示区域以及组件在其显示区域中的放置方式。

综合上面的设计要求GridBagLayout是相对复杂复杂与灵活的一个布局管理器。这种管理器是在GridLayout的基础之上发展而来的,尽管他看起来像是GridLayout的子类,然而它却是完全不同的一个类。

网格快布局管理器的使用方法:

网格的总体方向取决于容器的ComponentOrientation属性。对于水平的从左到右的方向,网格坐标 (0,0)位于容器的左上角,其中
X向右递增,Y
向下递增。对于3*3的网格从左到右、从上到下的坐标依次是(0, 0)(1,0)(2, 0) (0, 1)(1, 1)(2, 1) (0, 2)(1, 2)(2, 2)。对于水平的从右到左的方向,网格坐标
(0,0) 位于容器的右上角,其中 X 向左递增,Y 向下递增。在这种情形下网格的坐标刚好也是反过来的。下面是这个属性值的常量:

ComponentOrientation.LEFT_TO_RIGHT
各项从左到右布局,各行从上到下

ComponentOrientation.RIGHT_TO_LEFT
各项从右到左布局,各行从上到下

ComponentOrientation.UNKNOW
表示尚未设置组件的方向。

使用GridBagLayout的最大屏幕容量为512行x512列。这是通过布局管理器中受保护的MAXGRIDSIZE常量来指定的。

向容器之中添加组件大部分工作可以通过助手类GridBagConstraints中的方法addComponent()来完成的,他为添加到容器中的组件创建了约束集合。也就是说要使用GidBagLayout要先定义一个GridBagConstraints对象。上面还谈到GridBagLayout布局器中的组件的尺寸和布局以及加入的顺序是相对动态动态的。为达到这样的效果,和为了有效使用网格包布局,必须自定义与组件相关联的一个或多个GridBagConstraints
对象并且须设置GridBagConstraints 对象的属性。下面举个例子说明之:(在网格坐标(0, 0)处添加按钮组件,该组件占两个单元格(两行一列),组件完全填满区域居中)

fGridBagLayout gbl = new GridBagLayout();
GridBagConstraints gbc = new GridBagConstraints();
JFrame myframe=new JFrame();
myframe.setLayout(gbl);
gbc.gridx=0;
gbc.gridy=0;
c.gridheight=2;
c.gridwidth=1;
GridBagConstraints.anchor = GridBagConstraints.CENTER;
GridBagConstraints.fill = GridBagConstraints.BOTH;
Button button = new Button(“name”);
gbl.setConstraints(button, gbc);
myframe.add(button);

或者

1. JFrame frame = new JFrame("MyFrame");
2. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
3. frame.setLayout(new GridBagLayout());
4. JButton button;
5. button = new JButton("button");
6. addComponent(frame, button, 0, 0, 1,2, GridBagConstraints.CENTER, GridBagConstraints.BOTH)

接下来我们就来了解该对象的五个属性。

(1)GridBagConstraints.gridx、GridBagConstraints.gridy

指定包含组件显示区域的前导角的单元,在此显示区域中,位于网格原点的单元地址是gridx = 0、gridy = 0。对于水平的从左到右的布局,组件的前导角是其左上角。对于水平的从右到左的布局,组件的前导角是其右上角。使用GridBagConstraints.RELATIVE(默认值)指定将组件置于刚刚添加到容器中的组件的后面(沿gridx 的 X 轴或gridy的 Y 轴)。

(2)GridBagConstraints.gridwidth、GridBagConstraints.gridheight

指定组件的显示区域中行(针对gridwidth)或列(针对gridheight)中的单元数,默认值为 1。

使用GridBagConstraints.REMAINDER指定组件的显示区域为从gridx到该行(针对gridwidth)中的最后一个单元,或者从gridy到该列(针对gridheight)中的最后一个单元。

使用GridBagConstraints.RELATIVE指定组件的显示区域为从gridx到其所在行(针对 gridwidth)的倒数第二个单元,或者从gridy到其所在列(针对gridheight)的倒数第二个单元。

(3)GridBagConstraints.fill 当组件的显示区域大于组件的所需大小时,用于确定是否(以及如何)调整组件。该属性值的取值常量为:

GridBagConstraints.NONE(默认值)、

GridBagConstraints.HORIZONTAL(加宽组件直到它足以在水平方向上填满其显示区域,但不更改其高度)、

GridBagConstraints.VERTICAL(加高组件直到它足以在垂直方向上填满其显示区域,但不更改其宽度)

GridBagConstraints.BOTH(使组件完全填满其显示区域)。

(4)GridBagConstraints.anchor 当组件小于其显示区域时,用于确定将组件置于何处(在显示区域中)。

可能的值有两种:相对和绝对。相对值的解释是相对于容器的ComponentOrientation属性,而绝对值则不然。个人觉得只使用绝对值就可以。有效值有:

绝对值

GridBagConstraints.NORTH

GridBagConstraints.SOUTH

GridBagConstraints.WEST

GridBagConstraints.EAST

GridBagConstraints.NORTHWEST

GridBagConstraints.NORTHEAST

GridBagConstraints.SOUTHWEST

GridBagConstraints.SOUTHEAST

GridBagConstraints.CENTER (the default)

相对值
GridBagConstraints.PAGE_START
GridBagConstraints.PAGE_END
GridBagConstraints.LINE_START
GridBagConstraints.LINE_END
GridBagConstraints.FIRST_LINE_START
GridBagConstraints.FIRST_LINE_END
GridBagConstraints.LAST_LINE_START
GridBagConstraints.LAST_LINE_END

(5)GridBagConstraints.weightx、GridBagConstraints.weighty 用于确定分布空间的方式,布局管理器计算每一行或者是每一列的最大权值,如果其结果小于组件实际占用的区域的大小,那么多出来的空间就会分配到每一行或列,对于每一行或列如果其权值是0,那么这一行或列将没有空间。所有的行 (weightx) 和列 (weighty) 中权值全部为零,所有组件都会聚集在其容器的中央。这是因为,当权重为零(默认值)时,GridBagLayout对象会将所有额外空间置于其单元网格和容器边缘之间。其中,weightx和weighty的设置需要根据具体情况来设置,假如我们需要将多个组件显示在一个容器的一角,除了要设置权重之外还要设置andhor的值指定那一角的方向。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: