据说是最复杂的布局也是最实用的一个布局


GridBagLayout

使用步骤

①建立容器(例如JFrame)并设置布局方式:

JFrame frame = new JFrame();
frame.setSize(300, 300);
frame.setTitle("GridBagLayout测试");
frame.setLayout(new GridBagLayout());

②创建 GridBagConstraints对象:

GridBagConstraints c = new GridBagConstraints();
//GridBagConstraints 类指定使用 GridBagLayout 类布置的组件的约束

③按照需要设置GridBagConstraints对象的属性:

c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = 0;
c.gridy = 0;
c.ipady = 50;

④添加组件:

frame.add(button, c);
//注意第二个参数

GridBagConstraints对象属性说明:

1、gridxgridy:其实就是组件行列的设置,注意都是从0开始的,比如 gridx=0,gridy=1时放在0行1列;
2、gridwidthgridheight:默认值为GridBagConstraints.REMAINDER常量,代表此组件为此行或此列的最后一个组件,会占据所有剩余的空间;
3、weightxweighty:当窗口变大时,设置各组件跟着变大的比例。比如组件A的weightx=0.5,组件B的weightx=1,那么窗口X轴变大时剩余的空间就会以1:2的比例分配给组件A和B;
4、anchor:当组件空间大于组件本身时,要将组件置于何处。 有CENTER(默认值)、NORTH、NORTHEAST、EAST、SOUTHEAST、WEST、NORTHWEST选择;
5、insets:设置组件之间彼此的间距。它有四个参数,分别是上,左,下,右,默认为(0,0,0,0);
6、fill—如果显示区域比组件的区域大的时候,可以用来控制组件的行为。控制组件是垂直填充,还是水平填充,或者两个方向一起填充;
7、ipadx— 组件间的横向间距,组件的宽度就是这个组件的最小宽度加上ipadx值;
8、ipady— 组件间的纵向间距,组件的高度就是这个组件的最小高度加上ipady值。


案例:

public static void main(String[] args) {
        JButton button;
        JFrame frame = new JFrame();
        frame.setSize(300, 300);
        frame.setTitle("GridBagLayout测试");
        frame.setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();

        button = new JButton("Button 1");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridx = 0;
        c.gridy = 0;
        c.ipady = 50;
        frame.add(button, c);

        button = new JButton("Button 2");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 1;
        c.gridx = 1;
        c.gridy = 0;
        frame.add(button, c);

        button = new JButton("Button 3");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 1;
        c.gridx = 2;
        c.gridy = 0;
        frame.add(button, c);

        button = new JButton("Long-Named Button 4");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.ipady = 40; // 在原来的基础上又加了40个单位
        c.gridwidth = 3;
        c.gridx = 0;
        c.gridy = 1;
        frame.add(button, c);

        button = new JButton("5");
        /* 在这里可以把垂直改成水平看效果*/
        c.fill = GridBagConstraints.VERTICAL;
        c.ipady = 0;
        c.weighty = 0.5;
        /*weight是比重,即分配空白的部分,前面所有的组件均没有设置weighty,所以这里的weighty设置成任何值,都是填满空白部分*/
        c.anchor = GridBagConstraints.PAGE_END;
        c.insets = new Insets(10, 0, 0, 0);
        c.gridx = 1;
        c.gridwidth = 2;
        c.gridy = 2;
        frame.add(button, c);

        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setVisible(true);

    }

还剩下最后一个布局CardLayout,我想把这个布局和Swing的ActionListener结合起来,敬请期待~

Logo

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

更多推荐