使用背景:在开发应用程序过程中,需要设计一个JPanel的面板,可以在面板的任意位置,添加任意大小的组建。
一、关于GridBagLayout的简介
GridBagConstraints的对象可设置的实例变量包括:
1. gridx, gridy :指定组件左上角的行与列,均从 0 开始计算。缺省 RELATIVE ,指定置于之前放入容器的组件的右边或下边。建议对每一组件都设置这两个值而不使用缺省值,
以得到更好的布局效果。
2. gridwidth, gridheight :指定组件显示区域占的列数与行数,缺省为 1 。REMAINDER指定组件占用最后余下的行或列;RELATIVE 指定组件成为其行或列的下一个。除非组件在最左列或已指定gridx和gridy值,否则不允许组件跨多行。
3. fill:当显示区域大于组件时决定是否以及如何改变组件大小。缺省值 NONE ;HORIZONTAL放宽组件以填充区域;VERTICAL 加高组件;BOTH 同时放大。
4. ipadx, ipady :指定内部填充(internal padding ),即组件最小尺寸上还要加多宽、多高,缺省为0 。组件宽度至少为最小宽度+ipadx*2 像素(左右皆补);同理,高度要加上 ipady*2像素。
5. insets:指定外部填充(external padding ),即组件与其显示区域边界之间的最小空间。设置为一个Insets 对象,缺省值为无填充。
6. anchor :当组件比显示区域小时确定放置方位:CENTER (缺省)、NORTH、EAST、SOUTH、WEST、NORTHEAST 、SOUTHEAST 、SOUTHWEST和NORTHWEST。
7. weightx, weighty :指定组件重量,用于决定行或列之间如何分配空间,影响resize行为。如果未指定至少一个重量值(缺省情况),所有组件挤在容器中间。通常设置在0.0
至1.0,值越大表明该组件所需空间越多。
二、使用实例
- JPanel controlPanel = new JPanel();
- controlPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.black,2), "操作区", TitledBorder.CENTER, TitledBorder.TOP));
- controlPanel.setPreferredSize(new Dimension(200,512));
- GridBagLayout gridbag = new GridBagLayout();
- GridBagConstraints c = new GridBagConstraints();
- controlPanel.setLayout(gridbag);
- c.fill = GridBagConstraints.HORIZONTAL;
- JButton button;
- button = new JButton("打开文件");
- c.ipady = 20; // 增加该组件的高度
- c.weightx = 0.5; // 后面两个按钮没有改变weightx 的值,则使用这个值
- c.gridx = 0;
- c.gridy = 0; // 占据第0 行0 列
- c.insets = new Insets(0,0, 10,0);
- gridbag.setConstraints(button, c);
- controlPanel.add(button);
- button = new JButton("名字很长的第四个按钮");
- c.ipady = 20; // 增加该组件的高度
- c.gridx = 0;
- c.gridy = 1; // 第1 行0 列
- c.gridwidth = 1; // 但占据3 列的宽度
- gridbag.setConstraints(button, c);
- controlPanel.add(button);
- button = new JButton("五");
- c.ipady = 20; // 设置 ipady 为0,若不设置则为前面的40
- c.weighty = 1.0; // 使组件占据尽可能多的空间
- c.anchor = GridBagConstraints.SOUTH; // 放置在空间的下方
- // 使用 Inserts 填充,创建Inserts 对象是参数的顺序是top, left, bottom, right ,
- // 即按逆时针方向下面的创建的对象使用10个像素单元填充上部空间
- c.insets = new Insets(0,0, 0,0);
- c.gridx = 0;
- c.gridy = 2; // 占据第2 行第 1 列
- //c.gridwidth = 3; // 但占据2 列的宽度
- gridbag.setConstraints(button, c);
- controlPanel.add(button);
- return controlPanel;
JPanel controlPanel = new JPanel();
controlPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.black, 2), "操作区", TitledBorder.CENTER, TitledBorder.TOP));
controlPanel.setPreferredSize(new Dimension(200, 512));
GridBagLayout gridbag = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
controlPanel.setLayout(gridbag);
c.fill = GridBagConstraints.HORIZONTAL;
JButton button;
button = new JButton("打开文件");
c.ipady = 20; // 增加该组件的高度
c.weightx = 0.5; // 后面两个按钮没有改变weightx 的值,则使用这个值
c.gridx = 0;
c.gridy = 0; // 占据第0 行0 列
c.insets = new Insets(0, 0, 10, 0);
gridbag.setConstraints(button, c);
controlPanel.add(button);
button = new JButton("名字很长的第四个按钮");
c.ipady = 20; // 增加该组件的高度
c.gridx = 0;
c.gridy = 1; // 第1 行0 列
c.gridwidth = 1; // 但占据3 列的宽度
gridbag.setConstraints(button, c);
controlPanel.add(button);
button = new JButton("五");
c.ipady = 20; // 设置 ipady 为0,若不设置则为前面的40
c.weighty = 1.0; // 使组件占据尽可能多的空间
c.anchor = GridBagConstraints.SOUTH; // 放置在空间的下方
// 使用 Inserts 填充,创建Inserts 对象是参数的顺序是top, left, bottom, right ,
// 即按逆时针方向下面的创建的对象使用10个像素单元填充上部空间
c.insets = new Insets(0, 0, 0, 0);
c.gridx = 0;
c.gridy = 2; // 占据第2 行第 1 列
//c.gridwidth = 3; // 但占据2 列的宽度
gridbag.setConstraints(button, c);
controlPanel.add(button);
return controlPanel;
三、显示结果如下
四、代码说明
(1)c.fill = GridBagConstraints.HORIZONTAL;//让组建的宽度和Panel的宽度相同
(2)c.ipady = 20; // 增加该组件的高度,设定特定的组建的高度
(3)c.weightx = 0.5;//这里是设置组建在一列中宽度所占的比例,同样可以设置组建在一行中高度所占的比例
(4)c.gridx = 0;//设置组建在Grid中的列号
(5)c.gridwidth = 3; // 但占据3 列的宽度,该组建在某一行中的占据三列的宽度
(6)c.insets = new Insets(0, 0, 0, 0);// 使用 Inserts 填充,创建Inserts 对象是参数的顺序是top, left, bottom, right , 即按逆时针方向下面的创建的对象使用10个像素单元填充上部空间
(7)c.anchor = GridBagConstraints.SOUTH; // 放置在空间的下方
·