一、简介
GridBagLayout类是一个灵活的布局管理器,GridBagLayout类的对象维持一个动态的矩形单元网格,然后我们可以把组件放进一个或多个矩形单元网格,组件大就多放几个,组件小就少放几个。
而每个组件,要占几个网格单元,每个组件要占领的位置在哪等等,都是要用GridBagConstraints类的对象来设置。
可以完成复杂的布局,而且IDE对它有足够的支持,是一个很强大的Layout。不过它过于复杂,在此布局中,组件大小不必相同。可以采用以下代码容器获得一个GridBagLayout:
GridBagLayout gb=new GridBagLayout();
ContainerName.setLayout(gb);
要使用网格包布局,还必须有其一个辅助类,GridBagContraints。它包含GridBagLayout类用来定位及调整组件大小所需要的全部信息。使用步骤如下:
1) 创建网格包布局的一个实例,并将其定义为当前容器的布局管理器
2) 创建GridBagContraints的一个实例
3) 为组件设置约束
4) 通过方法统治布局管理器有关组件及其约束等信息
5) 将组件添加到容器
6) 对各个将被显示的组件重复以上步骤
GridBagContraints类的成员变量列表如下:
1、gridx,gridy
指定组件放在哪个单元中。其值应该设为常数CridBagConstraints.RELATIVE。然后按标准顺序将组件加入网格包布局。从左到右,从上到下。
2、gridwidth,gridheight
指定组件将占用几行几列
s.gridwidth=1;//该方法是设置组件水平所占用的格子数,如果为0,就说明该组件是该行的最后一个
3、weightx,weighty
指定在一个GridBagLayout中应如何分配空间。缺省为0。
s.weightx = 0;//该方法设置组件水平的拉伸幅度,如果为0就说明不拉伸,不为0就随着窗口增大进行拉伸,0到1之间
s.weighty=0;//该方法设置组件垂直的拉伸幅度,如果为0就说明不拉伸,不为0就随着窗口增大进行拉伸,0到1之间
4、ipadx,ipady
指定组件的最小宽度和高度。可确保组件不会过分收缩。
5、insets
组件和显示区、外部填充
6、ipadx,ipady
组件和显示区、内部填充
7、fill
指定在单元大于组件的情况下,组件如何填充此单元,缺省为组件大小不变,以下为静态数据成员列表,它们是fill变量的值。
GridBagConstraints.NONE 不改变组件大小
GridBagConstraints.HORIZONTAL 增加组件宽度,使其水平填充显示区域
GridBagConstraints.VERTICAL 增加组件高度,使其垂直填充显示区域
GridBagConstraints.BOTH 使组件填充整个显示区域
8、anchor
如果不打算填充可以通过anchor指定将组件放置在单元中的位置,缺省为将其放在单元的中部。可使用以下静态成员:
GridBagConstraints.CENTER
GridBagConstraints.NORTH
GridBagConstraints.EAST
GridBagConstraints.WEST
GridBagConstraints.SOUTH
GridBagConstraints.NORTHEAST
GridBagConstraints.SOUTHEAST
GridBagConstraints.NORTHWEST
GridBagConstraints.SOUTHWEST
使用setConstraints()方法可以设置各组件约束。
GridBagLayout是是在GridLayout的基础上发展起来的,是五种布局策略中使用最复杂,功能最强大的一种,它是在GridLayout的基础上发展起来的。因为GridBagLayout中每个网格都相同大小并且强制组件与网格大小相同,使得容器中的每个组件也都是相同的大小,显得很不自然,而且组件假如容器中必须按照固定的行列顺序,不够灵活。在GridBagLayout中,可以为每个组件指定其包含的网格个数,组件可以保留原来的大小,可以以任意顺序随意地加入容器的任意位置,从而实现真正自由地安排容器中每个组件的大小和位置。
二、类及方法
GridBagLayout gridBag = new GridBagLayout();
GridBagConstraints c = null;
JPanel panel = new JPanel(gridBag);
c = new GridBagConstraints();
gridBag.addLayoutComponent(btn01, c);
GridBagConstraints属性:
变量名 | 有效值 | 应用范围 | 定义 |
anchor | CENTER EAST NORTH NORTHEAST SOUTH SOUTHWEST WEST | 组件 | 组件在网格中排放的位置 |
fill | BOTH HORIZONTAL VERTICAL NONE | 组件 | 组件填充网格的方式 |
gridx,gridy | RELATIVE 整数X,Y值 | 组件和显示区 | 组件的左上角网格的位置 |
gridheight gridwidth | 1 RELATIVE REMAINDER 宽,高度整数值 | 显示区 | 网格单元中组件显示区所占的高度和宽度 |
Insets | (0,0,0,0) | 组件和显示区 | 外部填充 |
ipadx,ipady | 0 | 组件和显示区 | 内部填充 |
三、举例
import java.awt.*;
import javax.swing.*;
public class TestGridBagM2 {
public static void main(String[] args) {
JFrame jf = new JFrame("测试窗口");
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
GridBagLayout gridBag = new GridBagLayout(); // 布局管理器
GridBagConstraints c = null; // 约束
JPanel panel = new JPanel(gridBag);
JButton btn01 = new JButton("Button01");
//将btn02、btn03按GridBagLayout放到JPanel中
JButton btn02 = new JButton("Button02");
JButton btn03 = new JButton("Button03");
GridBagLayout igridBag = new GridBagLayout(); // 布局管理器
GridBagConstraints ic = null; // 约束
JPanel iPanel = new JPanel(igridBag);
ic = new GridBagConstraints();
ic.insets = new Insets(0, 10, 0, 10);
igridBag.addLayoutComponent(btn02, ic);
ic = new GridBagConstraints();
ic.insets = new Insets(0, 10, 0, 10);
igridBag.addLayoutComponent(btn02, ic);
iPanel.add(btn02);
iPanel.add(btn03);
JTextField txt02 = new JTextField("TextField");
JComboBox<String> cbx01 = new JComboBox<String>(new String[]{"选项A", "选项B", "选项C"});
JComboBox<String> cbx02 = new JComboBox<String>(new String[]{"选项A", "选项B", "选项C"});
/* 添加 组件 和 约束 到 布局管理器 */
//btn01
c = new GridBagConstraints();
c.anchor = GridBagConstraints.WEST;
c.insets = new Insets(2, 10, 2, 10);
c.gridx = 0;
c.gridy = 0;
gridBag.addLayoutComponent(btn01, c);
//btn02
c = new GridBagConstraints();
c.anchor = GridBagConstraints.EAST;
c.insets = new Insets(2, 10, 2, 10);
c.gridwidth = GridBagConstraints.REMAINDER;
gridBag.addLayoutComponent(iPanel, c);
//txt
c = new GridBagConstraints();
c.fill = GridBagConstraints.BOTH;
c.insets = new Insets(2, 10, 2, 10);
c.weightx = 1;
c.weighty = 1;
c.gridwidth = GridBagConstraints.REMAINDER;
gridBag.addLayoutComponent(txt02, c);
//cbx01
c = new GridBagConstraints();
c.anchor = GridBagConstraints.WEST;
c.insets = new Insets(2, 10, 2, 10);
gridBag.addLayoutComponent(cbx01, c);
//cbx02
c = new GridBagConstraints();
c.anchor = GridBagConstraints.EAST;
c.insets = new Insets(2, 10, 2, 10);
c.gridwidth = GridBagConstraints.REMAINDER;
gridBag.addLayoutComponent(cbx02, c);
/* 添加 组件 到 内容面板 */
panel.add(btn01);
panel.add(iPanel);
panel.add(txt02);
panel.add(cbx01);
panel.add(cbx02);
jf.setContentPane(panel);
jf.setSize(600, 400);
jf.setLocationRelativeTo(null);
jf.setVisible(true);
}
}