Java Swing——GridBagLayout

一、简介

    GridBagLayout是一种很先进、很人性化的布局管理器,通过网格的划分,可以看到每个组件都占据一个网格,也可以一个组件占据几个网关。与GridLayout布局管理器不同的是,GridBagLayout是按照开发人员自己的思路来排列控件位置,而GridLayout布局管理器根据系统的安排来布局。如果要采用网格组布局管理器,一般来说可以采用下列步骤:

  1. 创建一个GridBayLayout对象
  2. 将容器设成此对象的布局管理器
  3. 创建约束(GridBagConstrains)对象
  4. 创建各个相应的组件
  5. 添加各个组件与约束到网格组布局管理器中

    网格组由多个网格组成,而且各个行或者列的宽度不同,但默认情况下,单元格从左上角开始有序列的变化,从第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();
    }
}

运行结果


这里写图片描述

猜你喜欢

转载自blog.csdn.net/chenyonken/article/details/80890752