同GridlLayout --样,GridBagLayout也在一个网格中定位构件。但与GridLayout不同的是,它不显式规定一个网格中的行数和列数,GridBagLayout根据它布置的构件的约束条件确定行数和列数。而且,GridBagLayout 允许构件跨越不止一个网格单元----构件可以部分重叠,这在后面很快就可以看到。
GridBagLayout几乎能够处理任何的布置要求,但同时它也是 AWT中最复杂和使用起来最困难的类之一。
- 首先,讨论与GridBagLayout 布置的构件相关的GridBagConstraints,它通常是布局管理器中最容易使人混淆的一方面。
- 其次,提供一个CD上的 applet程序,它允许你修改与一个图像按钮网格相关的CridBagConstraints,相信你会发现这个applet程序在理解GridBagLayout 如何工作方面是必不可少的。
- 第三,描述了GridBagL ayout的一个普遍任务——布置用户输入表单。
1、GridBagLayout和GridBagConstraints
GridBagLayout扩展了LayoutManager2接口。GridBagConstraints 的一个实例规定和构件相关的约束条件。
- 当向一个具有GridBagLayout的容器添加构件时,GridBagConstraints 的一个实例被传递给容器的 add (Component,Object)方法。
- 另一种途径是,GridBagLayout 提供个setConstraints方法,将向容器添加构件和设置约束条件分离开。
GridBagLayout类提供了多种实例变量和常量控制与一个构件相关的参数。GridBagLayout布置的构件可以跨越多个网格单元,并可以完全或部分地填充它们的网格单元。网格单元也可以在它们包含的构件的首选尺寸之外消耗一些额外的空间。
实例变量 | 默认值 | 有效值 | 规定 |
---|---|---|---|
anchor | CENTER | CENTER | 在网格单元的什么地方固定一个构件 |
EAST | |||
NORTH | |||
NORTHEAST | |||
NORTHWEST | |||
SOUTH | |||
SOUTHEAST | |||
SOUTHWEST | |||
WEST | |||
fill | NONE | BOTH | 构件填充它所占据的网格单元的方式 |
HORIZONTEAL | |||
VERTICAL | |||
NONE | |||
gridx | RELAT1VE | RELATTVE | 构件的左上角网格单元的位置 |
gridy | 或在网格中表示一个x,y位置的整数值 | ||
gridwidth | 1 | RELATTVE | 在水平和垂直方向分配给构件的网格单元数量,根据加属性构件决定是否填充它的网格单 |
gridheight | 1 | REMAINDER | |
或在网格单元中元表示宽度和高度的整数值 | |||
ipadx | 0 | 表示像素个数的整数值 | 内部填充增加构件的首选尺寸,负值将减少构件的首选尺寸 |
ipady | 0 | ||
insets | (0,0,0,0) | 一-个Insets对象 | 外部填充构件的边缘和网格边缘之间的部分,负值导致构件扩展它的网格单元的外边 |
weightx | 0.0 | 相对于同行或同列的其他构件表示一个构件的网格单元给定重量的 double值 | 构件的网格单元怎样消耗额外的空间,构件根据f属性决定是否填充它的网格单元,它必须是正值 |
weighty | 0.0 | ||
2、网格单元和显示区
既然构件可以在垂直和水平方向被布置到不止一个网格单元中——通过规定gridwidth和gridheight 约束条件——我们将构件的网格单元占据的区域称为显示区(display area)。
3、与构件比较的显示区
精通使用GridBagLayout 的最大障碍之一是理解构件的显示区和构件自身的差别。和构件相关的一些约束条件应用于构件的显示区域,另一些约束条件应用于构件自身,还有一些约束条件应用于两者。
- anchor约束条件规定了一个构件在它的显示区中的固定位置。
- fill约束条件规定了一个构件扩展填充它的显示区的方式。anchor和 fll约束条件对构件的显示区都没有影响,不管如何规定这两个约束条件,构件显示区的尺寸都不受影响。
- gridx 和gridy约束条件规定构件显示区左上角的网格单元。既然构件存在于它们显示区的某处,那么对构件的网格单元的改变将引起显示区和它相关的构件的位置改变。
- gridwidth和gridheight规定网格单元中构件的显示区的尺寸。
- weightx和 weighty 规定构件的显示区占据了多少构件的首选尺寸之外的额外空间。尺寸和重量约束条件都仅仅应用于构件的显示区,但是,依据与构件相关的fill约束条件,构件自身的尺寸也可能受到影响。
4、GridBagConstraints.anchor
GridBagConstraints . anchor规定了一个构件在它的显示区中的位置。
注意,如果构件的fill约束条件被设置为GridBagConstraints.NONE之外的任何值,那么设置anchor约束条件看起来可能不起作用,因为构件将扩展以填充它的显示区的一部分。
5、GridBagConstraints.fill
fill约束条件规定了构件可以填充它的显示区的多少。
6、GridBagConstraintss.gridx和GridBagConstraints.gridy
gridx和 gridy约束条件规定了一个构件显示区的左上角网格单元。网格定位是基于0的,因此一个容器左上角的网格单元的( gridx,gridy)值是(0,0)。除了规定一个数值的网格位置外,gridx和 gridy还可以被赋值为GridBagConstraints.RELATIVE。gridx为 RELATIVE意味着构件将被放在最后一个已添加到容器中的构件的右面,gridy为RELATIVE意味着构件将被放在最后一个已添加到容器中的构件的下一行。
7、GridBagConstraints.gridwidth和GridBagConstraints.gridheight
gridwidth和 gridheight约束条件确定一个构件的显示区的大小,不一定是构件自己的大小。对于gridwidth和 gridheight除了可以规定为整数值以外,还可以规定为GridBagCon-straints .RELATTVE和GridBagConstraints .REMAINDER。RELATTVE意味着构件将是当前行( grid-width)或当前列(对于gridheight)最后一个构件的下一个。REMAINDER导致构件将是所在行( gridx)或列( gridy)的最后一个。指定REMAINDER 导致构件的显示区扩展到多个网格单元,H的是使构件分别成为所在行或所在列的最后一个。
8、GridBagConstraints.werghtx和weighty
如果一个容器比它的构件的组合首选尺寸大,那么构件的 weightx和 weighty约束条件确定构件的显示区可以消耗多少额外的空间。weightx 和 weighty约束条件严格地应用于构件的显示区,而不是构件自身,但是通过设置fl约束条件,可以用多种不同的方法使构件填充它的整个显示区。
GridBagConstraints . weightx和GridBagConstraints . weighty是唯一可被规定为double值的约束条件。另外,weightx和 weighty 都必须是正数。weightx和 weighty通常被规定为一个0.0和1.0之间的数,但也可以规定为一个大于1.0的数。在一个给定行或列中的每一个构件的重量是相对于同一行或列的其他构件的重量的,因此可以坚持使用0.0和1.0之间的数或大一些的数。
ps :重量相同不一定等于显示区尺寸相同
即使同一行或列的两个构件具有相等的重量,也不一定意味着它们的显示区具有同样的尺寸。只有两个构件的首选尺寸也是相同的时候,它们的显示区才可能处于相同的尺寸。
9、GridBagConstraints.insets
就如同在容器内规定空白区一样,也可以用Insets对象规定一个构件的显示区的空白区。
10、在嵌套的面板中布置构件
Container可以包含构件,并且 AWT设计者选择使Container 成为Component 的扩展。当然,既然Container是一个Component,那么容器可以不仅包含构件而且还可以包含其他容器(这被认为是复合设计模式的操作)°。
如果打算在applet程序中设计非常复杂的屏幕,那么这种重要的能力—–在--个容器中嵌套另一个容器——是必须的。无论选择哪种布局管理器,试图用一个布局管理器布置一个复杂的容器是无用的工作。
11、自定义布局管理器
应该用的不多,自行查询《java2图形卷1:AWT》相关章节