Java Swing面板布局之网格袋布局GridBagLayout

一、简介

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");

            //btn02btn03GridBagLayout放到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);

    }

}

 

  • 1
    点赞
  • 5
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页
评论

打赏作者

跨行小菜鸟

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值