9.1 网格组布局
行和列的尺寸可以改变。可以将相邻的单元格合并以适应较大的组件。组件不需填充整个单元格区域,并可以指定其在单元格内的对齐方式。
使用网格组管理器布局,需经过下列过程:
1. 建立一个GridBagLayout对象,不需指定行和列。
2. 将GridBagLayout对象设置成组件的布局管理器。
3.
为每个组件建立一个GridBagConstraints对象,设置GridBagConstraints对象的域以便指出组件在网格中的布局方案。
4. 最后通过add(component,constraints);添加组件的约束。
例如:
GridBagLayout layout = new GridBagLayout();
panel.setLayout(layout);
GridBagConstraints constraints = new GridBagConstraints();
constraints.weightx = 100;
constraints.weighty = 100;
constraints.gridx = 0;
constraints.gridy = 2;
constraints.gridwidth = 2;
constraints.gridheight = 1;
panel.add(component,constraints);
设置GridBagConstraints对象的状态:
1.gridx,gridy,gridwidth,gridheight参数
gridx和gridy指定被添加组件左上角的行、列位置
gridwidth和gridheight指定类组件占据的行数和列数。
网格的坐标从0开始。左上角为(0,0)。
2. 增量域
网格布局中,要为每个区域设置增量域(weightx和weightx).如果增量设置为0,则这个区域永远为初始尺寸。
概念上说,增量参数属于行和列属性,而不属于某个单元格。却需要在单元格上指定它们,这是因为网格组布局不暴露行和列。行和列等于每行或每列单元格增量的最大值。
3. fill和anchor参数
不希望组件拉伸至整个区域,设置fill约束。四个有效值:GridBagConstraints.NONE,GridBagConstraints.VERTICAL,GridBagConstraints.HORIZONTAL,GridBagConstraints.BOTH.
如果组件没有填充整个区域,可以通过anchor域指定其位置。有效值::GridBagConstraints.CENTER,GridBagConstraints.NORTH,GridBagConstraints.NORTHEAST,GridBagConstraints.EAST.
4. 填塞
通过GridBagLayout的insets域在组件周围增加傅涓的空白区域。通过设置Insets对象的left,top,right,bottom指定周围的空间量。这叫外部填塞。
通过ipadx和ipady指定内部填塞。
5. 指定gridx,gridy,gridwidth,gridheight参数的另一种方法。
AWT建议不将gridx,gridy设置为绝对位置,应该设置为常量GridBagConstraints.RELATIVE.然后按标准顺序,将组件添加到网格组布局中。即第一行从左至右,然后下一行。
还要通过gridheight,gridwidth域指定一个适当的值设置组件的横跨的行和列。如果在最后一行或最后一列,不要给出实际值,用常量GridBagConstraints.REMAINDER替代。
下面策略可以让网格组布局使用相对简单一些:
1. 在纸上画出组件布局草图。
2.
找出一种网格,小组件被放置在一个单元格内,大组件将横跨多个单元格。
3.
用0,1,2...标识网格的行和列。现在可以读取gridx,gridy,gridwidth,gridheight的值。
4.
对每个组件考虑下列问题:是否需要水平或垂直填充他所在的单元格?如果不需要,希望如何排列?就是fill和anchor。
5.
将所有增量设置为100.如果需要某行或某列始终保持默认大小,将这行或列的所有组件的weightx和weighty设为0.
6. 编写代码。仔细检查GridBagConstraints的设置。
7. 编译、运行。
也可使用工具可视化的指定约束。如NetBeans。
6. 使用帮助类来管理网格组约束。
很多程序员编写帮助函数或者帮助类来设置约束代码的编写。
如例子中的GBC代替GridBagConstraints
转载于:https://my.oschina.net/liuyang2077/blog/502610