GridBagLayout使用心得

Java有很多布局管理器,但是感觉都不够灵活,程序的界面一般都不可能那么简单,相比之下GridBagLayout好像灵活很多,但是也复杂一些,稍微研究了一下,有一些小心得,不正确的地方希望大神指正。

GridBagLayout需要配合一个GridBagConstraints对象来使用,GridBagConstraints就是复杂的地方,它表示了组件摆放的所有细节。

用两个panel展示效果

JPanel screen = new JPanel();
JPanel input  = new JPanel();
input.setBackground(Color.black);
screen.setBackground(Color.red);

创建GridBagLayout布局管理器

GridBagLayout con_layout = new GridBagLayout();
GridBagConstraints  con_layout_constraints = new GridBagConstraints();

所有属性均为默认值时的效果
所有属性都是默认值时,两个panel均显示最小,而且横向排列在程序中间。

  • GridBagConstraints.fill

    当组件的显示区域大于组件的所需大小时,用于确定是否(以及如何)调整组件。可能的值为 GridBagConstraints.NONE(默认值)、GridBagConstraints.HORIZONTAL(加宽组件直到它足以在水平方向上填满其显示区域,但不更改其高度)、GridBagConstraints.VERTICAL(加高组件直到它足以在垂直方向上填满其显示区域,但不更改其宽度)和 GridBagConstraints.BOTH(使组件完全填满其显示区域)。

    它可以使组件填充满它自身的显示区域。添加下面一句代码

con_layout_constraints.fill = GridBagConstraints.BOTH;

所有属性均为默认值时的效果
但是并没有什么卵变化。
这是因为,虽然组件设置了填充属性,但是组件的显示区域并没有变大。也就是说提供给panel显示的区域实际上就只有那么大,即使填充满了也还是那么大。

  • GridBagConstraints.weightx、GridBagConstraints.weighty

    用于确定分布空间的方式,这对于指定调整行为至关重要。除非在行 (weightx) 和列 (weighty) 中至少指定一个组件的权重,否则所有组件都会聚集在其容器的中央。这是因为,当权重为零(默认值)时,GridBagLayout 对象会将所有额外空间置于其单元网格和容器边缘之间。

    它控制显示区域的大小,按权重将剩余空间分配为指定组件的显示区域。

con_layout_constraints.weightx = 1.0;

上面的代码在横向把剩余空间,全部分配给当前组件;
这里写图片描述
当只有一个组件的时候它占据整个x方向,多个则均分。

con_layout_constraints.weighty = 0.25;
con_layout.setConstraints(screen,con_layout_constraints);
con_layout_constraints.weighty = 1.0;
con_layout.setConstraints(input, con_layout_constraints);

在纵向给第一个组件分配剩余空间的0.25,其余的全部分配给第二个组件。也就是说,第一个组件占1/4,第二个组件占3/4。其值的大小永远是基于剩余空间的权重来计算的,所以,如果两个组件如果对等分,应该是0.5,1;三个组件等分应该是0.33,0.5,1;以此类推。

不好意思只有一列,看不出效果

  • GridBagConstraints.gridwidth、GridBagConstraints.gridheight

    指定组件的显示区域中行(针对 gridwidth)或列(针对 gridheight)中的单元数。默认值为 1。使用 GridBagConstraints.REMAINDER 指定组件的显示区域,该区域的范围是从 gridx 到该行(针对 gridwidth)中的最后一个单元,或者从 gridy 到该列(针对 gridheight)中的最后一个单元。 使用 GridBagConstraints.RELATIVE 指定组件的显示区域,该区域的范围是从 gridx 到其所在行(针对 gridwidth)的倒数第二个单元,或者从 gridy 到其所在列(针对 gridheight)的倒数第二个单元。

    设置显示区域的大小,也就是占用多少行,多少列。但是由于GridBagLayout并没有指定总共有多少行,多少列,所以这个属性看起来更像是指定显示区域的排布方式,即纵向还是横向(当然它真的是前者那样,后面这个只是表现起来像而已)。

con_layout_constraints.gridwidth = GridBagConstraints.REMAINDER;

在第一个组件前添加

它让第一个组件横向填满第一行,所以第二个组件自动的到了下一行,这样之前设置的按比例分panel的效果也显示出来了。

暂时了解了那么多,剩下的以后用到再说

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值