1.使用网格组管理器进行布局的步骤:
(1)建立一个GridBagLayout的对象,不需要指定网络的行数和列数
(2)将GridBagLayout的对象设置成组件的布局管理器
(3)为每个组件建立一个GridBagConstraints对象,设置GridBagConstraints对象的域以便指出组件在网格组中的布局方案
(4)最后,通过下面的调用添加组件的约束:add(component,constraints)
2.GridBagConstraints对象状态的约束
(1)gridx,gridy,gridwidth,gridheight参数(前两个指定了被添加组件左上角的行列位置(0,0)代表最左上角,后2个指定了组件占据的行数和列数)
(2)增量域 如果想让一行或一列的大小保持不变,就需要将这行、这列的所有组件的增量都设置为0。注意,增量并不是给出列的相对大小,当容器超过首选大小时,增量表示分配给每个区域的扩展比例值。建议将所有增量的值设置为100.
(3)fill和anchor参数如果不希望组件拉伸至整个区域,就需要设置fill约束。它有四个值:GridBagConstraints.NONE、GridBagConstraints.HORIXONTAL、GridBagConstraints.VERTICAL和GridBagConstraints.BOTH。
如果组件没有填充整个区域,可以通过设置anchor域指定其值。有效值为GridBagConstraints.CENTER(默认值)、GridBagConstraints.NORTH、GridBagConstraints.NORTHEAST和GridBagConstraints.EAST等
(4)填塞 可以通过设置GridBagLayout的insets域在组件周围增加附加的空白区域。通过设置Insets对象的left、top、right、和bottom指定组件周围的空间量,这被称作外部填塞
通过设置ipadx和ipady指定内部填塞,这两个值被添加到组件的最小宽度和最小高度上
3.网格组布局的策略
(1)在纸上画出组件布局草图
(2)找出一种网格,小组件被放置在一个单元格内,大组件将横跨多个单元格
(3)用0,1,2,........标识网格的行和列,现在可以读取gridx,gridy,gridwidth和gridheight的值
(4)对于每个组件,需要考虑下列问题,是否需要水平或者垂直填充他所在的单元格?如果不需要,希望如何排列?这就是fill和anchor参数的设置
(5)将所有的增量设置为100.如果需要某行某列始终保持默认的大小,就将这行或这列中所有组件的weightx和weighty设置为0
(6)编写代码,仔细地检查GridBagConstraints的设置
(7)编译运行
4.定制布局管理器
(1)可以使用下面方法定制布局管理器
*定制布局管理器必须实现LayoutManager接口,并且需要定义下面5个方法
*void addLayoutComponent(String s,Component c);
*void removeLayoutComponent(Component c);
*Dimensio preferredLayoutSize(Container parent);
*dimension minimumLayoutSize(Container parent);
*void layoutContainer(Container parent);
在添加或删除一个组件时会调用前面两个方法,如果不需要保存组件的任何附加信息,那么可以将这两个方法置为空,接下来的两个方法计算组件的最小布局和首选布局所需要的空间,两者通常相等,第5个方法真正地实施操作,它调用所有组件的setBounds方法