关于GridBagLayout

使用Java开发GUI难免会用到布局管理器,特别是对于JPanel这样的中间容器来说,更是必不可少的。布局管理器也有好多种,其中GridBagLayout使用比较灵活多变。习惯了MFC中直接拖拽的形式开发GUI,在JAVA中虽然也有拖拽的形式生成的GUI,但是生成的GUI感觉怪怪的。

使用背景:在开发应用程序过程中,需要设计一个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,值越大表明该组件所需空间越多。

二、使用实例

  1. JPanel controlPanel = new JPanel(); 
  2. controlPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.black,2), "操作区", TitledBorder.CENTER, TitledBorder.TOP)); 
  3. controlPanel.setPreferredSize(new Dimension(200,512)); 
  4.  
  5. GridBagLayout gridbag = new GridBagLayout(); 
  6. GridBagConstraints c = new GridBagConstraints(); 
  7. controlPanel.setLayout(gridbag); 
  8. c.fill = GridBagConstraints.HORIZONTAL; 
  9. JButton button; 
  10. button = new JButton("打开文件"); 
  11. c.ipady = 20;     // 增加该组件的高度  
  12. c.weightx = 0.5// 后面两个按钮没有改变weightx 的值,则使用这个值 
  13. c.gridx = 0
  14. c.gridy = 0;    // 占据第0 行0 列 
  15. c.insets = new Insets(0,0, 10,0); 
  16. gridbag.setConstraints(button, c); 
  17. controlPanel.add(button); 
  18.  
  19. button = new JButton("名字很长的第四个按钮"); 
  20. c.ipady = 20;     // 增加该组件的高度 
  21. c.gridx = 0
  22. c.gridy = 1;    // 第1 行0 列 
  23. c.gridwidth = 1;    // 但占据3 列的宽度  
  24. gridbag.setConstraints(button, c); 
  25. controlPanel.add(button); 
  26. button = new JButton("五"); 
  27. c.ipady = 20;     // 设置 ipady 为0,若不设置则为前面的40  
  28. c.weighty = 1.0;    // 使组件占据尽可能多的空间 
  29. c.anchor = GridBagConstraints.SOUTH; // 放置在空间的下方  
  30. // 使用 Inserts 填充,创建Inserts 对象是参数的顺序是top, left, bottom, right , 
  31. // 即按逆时针方向下面的创建的对象使用10个像素单元填充上部空间  
  32. c.insets = new Insets(0,0, 0,0); 
  33. c.gridx = 0
  34. c.gridy = 2;    // 占据第2 行第 1 列 
  35. //c.gridwidth = 3;    // 但占据2 列的宽度  
  36. gridbag.setConstraints(button, c); 
  37. controlPanel.add(button); 
  38.  
  39. 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; // 放置在空间的下方

·

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值