GridBagLayout布局管理器:
这就是最复杂的一个布局管理器了,网格包布局.在此布局中,组件大小不必相同.
GridBagLayout gb=new GridBagLayout();
ContainerName.setLayout(gb);

以上代码是让容器获得一个GridBagLayout.要使用网格包布局,还必须有其一个辅助类,GridBagContraints.它包含GridBagLayout类用来定位及调整组件大小所需要的全部信息.使用步骤如下:

1).创建网格包布局的一个实例,并将其定义为当前容器的布局管理器.

2).创建GridBagContraints的一个实例

3).为组件设置约束.

4).通过方法统治布局管理器有关组件及其约束等信息

5).将组件添加到容器.

6).对各个将被显示的组件重复以上步骤.

GridBagContraints类的成员变量列表如下:

1、gridx—组件的横向坐标;
2、girdy—组件的纵向坐标;

gridx=0,gridy=0时放在0行0列,GridBagConstraints.RELATIVE为默认值,表明当前组件紧跟在上一个组件之后。如果在行上不指定该值(同时也不指定gridx和gridy参数),那么无论添加多少个组件都是在同一行上

3、gridwidth——组件的横向宽度,也就是指组件占用的列数,这与HTML的colspan类似;
4、gridheight—组件的纵向长度,也就是指组件占用的行数,这与HTML的rowspan类似;

设置组件横向纵向跨越多少个网格,他们的默认值都是1,如果该组件是横向或纵向的最后一个还可以将此值设为GridBagConstraints.REMAINDER,若为倒数第二个组件则可以设值为GridBagConstraints.RELATIVE。

gridwidth能否能够保留住该宽度取决于其正上/下方相应位置是否有足够的组件来占位,如果无,位置将会被压缩。比如,设置gridwidth=3,但只添加了一个JButton,这时如果其上下方相应位置没有其他组件或只有1个组件,那么它只占有1个网格大小。如果它上/下方相应位置有3个组件,那它就可以占3个网格大小了。如果它上/下方相应位置只有2个组件,那它就占2个网格大小。

gridheight能否保留住该高度取决于其左右两边是否有足够的组件来占位。也就是说它的最大高度不大于左右两边最大的高度。比如,设置gridheight=3,如果左右两边组件只有1行,则它仅仅只有1行的高度,有2行则占2行的高度。

5、weightx—指行的权重,告诉布局管理器如何分配额外的水平空间;
6、weighty—指列的权重,告诉布局管理器如何分配额外的垂直空间;

用来设置窗口变大时,各组件跟着变大的比例。当数字越大,表示组件能得到更多的空间,默认值皆为0。比如组件A的weightx=0.5,组件B的weightx=1,那么窗口X轴变大时剩余的空间就会以1:2的比例分配给组件A和B;

7、anchor—告诉布局管理器组件在表格空间中的位置,当组件小于其显示区域时使用此字段;

有CENTER(默认值)、NORTH、NORTHEAST、EAST、SOUTHEAST、WEST、NORTHWEST选择。

8、fill—如果显示区域比组件的区域大的时候,可以用来控制组件的行为。控制组件是垂直填充,还是水平填充,或者两个方向一起填充;

9、insets—指组件与表格空间四周边缘的空白区域的大小,内边距,算入组件自身大小中。它有四个参数,分别是上,左,下,右,默认为(0,0,0,0)。

10、ipadx— 组件间的横向间距,组件的宽度就是这个组件的最小宽度加上ipadx值;
11、ipady— 组件间的纵向间距,组件的高度就是这个组件的最小高度加上ipady值。

外边距,最终组件占用的大小是组件自身大小加上外边距。

所以,如果我们已经明白了GridBagConstraints的详细用法了,那么现在就让我们来看看在实际应用中应该如何来实现它:
tagLbl = new JLabel("Tags");
c.gridx = 0; //x grid position
c.gridy = 0; //y grid position
gridbag.setConstraints(tagLbl, c); //设置标签的限制

contentPane.add(tagLbl); //增加到内容面板

我们所做的是示例我们的标签、分配给它一个格位置,将它与一个约束对象联系起来并把它增加到我们的内容面板中。
tagModeLbl = new JLabel("Tag Mode");
c.gridx = 0;
c.gridy = 1;
gridbag.setConstraints(tagModeLbl, c);

contentPane.add(tagModeLbl);

请注意,虽然我们已经在我们的约束对象中把gridx的值设置为0,但是在这里我们仍然要对它进行重新设置——这样做没有其它原因,只是为了增加可读性。
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