JAVA中的一个布局管理器——GridBagLayout

来源:互联网 发布:阿里云公共dns地址 编辑:程序博客网 时间:2024/05/22 06:13

学JAVA已经有三个多月了,真是酸甜苦辣,自己体会。前几天时间碰到了一个问题,花了老长时间才弄明白(帮助文档看不懂,可能是因为自己比较笨的缘故);它,就是我们可爱的布局管理器GridBagLayout;今天又玩了一天,剩下点时间就整理整理这让我郁闷好几天的GridBagLayout吧,也许能帮上和我一样正在JAVA中苦苦挣扎的兄弟姐妹一点点小忙;先申明一下,这片文章是给和我一样傻的孩子看的,正常人就不要停在这里浪费时间了。

    那我们现在就开始了。

    GridBagLayout布局管理器是一个非常灵活的布局,一看名字大家都知道它是基于GridLayout基础之上的,单位自然就按网格算了,它允许部件占有一个或者多个显示单元,也就是网格。它所管理的行和列可以是大小都不相同的,GridLayout把每个组件限制到一个单元格,而GridBagLayout并不这样,它的组件在容器中可以占据任意大小的矩形区域。

    GridBagLayout中有一个类叫作GridBagConstraints,这个类中的所有成员都是public的,GridBagLayout就是利用它来管理组件。

    下面是GridBagConstraints中的公有成员变量
     public int anchor         对齐方式。
     public int fill           描述当容器变形时,控制组件是否增长。
     public gridheight         描述了组件所占网格的个数,gridheight描述在纵向上所占网格的个数
     Public gridweight         描述在横向上所占网格的个数。
     public girdx              描述组件在布局时应处于那个网格位置,即描述网格x轴开始的位置。
     public gridy              同样是网格开始的位置,gridy为y轴上开始的位置。
     public Insets insets      用来调整它周围的空间大小。
     public int ipadx          组件最小尺寸的约束条件。
     public int ipady          组件最小尺寸的约束条件。
     public double weightx     描述当容器变形时,单元格本身在x轴上(横向上)如何缩放。
     public double weighty     描述当容器变形时,单元格本身在y轴上(纵向上)如何缩放。
    
     很多是不是,呵呵,不多它怎么强大?下面我们来看一个实例:

     每次我们开始用GridBagLayout布局时最好画一张草图,如果偷懒或者已经达到一定境界,那么在你的头脑中一定要有一张完成的效果图,为了方便大家理解,下面是我画的一个效果图:(pic1)

     (pic1)


     
     效果图也看了,我想大家也应该知道我想做什么了,哦科,现在给代码;

 

import java.awt.*;
import javax.swing.*;

public class TT extends JPanel
{
    
public TT()
 
{
  
  
this.setLayout(new GridBagLayout());  //用匿名类创建GridBagLayout对象
  GridBagConstraints c = new GridBagConstraints();
                
//constraints对象用来管理组件,指定组件的位置,占几个网格,是否可伸缩等
  JLabel lab1 = new JLabel("User Name:"); //实例化一个标签
  c.gridx = 0;  
  c.gridy 
= 0//从草稿中我们可以看到标签lab1是从位于x,y轴都等于0的位置开始的
  c.gridwidth = 1;  //标签lab1横向上所占网格的个数
  c.gridheight = 1//标签lab1纵向上所占网格的个数
  this.add(lab1,c); //将标签lab1添加到JPanel上
  
  JTextField tF1 
= new JTextField(10);
  c.gridx 
= 1;
  c.gridy 
= 0;
  c.gridwidth 
= 1;
  c.gridheight 
= 1;
  
this.add(tF1,c);
  
  JLabel lab2 
= new JLabel("Password:");
  c.gridx 
= 0;
  c.gridy 
= 1;
  c.gridwidth 
= 1;
  c.gridheight 
= 1;
  
this.add(lab2,c);
  
  JPasswordField psw 
= new JPasswordField(10);
  c.gridx 
= 1;
  c.gridy 
= 1;
  c.gridwidth 
= 1;
  c.gridheight 
= 1;
  
this.add(psw,c);
  
  JTextField tF2 
= new JTextField("Ted's GridBagLayout Test",20);
  tF2.setEditable(
false); //设置JTextField是否可编辑,false为不可编辑
  c.gridx = 0;
  c.gridy 
= 2;
  c.gridwidth 
= 2;
  c.gridheight 
= 1;
  
this.add(tF2,c);
  
  JTextArea tA 
= new JTextArea(5,20);
  c.gridx 
= 0;
  c.gridy 
= 3;
  c.gridwidth 
= 2;
  c.gridheight 
= 1;
  
this.add(tA,c);
  
    
  
    }

 
public static void main (String args[])
 
{
  JFrame JF 
= new JFrame("GridBagLayout GUI");
                JPanel p 
= new TT();
                JF.getContentPane().add(p);
                JF.pack();
                JF.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
                JF.setSize(
325,230);
                JF.setVisible(
true);

 }

}

 

    编译完成后执行,最终效果:(pic2)

    (pic2)

    呵呵,跟我们的草稿一样吧。是不是看的还是有点不爽,眼睛,鼻子,眉毛都挤一块了?嘿嘿,再加一句:

    c.insets = new Insets (4,4,4,4);  //new Insets(int top,int left,int bottom,int right)

    我这里设的都是4个像素。

    再看下最终结果:(pic3)

    (pic3)

    是不是爽了?呵呵,我看了也很爽!

    好了,就说这么多吧,其他的属性相信大家再看jdk doc应该没有什么问题了,自己慢慢研究吧,如果谁愿意分享一下自己的成果,就跟一下帖,完善一下,在下感激不尽.

    最后,指正,批评! 

原创粉丝点击