GridBagLayout布局方式
为什么要写这篇文章
- 看网上对于GridBagLayout的说法都是说,这是一种很灵活、实用性很高的布局管理器,但是一查API文档就会发现,GridBagLayout一共有十几个参数,看着着实有点头疼。看了网上很多的网页对GridBagLayout的理解,让我对GridBagLayout也有了一点点初步的理解。就想着用这第一篇文章来记录一下自己对这个布局管理器的理解,顺便以后如果忘记了还可以翻翻看…hhh。
GridBagLayout部分参数
参数 | 定义以及理解 |
---|---|
gridwidth和gridheight | 方格在横向(纵向)占用的单元格数 可以使用GridBagConstraints.REMAINDER和GridBagConstraints.RELATIVE值 用法在实例中 |
weightx(y) | 参数大小影响在横向和纵向的填充权重 要跟fill参数搭配着用 |
fill | 这个参数是在你的组件小于你的区域大小的时候可以补齐。可能的值为GridBagConstraints.NONE (不填充), GridBagConstraints.HORIZONTAL (只填充水平方向), GridBagConstraints.VERTICAL (只填充垂直方向)和GridBagConstraints.BOTH (两个方向填充)。 |
insets | 设置各个组件之间的间隔。用法new insets(int,int,int,int)参数分别是上,左,下,右的间隔,单位是px |
- 个人感觉只用上面这几个也能实现比较好的布局,有兴趣的小伙伴可以去学习一下其他参数的用法
实例
首先如果要实现布局管理器,先要实例化 GridBagLayout对象和这个对象里面的GridBagConstraints方法
GridBagLayout layout = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
注意:其实这个第二行代码,可以写多行实例化。因为如果只有想代码里面的这一个实例对象 c ,那么一旦后面对组件使用约束条件时候忘记重置约束条件。那么可能会对后面的组件产生影响(至于影响嘛,看了后面的代码,自己领会一下吧,这个不知道怎么说)。但是如果是每一个组件实例化一个GridBagConstraints 对象的话就不存在上诉问题。当然了优缺点很明显,代码量上有点…用哪一种方式,看自己习惯。后面我就以只实例化一个为例子举例
完整代码(理解在注释里面)
- 因为有一些理解对着代码写会比较好些,所以就写在注释里了
import java.awt.*;
import javax.swing.*;
class GUI {
JFrame jf;
JPanel jpanel;
public GUI() {
GridBagLayout layout = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();// 实例化两个对象
jf = new JFrame("布局演示");
jpanel = new JPanel();
jf.setSize(500, 300);
jf.add(jpanel);
jpanel.setLayout(layout);// 先把面板的布局管理器设置为前面定义实例化的layout
c.fill = GridBagConstraints.BOTH;// 把填充状态设置填满(垂直和水平) 建议一开始设置为BOTH后面,下面的weightx(y)才能生效
c.weightx = 3; // 虽然看着这个数字是3,但是实际的效果是:如果这一行只有这一个组件,那么按照上面的fill值,就会填满一整行,但是如果这一行有两个的话你就得看
// 目前的这个weightx值和后面那个组件的weightx值的比值,填充比例就是按照这个比例
c.weighty = 5;// 与上面的weightx用法一样
addComponent("按钮1", layout, c);
c.weightx = 2; // 例如这个地方是2,上面是3。那么运行效果就是3:2的比例填充的
c.weighty = 5;
c.insets = new Insets(0, 5, 0, 0);// 这个是设置第二个组件的左侧间隔5px
c.gridwidth = GridBagConstraints.REMAINDER; // 将gridwidth的值设置为这个意思是接下来这这个组件将把这一行剩下的空间全部填充。换句话说就是一行结束的标志。
// gridheight的用法类似
addComponent("按钮2", layout, c);
c.insets = new Insets(0, 0, 5, 0);// 这个是设置第三个组件的下侧间隔5px
c.weighty = 9;
c.gridwidth = GridBagConstraints.REMAINDER;
addComponent("按钮3", layout, c);
c.gridwidth = 0;// 重置
c.weightx = 0;// 重置
c.weighty = 4;// 与上面的那个5可以对应,比例就是5:4
c.fill = GridBagConstraints.VERTICAL;// 只在垂直方向上面填充
addComponent("按钮4", layout, c);
c.weighty = 3;
c.insets = new Insets(10, 0, 0, 0);// 这个是设置第二个组件的上侧间隔10px
c.fill = GridBagConstraints.BOTH;
addComponent("按钮5", layout, c);
// 下面这一行代码建议不要写成false,因为当你放全屏的时候效果最明显
// jf.setResizable(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setLocationRelativeTo(null);
jf.setVisible(true);
}
/**
* 添加样式并插入的方法
* String name :这个button的名字
* GridBagLayout layout :这个button的布局管理器
* GridBagConstraints c :这个button的布局管理器约束条件
*
*/
public void addComponent(String name, GridBagLayout layout, GridBagConstraints c) {
JButton button = new JButton(name);
layout.setConstraints(button, c);
jpanel.add(button);
}
}
public class Test {
public static void main(String[] args) {
new GUI();
}
}
- 运行结果示例
- 第一次写这种文章,排版布局以及内容可能有点乱…hhh