一、简介
GridBagLayout是一种很先进、很人性化的布局管理器,通过网格的划分,可以看到每个组件都占据一个网格,也可以一个组件占据几个网关。与GridLayout布局管理器不同的是,GridBagLayout是按照开发人员自己的思路来排列控件位置,而GridLayout布局管理器根据系统的安排来布局。如果要采用网格组布局管理器,一般来说可以采用下列步骤:
- 创建一个GridBayLayout对象
- 将容器设成此对象的布局管理器
- 创建约束(GridBagConstrains)对象
- 创建各个相应的组件
- 添加各个组件与约束到网格组布局管理器中
网格组由多个网格组成,而且各个行或者列的宽度不同,但默认情况下,单元格从左上角开始有序列的变化,从第0行,第0列开始计数。
当向网格布局管理器中添加组件时,需要分别定义每个单元格的序列号,只要设定相应的值,那么组件就会添加到网格组布局管理器中。涉及到组件添加到什么位置有4个参数,即
- gridX:组件左上角的所在列
- gridY:组件左上角的所在行
- gridwidth:组件占用的列数
- gridheight:组件占用的行数
网格组布局管理器中每个区域都要设置增量字段(weightx与weighth分别代表x方向和y方向的增量)。如果想让某个区域保持初始化的大小,也就是窗口缩放不会引起组件缩放,那就应该设置该区域的增量为0,相反,如果想让组件能随时完全填充单元格,那增量字段就应该设置为100。这个布局管理器涉及到了两个参数,即fill和anchor
这两个参数都是非常重要的约束,其中当组件不能填满单元格时,fill
参数就可以发挥作用。改约束的值主要有以下几种。
- GridBagConstraints.NONE:在每个方向都不填充,即保持原状
- GridBagConstraints.HORIZONTAL:只在水平方向上填充
- GridBagConstraints.VERTICAL:只在垂直方向上填充
- GridBagConstraints.BOTH:在两个方向上都填充
而anchor参数则是当一个组建大于分配给它的单元格时发挥作用,改约束就是如何处理该组件,有以下取值
- GridBagConstraints.EAST:右侧缩小
- GridBagConstraints.CENTER:居中缩小
- GridBagConstraints.NORTH:顶部缩小
- GridBagConstraints.NORTHEAST:左上角缩小
GridBagLayout布局管理器的构造器只有一种,就是不带参数的构造器,这里不再列举。
二、实例
package phonebook;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.LayoutManager;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
//这是一个登陆类,设计成一个继承容器的类
public class loggins extends JPanel {
/**
*
*/
private static final long serialVersionUID = 1L;
//WIDTH是整个顶层框架的宽度
//HEIGHT是整个顶层框架的长度
static final int WIDTH=300;
static final int HEIGHT=150;
JFrame loginframe;
/**
* 构造器方法
*/
public loggins() {
// TODO Auto-generated constructor stub
loginframe=new JFrame(); //登陆界面的框架
loginframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //是一个使得窗口上面的关闭按钮有ixaode类库方法
GridBagLayout lay=new GridBagLayout(); //网格组布局管理器实例
setLayout(lay);
loginframe.add(this,BorderLayout.WEST);
loginframe.setSize(WIDTH, HEIGHT); //设置窗口的大小
Toolkit kit=Toolkit.getDefaultToolkit(); //通过下面的代码来设置登录窗口的位置
Dimension screenSize=kit.getScreenSize();
int width=screenSize.width;
int height=screenSize.height;
int x=(width-WIDTH)/2;
int y=(height-HEIGHT)/2;
loginframe.setLocation(x, y);
JButton ok=new JButton("登录");
JButton cancel=new JButton("取消");
JLabel title=new JLabel("通讯簿系统登陆窗口");
JLabel name=new JLabel("用户名");
JLabel password=new JLabel("密 码");
final JTextField nameinput=new JTextField(15);
final JTextField passwordinput=new JTextField(15);
GridBagConstraints constrains=new GridBagConstraints(); //设置网格组布局管理器的参数
constrains.fill=GridBagConstraints.NONE;
constrains.anchor=GridBagConstraints.EAST;
constrains.weightx=4;
constrains.weighty=4;
add(title,constrains,2,0,2,1);
add(name,constrains,1,1,2,1);
add(password,constrains,1,2,2,1);
add(nameinput,constrains,3,1,2,1);
add(passwordinput,constrains,3,2,2,1);
add(ok,constrains,1,3,1,1);
add(cancel,constrains,3,3,1,1);
loginframe.setResizable(false);
loginframe.setVisible(true);
/**
* 此方法用来添加控件到容器中
* 按照网络组布局方式排列组件的方法
* @param x 控件位于第几列
* @param y 控件位于第几行
* @param w 控件需要占几列
* @param h 控件需要占几行
*/
public void add(Component c,GridBagConstraints constrains,int x,int y,int w,int h) {
constrains.gridx=x;
constrains.gridy=y;
constrains.gridwidth=w;
constrains.gridheight=h;
add(c,constrains);
}
}
public class login {
public static void main(String[] args) {
new loggins();
}
}
运行结果