加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

总结几种常用的GUI布局

(2011-04-13 14:50:47)
标签:

杂谈

 

(1) 布局:决定容器内的各个组件的摆放状态(组件大小及相对位置等),它由布局管理器来控制,container的默认管理器是BorderLayout。

(2)使用指定的布局方式:创建指定布局方式类的对象,然后调用容器类的setLayout()方法来指定所需的布局方式。例:setLayout(new FlowLayout());

ps:一般Java中默认采用相对定位布局,如需要使用绝对定位布局,则应该取消容器的布局方式(setLayout(null)),然后使用 setLocation() setSize() setBounds()设置组件的大小及位置。

(3)下面分别对几种布局方式的编程加以说明。

先说课本上出现的:

1、Flowlayout

默认为从上到下从左到右依次摆放,每行均居中,自动换行,也可设置对齐方式,它是Panel、Applet的缺省布局。

 组件顺序和尺寸不随窗口变化而变化。

 

2、BorderLayout

将容器内的空间划分为东、南、西、北、中五个方位,并指明组件所在的方位,它是Window、Dialog、Frame的缺省布局方式。

 north与south有确定的高度,west与east有确定的宽度。

 

3、GridLayout

行列网格状布局。

这种布局方式首先放一个容纳单元的栅格,元件放到这个网格的单元个中,GridLayout构造方法:

 

GridLayout(int row,int col)

GridLayout(int row,int col,int hGap,int vGap)

 

其中:row:行数

      col: 列数

      如果某个值为零,表示这个方向可以任意扩展。

      HGap、vGap表示以象素为单位的元件间隔。

 

元件总是充满单元格,而且随着边框的变化而变化。 

 

补充几个课外的:

4、CardLayout

卡片叠式布局。

这种布局方式,可以用来管理两个或者更多共享同一显示区域的元件。它具有以下两个构造方法:

 

CardLayout()

CardLayout(int hGap,int vGap)

 

 

样例:

 

package demo;

 

import java.awt.*;

import java.awt.event.*;

import java.*;

import java.lang.*;

 

public class GuiDemo extends Frame {

 

  //构造一个容器,放置可变的元件

  Panel cardContainer=new Panel();

 

  //构造函数的参数为长度

  TextField jTextField1 = new TextField(30);

  Button jButton1 = new Button();

  Button jButton2 = new Button();

  Button jButton3 = new Button();

 

  //列表框

  Choice c=new Choice();

 

  String ca1="按钮";

  String ca2="正文域";

 

  //构造函数

  public GuiDemo() {

    jbInit();

  }

 

  //开始代码

  public static void main(String[] args) {

 

    GuiDemo frame = new GuiDemo();

    //显示元件

    frame.setVisible(true);

   

  }

 

  //初始化代码,这里踢出了错误

 private void jbInit()

 {

      //激活Windows事件

      enableEvents(AWTEvent.WINDOW_EVENT_MASK);

 

    //设置窗口的标题,大小与布局

    setTitle("元件加入的程序演示");

    setSize(new Dimension(300, 200));

   

    //所有的元件都按顺序方式布局

 

    this.setLayout(new BorderLayout(0,3));

 

    jTextField1.setText("您好");

   

    jButton1.setLabel("按钮1-1");

    jButton2.setLabel("按钮1-2");

    jButton3.setLabel("按钮1-3");

 

    //列表框赋初值

    c.add(ca1);

    c.add(ca2);

   

    //构造下拉列表改变的事件侦听器

    c.addItemListener(new java.awt.event.ItemListener()

        {

           public void itemStateChanged(ItemEvent e)

           {myItem(e);}

          

           }

    );

  

    //构造一个容器放列表框

    Panel globarPanel=new Panel();

    globarPanel.add(c);

    this.add("North",globarPanel);

  

    //cardContainer按CardLayout布局

 

    cardContainer.setLayout(new CardLayout());

     

    Panel p1=new Panel();

    p1.add(jButton1);

    p1.add(jButton2);

    p1.add(jButton3);

 

    Panel p2=new Panel();

    p2.add(jTextField1);

 

    //把两个容器都加入     

    cardContainer.add(ca1,p1);

    cardContainer.add(ca2,p2);

   

    this.add("Center",cardContainer);

 

       

 

    }

  

 

  //这是下拉列表改变的事件程序

 

   void myItem(ItemEvent e)

