版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40788630/article/details/82289589
GridBagLayout(网格包布局管理器)是最灵活、最复杂的布局管理器。与GridLayout类似,不同的是它允许网格中的组件大小各不相同,而且允许组件跨网格。
使用GridBagLayout布局管理器的步骤如下:
1、创建GridBagLayout布局管理器,并使用该布局管理器
GridBagLayout layout=new GridBagLayout();
container.setLayout(layout);
2、创建GridBagConstraints对象(约束条件),并设置该对象的相关属性
GridBagConstraints constraints=new GridBagConstraints();
constraints.gridx=1;
constraints.gridy=1;
constraints.gridwidth=1;
constraints.gridheight=1;
3、调用GridBagLayout对象的setCondtraints()方法建立GridBagConstraints对象与受控组件之间的关联
layout.setConstraints(component,condtraints);
4、向容器中添加组件
container.add(component);
GridBagConstraints对象可以重复使用,只需改变它的属性即可。如果要向容器中添加多个组件,则重复2,3,4即可。
从上面步骤可以看出使用GridBagLayout布局管理器的关键在于GridBagConstraints对象,它才是控制容器中每个组件布局的核心类在GridBagConstraints中有很多表示约束的属性,下面一一介绍:
属性 | 作用 |
gridx和gridy | 设置在组件左上角所在网格的横向和纵向牵引线。如果将gridx和gridy设置成GridBagConstraints.RELATIVE(默认值),表示跟随在上一个组件后面 |
gridwidth和gridheight | 设置组件横向纵向跨越几个网格,两个属性默认值都是1,如果把这两个属性改为GridBagConstraints.REMAINER,表示当前组件为此行或此列最后一个组件;如果将两个属性改为GridBagConstraints.RELATIVE,表示该组件为当前列或行倒数第二个组件 |
fill | 如果当组件的显示区域大于该组件需要的大小,设置组件是以及如何改变组件大小,该属性接收一下几个属性值 1.NONE:默认,不改变组件大小 2.HORIZONTAL:使组件水平方向足够长以填满显示区域,但高度不变 3.VERTICAL:使组件垂直方向足够高以填满显示区域,但长度不变 4.BOTH:使组件足够大,以填充显示区域 |
weightx和weighty | 设置组件占领容器水平方向和垂直方向空白的比例(也可以成为权重)。假设容器水平方向放置三个组件,其weightx依次为1,2,3。当容器要增加60px时,这三个容器分别增加10,20,30的像素。这两个属性默认值为0即不占领多余空间 |
需要注意的是如果想要组件随着容器的增大而增大,必须同时设置GridBagConstraints的fill属性和weightx、weighty属性。
下面代码为例:
import java.awt.*;
class Layout extends Frame{
public Layout(String title){
GridBagLayout layout =new GridBagLayout();
GridBagConstraints c=new GridBagConstraints(); //创建约束条件对象
this.setLayout(layout);
c.fill=GridBagConstraints.BOTH;
c.weightx=1;
c.weighty=1;
this.addComponent("but1", layout, c);//连续添加三个约束条件相同的组件
this.addComponent("but2", layout, c);
this.addComponent("but3", layout, c);
c.gridwidth=GridBagConstraints.REMAINDER;//表示添加的组件是本行最后一个组件
this.addComponent("but4", layout, c);
c.weightx=0;
c.weighty=0;
this.addComponent("but5", layout, c);
c.gridwidth=1;
this.addComponent("but6", layout, c);
c.gridwidth=GridBagConstraints.REMAINDER;
this.addComponent("but7", layout, c);
c.gridheight=2;
c.gridwidth=1;
c.weightx=2;
c.weighty=2;
this.addComponent("but8", layout, c);
c.gridheight=1;
c.gridwidth=GridBagConstraints.REMAINDER;
this.addComponent("but9", layout, c);
this.addComponent("but10", layout, c);
this.pack();
this.setVisible(true);
}
public void addComponent(String name,GridBagLayout layout,GridBagConstraints c){
Button but=new Button(name);
layout.setConstraints(but, c);
this.add(but);
}
}
public class Main{
public static void main(String[] args)throws Exception{
new Layout("GridBagLayout");
}
}
将程序运行后就会出来一个窗口,将其拉宽或拉长就会发现约束条件不同属性的不同作用