刚开始学java,之前学的C#,控件都是可以拖放的,十分简单方便可以快速的开发出应用程序!不过现在学的java,控件都是用代码式实现的,这样的话控件的合理布局就是重要的问题了。
第一次接触java的时候买了一本讲java基础知识的书——java语言程序设计基础篇(第8版,基础部分这书还是可以的。不过里面就只介绍
FlowLayout(流布局),GridBagLayout(网格布局),BorderLayout(边界布局)不过这三种布局管理器局限性实在太大
了,在我实际想要做个界面时总给不了我想要的效果!后来师兄告诉了我有个布局管理器叫GridBagLayout!
GridBagLayout不愧被誉为java最强大的布局管理器,基本你想要的布局效果它都能实现。下面为大家简单的介绍GridBagLayout。
GridBagLayout
类是一个灵活的布局管理器,它不要求组件的大小相同便可以将组件垂直、水平或沿它们的基线对齐。每个
GridBagLayout
对象维持一个动态的矩形单元网格,每个组件占用一个或多个这样的单元,该单元被称为显示区域。
每个由 GridBagLayout
管理的组件都与 GridBagConstraints
的实例相关联。Constraints 对象指定组件的显示区域在网格中的具体放置位置,以及组件在其显示区域中的放置方式。除了
Constraints 对象之外,GridBagLayout
还考虑每个组件的最小大小和首选大小,以确定组件的大小。
现在为大家解析一下GridBagLayout的属性,
gridx
public int gridx
指定包含组件的显示区域开始边的单元格,其中行的第一个单元格为
gridx=0。组件显示区域的开始边指的是水平、从左到右容器的左边缘和水平、从右到左容器的右边缘。值
RELATIVE 指定将组件放置在添加此组件之前刚刚添加到容器的组件的后面。
默认值为 RELATIVE。gridx 应为非负值。
gridy
public int gridy
指定位于组件显示区域的顶部的单元格,其中最上边的单元格为 gridy=0。值 RELATIVE 指定将组件放置在添加此组件之前刚刚添加到容器的组件的下面。
默认值为 RELATIVE。gridy 应为非负值。
gridwidth
public int gridwidth
指定在组件显示区域的一行中的单元格数。
使用 REMAINDER 指定组件的显示区域从 gridx 到该行的最后一个单元格。使用 RELATIVE 指定组件的显示区域从 gridx 到它所在行的倒数第二个单元格。
gridwidth 应为非负,默认值为 1。
gridheight
public int gridheight
指定在组件显示区域的一列中的单元格数。
使用 REMAINDER 指定组件的显示区域从 gridy 到该列的最后一个单元格。使用 RELATIVE 指定组件的显示区域从 gridy 到它所在列的倒数第二个单元格。
gridheight 应为非负,默认值为 1。
weightx
public double weightx
指定如何分布额外的水平空间。
网格包布局管理器计算出列的权重就是列的所有组件中最大的 weightx。如果得到的布局在水平方向上比需要填充的区域小,则系统会将额外的空间按照其权重比例分布到每一列。权重为零的列不会得到额外的空间。
如果所有的权重都为零,则所有的额外空间都将出现在单元格的网格之间和左右边缘之间。
此字段的默认值为 0。weightx 应为非负值。
weighty
public double weighty
指定如何分布额外的垂直空间。
网格包布局管理器计算出行的权重就是行的所有组件中最大的 weighty。如果得到的布局在垂直方向上比需要填充的区域小,则系统会将额外的空间按照其权重比例分布到每一行。权重为零的行不会得到额外的空间。
如果所有的权重都为零,则所有的额外空间都将出现在单元格的网格之间和上下边缘之间。
此字段的默认值为 0。weighty 应为非负值。
anchor
public int anchor
当组件小于其显示区域时使用此字段。它可以确定在显示区域中放置组件的位置。
可能的值有两种:相对和绝对。相对值的解释是相对于容器的组件方向属性,而绝对值则不然。绝对值有:CENTER、NORTH、NORTHEAST、EAST、SOUTHEAST、SOUTH、SOUTHWEST、WEST 和 NORTHWEST。相对值有:PAGE_START、PAGE_END、LINE_START、LINE_END、FIRST_LINE_START、FIRST_LINE_END、LAST_LINE_START 和LAST_LINE_END。默认值为 CENTER。
fill
public int fill
当组件的显示区域大于它所请求的显示区域的大小时使用此字段。它可以确定是否调整组件大小,以及如果需要,如何调整。
以下值适用于 fill:
- · NONE:不调整组件大小。
- · HORIZONTAL:加宽组件,使它在水平方向上得以填满其显示区域,但是不改变高度。
- · VERTICAL:加高组件,使它在垂直方向上得以填满其显示区域,但是不改变宽度。
- · BOTH:使组件完全填满其显示区域。
默认值为 NONE。
insets
public Insets insets
此字段指定组件的外部填充,即组件与其显示区域边缘之间间距的最小量。
默认值为 new Insets(0, 0, 0, 0)。 上左下右
ipadx
public int ipadx
此字段指定组件的内部填充,即给组件的最小宽度添加多大的空间。组件的宽度至少为其最小宽度加上 ipadx 像素。
默认值为 0。
ipady
public int ipady
此字段指定内部填充,即给组件的最小高度添加多大的空间。组件的高度至少为其最小高度加上 ipady 像素。
给大家一些使用网格组布局的建议:
1.在纸上画出组件布局草图
2.找出一种网格,小组件被放置在一个单元格内,大组件将横跨多个单元格
3.用0,,1,2....标识网格的行和列,现在可以读取gridx,gridy,gridwidth和gridheight的值
4.对于每个组件,考虑如下问题:是否需要水平或者垂直填充它所在的单元格?如果不需要,那么那么希望如何排列?这些就是fill和anchor参数的设置
接下为大家提供一段代码作为参考
private JPanel p;//主面板
private GridBagLayout g;//布局管理器
private JLabel title; //标题面板
private JLabel pl;//用户图片
private JLabel name;
private JTextField nameinput;//用户名输入框
private JLabel pwd;//密码
private JPasswordField pwdinput;//密码输入框
private JButton btnlogin;//注册
private JButton btnok; //确定
private JButton btnexit;//退出
private Font font; //标题字体
private void
setlocation(JPanel p,JComponent j,GridBagConstraints c,int
gridx,int gridy,
int
gridwidth,int gridheight,Insets a)//设置控件位置
{
c.gridx=gridx;
c.gridy=gridy;
c.gridwidth=gridwidth;
c.gridheight=gridheight;
c.insets=a;
p.add(j,
c);
}
private void setPanel() //设置布局
{
p.setOpaque(false);
setContentPane(p);
title.setFont(font);
ImageIcon
icon=null;
ImageIcon
icon1=null;
icon=new ImageIcon("E:/321.jpg");
Image image=icon.getImage();
Image image1= image.getScaledInstance(90, 70, 0);
icon1=new ImageIcon(image1);
this.pl.setIcon(icon1);
//设置图片
p.setLayout(g);
GridBagConstraints c=new
GridBagConstraints();
setlocation(p,this.title,c,2,0,4,3,new
Insets(0,0,0,0)); //标题
setlocation(p,this.pl,c,1,3,2,3,new
Insets(20,10,0,10)); //照片
setlocation(p,this.name,c,3,3,1,1,new
Insets(30,10,10,10)); //姓名标签
setlocation(p,this.nameinput,c,4,3,1,1,new
Insets(30,10,10,0)); //姓名输入
setlocation(p,this.pwd,c,3,4,1,1,new
Insets(10,10,10,10)); //密码
setlocation(p,this.pwdinput,c,4,4,1,1,new
Insets(10,10,10,0));//密码输入
c.ipadx=10;
setlocation(p,this.btnok,c,2,6,2,1,new Insets(15,-55,0,-70));//
注册按钮
setlocation(p,this.btnexit,c,4,6,1,1,new Insets(15,-80,0,0));//
确定按钮
setlocation(p,this.btnlogin,c,5,6,1,1,new
Insets(15,-40,0,0));//退出的按钮
Toolkit kit=Toolkit.getDefaultToolkit();
//获取默认的工具箱
Dimension sreensize=kit.getScreenSize();
//获取屏幕大小
int x=(sreensize.width-450)/2;
int y=(sreensize.height-310)/2;
this.setLocation(x,y);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(430, 310);
this.setResizable(false);
this.setVisible(true);
}