   {

    

         ((CardLayout)cardContainer.getLayout()).show(

                cardContainer,(String)e.getItem());      

         

   }

 

  

    //这是检测退出程序的的事件,没有这个事件窗口将无法关闭

   protected void processWindowEvent(WindowEvent e) {

    super.processWindowEvent(e);

    if (e.getID() == WindowEvent.WINDOW_CLOSING) {

      System.exit(0);

    }

  }

}

 

5、GridBayLayout

自定义网格状布局。

      GridBagLayout是所有AWT布局管理器当中最复杂的,同时他的功能也是最强大的.这种现象源于它所提供的众多的可配置选项,你几乎可以完全地控制容器的布局方式.尽管复杂性很明显,只要理解了基本思想,就很容易使用GridBagLayout了.
      GridBagLayout从它的名字中你也可以猜到,它同GridLayout一样,在容器中以网格形式来管理组件.但GridBagLayout功能要来得强大得多.
      1、GridBagLayout管理的所有行和列都可以是大小不同的.
      2、GridLayout把每个组件限制到一个单元格,而GridLayout并不这样:组件在容器中可以占据任意大小的矩形区域,
      GridBagLayout通常由一个专用类来对他布局行为进行约束,该类叫GridBagConstraints.其中的所有成员都是public的, 因此要学好如何使用GridBagLayout首先要了解有那些约束变量,以及如何设置这些约束变量.

以下是GridBagConstraints的公有成员变量
 

  public int anchor
  public int fill
  public gridheight
  Public gridweight
  public girdx
  public gridy
  public Insets insets
  public int ipadx
  public int ipady
  public double weightx
  public double weighty
     

     看起来有很多约束需要进行设置,但事实上许多约束只需设置一次,并对多个组件重用,每次添加组件时只有少数的项需要修改.

常用构造:  public GridBagLayout()

 

样例:

 

package demo;

 

import java.awt.*;

import java.awt.event.*;

import java.*;

import java.lang.*;

 

public class GuiDemo extends Frame {

 

 

  //构造函数

  public GuiDemo() {

    jbInit();

  }

 

 

  //开始代码

  public static void main(String[] args) {

 

    GuiDemo frame = new GuiDemo();

   

    frame.setTitle("元件加入的程序演示");

    frame.setSize(300,200);

    //显示元件

    frame.setVisible(true);

   

  }

 

 

  public void makebutton(

                String name,

                GridBagLayout  gridbag,

                GridBagConstraints c)

  {

      Button button=new Button(name);

      gridbag.setConstraints(button,c);

      this.add(button);

     

  }

 

     

 

  //初始化代码

 private void jbInit()

 {

      //激活Windows事件

      enableEvents(AWTEvent.WINDOW_EVENT_MASK);

 

    GridBagLayout gridbag=new GridBagLayout();

      GridBagConstraints c=new GridBagConstraints();

     

      this.setFont(new Font("宋体",Font.PLAIN,11));

      this.setLayout(gridbag);

     

      c.fill=GridBagConstraints.BOTH;

      c.weightx=1.0;

     

      makebutton("Bt1",gridbag,c);

      makebutton("Bt2",gridbag,c);

      makebutton("Bt3",gridbag,c);

     

      c.gridwidth=GridBagConstraints.REMAINDER;

    makebutton("Bt4",gridbag,c);

     

    c.weightx=0.0;

    makebutton("Bt5",gridbag,c);

   

    c.gridwidth=GridBagConstraints.RELATIVE;

    makebutton("Bt6",gridbag,c);

   

      c.gridwidth=GridBagConstraints.REMAINDER;

    makebutton("Bt7",gridbag,c);

      

    c.gridwidth=1;

    c.gridheight=2;

    c.weighty=1.0;

    makebutton("Bt8",gridbag,c);

 

    c.weighty=0.0;

    c.gridwidth=GridBagConstraints.REMAINDER;

    c.gridheight=1;

    makebutton("Bt9",gridbag,c);

    makebutton("Bt10",gridbag,c);

   

    }

  

  

     //这是检测退出程序的的事件,没有这个事件窗口将无法关闭

   protected void processWindowEvent(WindowEvent e) {

    super.processWindowEvent(e);

    if (e.getID() == WindowEvent.WINDOW_CLOSING) {

      System.exit(0);

    }

  }

}

 

(凌霄)

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有