由GridBagLayout类实现的布局管理器称为网格组布局管理器,它实现了一个动态的矩形网格,这个矩形网格由无数个矩形单元组成,每个组件可以占用一个或多个这样的单元格。
在向由GridBagLayout类管理的容器中添加组件时,需要为每个组件创建一个与之关联的GridBagConstraints类的对象,通过该类中的属性可以设置组件的布局信息;
GridBagConstraints类中各个属性的功能和使用方法:
gridx和gridy属性:属性gridx设置的是X轴(即网格水平方向)的索引值,所以它表示的是组件起始点所在列的索引,属性gridy设置的是Y轴(即网格垂直方向)的索引值,所以它表示的是组件其实点所在行的索引;
gridwidth和gridheight属性:属性gridwidth为组件占用网格组的列数,也可以理解为单元格组件的宽度;属性gridheight为组件占用网格组的行数,也可以理解为单元格为单位组件的高度;
fill属性:属性fill用来设置组件的填充方式:当单元格现实区域的面积大于组件面积时,或者一个组件占用多个单元格时,显示组件可能没有占用所有显示区域,通过设置下面4个属性值来设置组件的填充方式;NONE:即不调整组件大小至填满显示区域;HORIZONTAL:表示只调整组件水平方向的大小(组件宽度);VERTICAL:只调整组件方向的大小(组件高度);BOTH:同时调整组件的宽度和高度至填满显示区域;
anchor属性:用来设置组件在其所在显示区域的显示位置
insets属性:属性用来设置组件四周与单元格边缘之间的最小距离。该属性的类型为Insets,Insets类仅有一个构造方法Insets( int top,int left, int bottom,int right),单位为像素;
ipadx和ipady属性:这两个属性用来修改组件的首选大小,属性ipadx用来修改组件的宽度,属性ipady用来修改组件的高度,如果为正数,则在首选大小的基础上增加指定的宽度和高度,反之如果为负数,则在首选大小的基础上减小指定的宽度和高度。
weightx和weighty属性:这两个属性用来设置网格组的每一行和每一列对额外空间的分布方式。在不设置属性weidhtx和weighty(即采用默认设置)的情况下,当窗体调整到足够大时, 组件四周出现了大片的额外空间;属性weightx用来设置其所在列对额外空间的分布方式,如果在该列中设置了多个weightx属性,则取它们的最大值为该列的分布方式;属性weighty用来设置其所在行对额外空间的分布方式,如果在该行中设置了多个weighty属性,则取它们的最大值为该行的分布方式;
技巧1:在设置网格组的每一行和每一列对额外空间的分布方式时,建议只设置第一行的weightx属性和第一列的weighty属性,这样会方便前期调试和后期维护;
技巧2:在设置网格组的每一行和每一列对额外空间的分布方式时,建议为各个属性按百分比取值;
练习程序:
如图:
/**
* GridBayLayout practise
* author pankai<530911044@qq.com>
*/
package com.jUnion.GridBayLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
public class GridBayLayOut extends JFrame {
/**
* Default version UID
*/
private static final long serialVersionUID = 1L;
public GridBayLayOut() {
setTitle( "GridBagLayout" );
setSize( new Dimension( 400, 300 ) );
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
setResizable( false );
setLocationRelativeTo( null );
setGridBagLayout();
}
private static void build( GridBagConstraints c, int gridx, int gridy, int gridwidth,
int gridheight, int weightx, int weighty ) {
c.gridx = gridx;
c.gridy = gridy;
c.gridwidth = gridwidth;
c.gridheight = gridheight;
c.weightx = weightx;
c.weighty = weighty;
}
private void setGridBagLayout() {
Container c = getContentPane();
c.setLayout( new GridBagLayout() );
GridBagConstraints cons = new GridBagConstraints();
/**
* Create button1, button2, button3, button4,
* and show in the horizontal location( gridy: 0, the first line )
*/
build( cons, 0, 0, 1, 1, 0, 0 );
JButton button1 = new JButton( "button1" );
c.add( button1, cons );
build( cons, 1, 0, 1, 1, 0, 0 );
JButton button2 = new JButton( "button2" );
c.add( button2, cons );
build( cons, 2, 0, 1, 1, 0, 0 );
JButton button3 = new JButton( "button3" );
c.add( button3, cons );
build( cons, 3, 0, 1, 1, 0, 0 );
JButton button4 = new JButton( "button4" );
c.add( button4, cons );
/* gridy: 1, the second line */
cons.fill = GridBagConstraints.HORIZONTAL;
build( cons, 0, 1, 4, 1, 0 , 0 );
JButton button5 = new JButton( "button5" );
c.add( button5, cons );
/* gridy: 2, the third line */
build( cons, 0, 2, 3, 1, 0, 0 );
JButton button6 = new JButton( "button6" );
c.add( button6, cons );
build( cons, 3, 2, 1, 1, 0 , 0 );
JButton button7 = new JButton( "button7" );
c.add( button7, cons );
/* gridy:3, the forth line */
cons.fill = GridBagConstraints.VERTICAL;
build( cons, 0, 3, 1, 2, 0, 0 );
JButton button8 = new JButton( "button8" );
c.add( button8, cons );
cons.fill = GridBagConstraints.HORIZONTAL;
build( cons, 1, 3, 3, 1, 0, 0 );
JButton button9 = new JButton( "button9" );
c.add( button9, cons );
build( cons, 1, 4, 3, 1, 0, 0 );
JButton button10 = new JButton( "button10" );
c.add( button10, cons );
}
public static void main( String[] args ) {
new GridBayLayOut().setVisible( true );
}
}