现在的位置: 首页 > 综合 > 正文

版面管理器(Layout Menager)

2012年03月16日 ⁄ 综合 ⁄ 共 14283字 ⁄ 字号 评论关闭

前声明:

http://blog.csdn.net/heimaoxiaozi/archive/2007/01/19/1487884.aspx

1-3:版面管理器(Layout Menager)

         |BorderLayout

         |FlowLayout

         |GridLayout

  AWT----|CardLayout

         |GridBagLayout

  Swing--|BoxLayout

1-3-1:BorderLayout的使用:

   BorderLayout的类层次结构图:

       java.lang.Object

        --java.awt.BorderLayout

   构造函数:BorderLayout()建立一个没有间距的border layout

             BorderLayout(int hgap,int vgap)建立一个组件间有间距的border layout

  BorderLayout将版面划分为东、西、南、北、中

例子:BorderLayoutDemo.java

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class BorderLayoutDemo{

   public BorderLayoutDemo(){

     JFrame f=new JFrame();

        Container contentPane=f.getContentPane();

        contentPane.setLayout(new BorderLayout());

        contentPane.add(new JButton("EAST"),BorderLayout.EAST);

        contentPane.add(new JButton("WEST"),BorderLayout.WEST);

        contentPane.add(new JButton("SOUTH"),BorderLayout.SOUTH);

        contentPane.add(new JButton("NORTH"),BorderLayout.NORTH);

        contentPane.add(new JLabel("CENTER",JLabel.CENTER),BorderLayout.CENTER);

        f.setTitle("BorderLayout");

        f.pack();

        f.setVisible(true);

        /***read**/

        /*处理关闭窗口的操作,若你没写这一段,就算你已经关闭窗口了,但程序并不会终止。

         */

        f.addWindowListener(

           new WindowAdapter(){

               public void windowClosing(WindowEvent e){

                  System.exit(0);

               }

           }

        );

       /***read**/

   }

   public static void main(String[] args){

     BorderLayoutDemo b=new BorderLayoutDemo();

   }

}

   设置组件的间距,你可以使用有间距参数的BorderLayout构造函数,也可以利用BorderLayout的setHgap(int hgap)与

   setVgap(int vgap)两个方法来达成。

1-3-2:FlowLayout的使用:

   FlowLayout的类层次结构图:

       java.lang.Object

        --java.awt.FlowLayout

   构造函数:FlowLayout()建立一个新的Flow Layout,此FlowLayout默认值是居中对齐,组件彼此有5单位的水平与垂直间距。

             FlowLayout(int align)建立一个新的Flow Layout,此FlowLayout可设置排列方式,组件彼此有5单位的水平与垂直

                                 间距。

             FlowLayout(int align,int hgap,int vgap)建立一个新的Flow Layout,此FlowLayout可设置排列方式与组件间距。

FlowLayoutDemo.java

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class FlowLayoutDemo{

   public FlowLayoutDemo(){

     JFrame f=new JFrame();

        Container contentPane=f.getContentPane();

        /*你可以使用有间距的FlowLayout构造函数,使FlowLayout的排列具有间距,并

         *并可利用排列方向参数来指定靠什么方向排列,FlowLayout共有五种排列方式,

         *依次是CENTER(默认值),LEFT,RIGHT,LEADING,TRAILING,若我们将下面程序第13

         *行改成contentPane.setLayout(new FlowLayout(FlowLayout.LEFT));                          

         */

        contentPane.setLayout(new FlowLayout());       

        contentPane.add(new JButton("first"));

        contentPane.add(new JButton("second"));

        contentPane.add(new JButton("third"));

        contentPane.add(new JButton("fourth"));

        contentPane.add(new JButton("fifth"));

        contentPane.add(new JButton("Last"));

       

        f.setTitle("FlowLayout");

        //f.pack();//必须将f.pach()去掉,否则setSize功能将没有作用

        f.setSize(400,220);

        f.setVisible(true);

        f.addWindowListener(

           new WindowAdapter(){

               public void windowClosing(WindowEvent e){

                  System.exit(0);

               }

           }

        );

   }

   public static void main(String[] args){

     FlowLayoutDemo b=new FlowLayoutDemo();

   }

}

1-3-3:GridLayout的使用:

       GridLayout的类层次结构图:

       java.lang.Object

        --java.awt.GridLayout

    GridLayout比FlowLayout多了行和列的设置,也就是说你要先设置GridLayout共有几行几列,就如同二维平面一般,然后你加

进去的组件会先填第一行的格子,然后再从第二行开始填,依此类扒,就像是一个个的格子一般。而且GridLayout会将所填进去组

件的大小设为一样。

构造函数:GridLayout()建立一个新的GridLayout,默认值是1行1列。

          GridLayout(int rows,int cols)建立一个几行几列的GridLayout.

          GridLayout(int rows,int cols, int hgap,int vgap)建立一个几行几列的GridLayout,并设置组件的间距。

例子:GridLayoutDemo.java

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class CardLayoutDemo implements ActionListener{

  JPanel p1,p2,p3,p4;

  int i=1;

  JFrame f;

  public CardLayoutDemo(){

    f=new JFrame();//当做top-level组件

      Container contentPane=f.getContentPane();

      contentPane.setLayout(new GridLayout(2,1));

     

      p1=new JPanel();

      Button b=new Button("Change Card");

      b.addActionListener(this);//当按下"Change Card"时,进行事件监听,将会有系统操作产生。

      p1.add(b);                //处理操作在52-64行.

      contentPane.add(p1);

     

      p2=new JPanel();

      p2.setLayout(new FlowLayout());

      p2.add(new JButton("first"));

      p2.add(new JButton("second"));

      p2.add(new JButton("third"));

     

      p3=new JPanel();

      p3.setLayout(new GridLayout(3,1));

      p3.add(new JButton("fourth"));

      p3.add(new JButton("fifth"));

      p3.add(new JButton("This is the last button"));

     

      p4=new JPanel();

      p4.setLayout(new CardLayout());

      p4.add("one",p2);

      p4.add("two",p3);

      /*要显示CardLayout的卡片,除了用show(Container parent,String name)这个方法外

       *,也可试试first(Container),next(Container),previous(Container),last(Container)这

       *四个方法,一样可以达到显示效果。

       */

      ((CardLayout)p4.getLayout()).show(p4,"one");

     

      contentPane.add(p4);

     

      f.setTitle("CardLayout");

      f.pack();

      f.setVisible(true);

     

      f.addWindowListener(

           new WindowAdapter(){

               public void windowClosing(WindowEvent e){

                  System.exit(0);

               }

           }

      );

     

  }

  public void actionPerformed(ActionEvent event){

     switch(i){

        case 1:

             ((CardLayout)p4.getLayout()).show(p4,"two");

             break;

        case 2:

             ((CardLayout)p4.getLayout()).show(p4,"one");

             break;

     }

     i++;

     if (i==3) i=1;

     f.validate();

  }

  public static void main(String[] args){

  new CardLayoutDemo();

  }

}

1-3-5:GridBagLayout的使用:是java中最有弹性但也是最复杂的一种版面管理器。它只有一种构造函数,但必须配合

                           GridBagConstraints才能达到设置的效果。

    GridBagLayout的类层次结构图:

    java.lang.Object

     --java.awt.GridBagLayout

构造函数:

    GirdBagLayout()建立一个新的GridBagLayout管理器。

    GridBagConstraints()建立一个新的GridBagConstraints对象。

    GridBagConstraints(int gridx,int gridy,int gridwidth,int gridheight,double weightx,double weighty,

                       int anchor,int fill, Insets insets,int ipadx,int ipady)建立一个新的GridBagConstraints对象

                      ,并指定其参数的值。

参数说明:

gridx,gridy:设置组件的位置,gridx设置为GridBagConstraints.RELATIVE代表此组件位于之前所加入组件的右边。

             若将gridy设置为GridBagConstraints.RELATIVE代表此组件位于以前所加入组件的下面。建议定义出

             gridx,gridy的位置,以便以后维护程序。表示放在几行几列,gridx=0,gridy=0时放在0行0列。

gridwidth,gridheight:用来设置组件所占的单位长度与高度,默认值皆为1。你可以使用GridBagConstraints.REMAINDER常

                      量,代表此组件为此行或此列的最后一个组件,而且会占据所有剩余的空间。

weightx,weighty:用来设置窗口变大时,各组件跟着变大的比例,当数字越大,表示组件能得到更多的空间,默认值皆为0。

anchor:         当组件空间大于组件本身时,要将组件置于何处,有CENTER(默认值)、NORTH、NORTHEAST、EAST、SOUTHEAST、

                 WEST、NORTHWEST可供选择。

insets:设置组件之间彼此的间距,它有四个参数,分别是上,左,下,右,默认为(0,0,0,0).

ipadx,ipady:设置组件内的间距,默认值为0。             

   我们以前提过,GridBagLayout里的各种设置都必须通过GridBagConstraints,因此当我们将GridBagConstraints的参数都设置

好了之后,必须new一个GridBagConstraints的对象出来,以便GridBagLayout使用。

例子:

GridBagLayoutDemo.java

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class GridBagLayoutDemo{

   public GridBagLayoutDemo(){

     JButton b;

     GridBagConstraints c;

     int gridx,gridy,gridwidth,gridheight,anchor,fill,ipadx,ipady;

     double weightx,weighty;

     Insets inset;

    

     JFrame f=new JFrame();

    

     GridBagLayout gridbag=new GridBagLayout();

       Container contentPane=f.getContentPane();

       contentPane.setLayout(gridbag);

      

       b=new JButton("first");

       gridx=0;

       gridy=0;

       gridwidth=1;

       gridheight=1;

       weightx=10;

       weighty=1;

       anchor=GridBagConstraints.CENTER;

       fill=GridBagConstraints.HORIZONTAL;

       inset=new Insets(0,0,0,0);

       ipadx=0;

       ipady=0;

       c=new GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor,

          fill,inset,ipadx,ipady);

       gridbag.setConstraints(b,c);

       contentPane.add(b);

      

      

       b=new JButton("second");

       gridx=1;

       gridy=0;

       gridwidth=2;

       gridheight=1;

       weightx=1;

       weighty=1;

       anchor=GridBagConstraints.CENTER;

       fill=GridBagConstraints.HORIZONTAL;

       inset=new Insets(0,0,0,0);

       ipadx=50;

       ipady=0;

       c=new GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor,

          fill,inset,ipadx,ipady);

       gridbag.setConstraints(b,c);

       contentPane.add(b);

       b=new JButton("third");

       gridx=0;

       gridy=1;

       gridwidth=1;

       gridheight=1;

       weightx=1;

       weighty=1;

       anchor=GridBagConstraints.CENTER;

       fill=GridBagConstraints.HORIZONTAL;

       inset=new Insets(0,0,0,0);

       ipadx=0;

       ipady=50;

       c=new GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor,

          fill,inset,ipadx,ipady);

       gridbag.setConstraints(b,c);

       contentPane.add(b);

      

       b=new JButton("fourth");

       gridx=1;

       gridy=1;

       gridwidth=1;

       gridheight=1;

       weightx=1;

       weighty=1;

       anchor=GridBagConstraints.CENTER;

       fill=GridBagConstraints.HORIZONTAL;

       inset=new Insets(0,0,0,0);

       ipadx=0;

       ipady=0;

       c=new GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor,

          fill,inset,ipadx,ipady);

       gridbag.setConstraints(b,c);

       contentPane.add(b);

       b=new JButton("This is the last button");

       gridx=2;

       gridy=1;

       gridwidth=1;

       gridheight=2;

       weightx=1;

       weighty=1;

       anchor=GridBagConstraints.CENTER;

       fill=GridBagConstraints.HORIZONTAL;

       inset=new Insets(0,0,0,0);

       ipadx=0;

       ipady=50;

       c=new GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor,

          fill,inset,ipadx,ipady);

       gridbag.setConstraints(b,c);

       contentPane.add(b);

       f.setTitle("GridBagLayout");

       f.pack();

       f.setVisible(true);

      f.addWindowListener(

           new WindowAdapter(){

               public void windowClosing(WindowEvent e){

                  System.exit(0);

               }

           }

      );     

   }

   public static void main(String[] args){

     new GridBagLayoutDemo();

   }

}

1-3-5:BoxLayout的使用:

    BoxLayout的类层次结构图:

    java.lang.Object

     --java.awt.BoxLayout

   BoxLayout提供了两个常数X_AXIS,Y_AXIS来表示水平或垂直排列。若放进去的组件不等高,则系统将会使所有的组件与最高组件

等高,还有,若你将组件都摆在同一行时,系统不因组件宽度在于Container的宽度,而使组件自动摆在下一行,你必须自行处理换

行的操作。

构造函数:

     BoxLayout(Container targe,int axis)建立一个水平或垂直的BoxLayout.

   讲到BoxLayout,我们就不得不提到Box这个Container,Box这个Container默认的Layout为BoxLayout,而它只能使用这个Layout,

否则编译时会有Error产生,如同前面所讲的,BoxLayout是以水平或垂直方式排列,因此,当我们要产生一个Box Container时,

就必须指定它的排列方式,下面为Box的构造函数:

  Box(int axis) 建立一个Box Container,并指定组件的排列方式是水平或垂直。

  上面的axis参数,我们可以使用BoxLayout.X_AXIS或BoxLayout.Y_AXIS来指定。或是利用Box类所提供的两个方法:

createHorizontalBox()与createVerticalBox(),来建立BoxContainer.

  Box类提供4种透明的组件来做更方便的版面管理。分别是glue、strut、rigid、filler:

  下面以两个相连的按钮当例子,起始状态如下:

  B1.java

1  import java.awt.*;

2  import java.awt.event.*;

3  import javax.swing.*;

4  public class B1{

5    public B1(){

6        JFrame f=new JFrame();

     

7          Container contentPane=f.getContentPane();

8          Box baseBox=Box.createHorizontalBox();

9          contentPane.add(baseBox);

10         baseBox.add(new JButton("A"));

11         baseBox.add(new JButton("B"));

     

12         f.setTitle("BoxLayout");

13         f.setSize(new Dimension(200,50));

14         f.setVisible(true);

     

15         f.addWindowListener(

16              new WindowAdapter(){

17                  public void windowClosing(WindowEvent e){

18                     System.exit(0);

19                  }

20              }

21         );

     

22     }

  public static void main(String[] args){

  B1 b=new B1();

  }

}

Glue:当glue插入在两组件间时,它会将两组件挤到最左与最右(或最上与最下),透明的glue将会占满整个中间的空间。

例:

   在10与11行间加入下面一行程序:

    baseBox.add(Box.createHorizontalGlue());

Strut:当你不想将A与B按钮挤到最旁边时,你可以使用Strut组件,来设置所需要的大小,但仅能限定一维的大小,例如限定

     水平或垂直高度。

  例:在10与11行间加入下面一行程序:

     baseBox.add(Box.createHorizontalStrut(50));//A,B之间间隔50个像素。

Rigid:这个透明组件跟Strut很像,但它可以设置二维的限制,也就是可以设置水平与垂直的限制宽度。

  例:在10与11行间加入下面一行程序:

     baseBox.add(Box.createRigidArea(new Dimension(50,50)));

    为了将Rigid的高度功能显示出来,因此以pack()方法代替setSize()方法,11行替换为:f.pack();

    若我们将高度再拉长,例如baseBox.add(Box.createRigidArea(new Dimension(50,50)));的Dimension改成(50,100),则两

    组件的上下空白将会增大,因为透明的Rigid组件高度增高了。

Filler:Filler是Box的inner class,它的功能跟Rigid很像,都可以指定长宽的大小限制,且Filler可以指定最大、较佳、最小的长

      宽大小,以下是Filler的构造函数:

     Box.Filler(Dimension min,Dimension pref Dimension max)建立一个指定大小的Filler对象。

     参数min表示最小的显示区域大小,如同上面的例子所示,若所设置最小区域的高度大于按钮A与B的高度,则按钮A与B的上方

     与下方将有空白出现。

   pref表示较佳的显示区域大小。max表示最大的显示区域大小。

    例:在10与11行间加入下面一行程序:

     baseBox.add(new Box.Filler(new Dimension(50,50),

                                new Dimension(100,50),

                                new Dimension(200,50)));

   Box类所提供的方法:

   Static Component       createGlue()构造一个Glue组件可向水平与垂直方向延伸

   Static Box             createHorizontalBox()构造一个水平排列的Box组件

   Static Component       createHorizontalGlue()构造一个水平的Glue组件

   Static Component       createHorizontalStrut(int width)构造一个水平的Strut组件

   Static Component       createRigidArea(Dimension d)构造一个Rigid组件

   Static Box             createVerticalBox()构造一个垂直排列的Box组件

   Static Component       createVerticalGlue()构造一个垂直的Glue组件

   Static Component       createVerticalStrut(int height)构造一个垂直的Strut组件

   AccessibleContext      getAccessibleContext()取得与JComponent相关边的AccessibleContext

   Void                   setLayout(LayoutManager l)丢出AWTError,因为Box只能使用BoxLayout

例子:BoxLayoutDemo.java

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class BoxLayoutDemo{

  public BoxLayoutDemo(){

    JFrame f=new JFrame();

     

      Container contentPane=f.getContentPane();

      Box baseBox=Box.createHorizontalBox();//先产生水平排列方式的Box组件,当作基底容器(BaseBox)

      contentPane.add(baseBox);

     

      /*产生垂直排列方式的Box组件来安置第一与第三个按钮

       */

      Box vBox=Box.createVerticalBox();

      JButton b=new JButton("first");

      vBox.add(b);

      b=new JButton("third");

      b.setMaximumSize(new Dimension(100,150));

      vBox.add(b);

      baseBox.add(vBox);

     

     /*产生垂直排列方式的Box组件来安置第二与另一个水平排列方式的Box组件

      */ 

      Box vBox1=Box.createVerticalBox();

      baseBox.add(vBox1);

      b=new JButton("second");

      b.setAlignmentX(Component.CENTER_ALIGNMENT);

      b.setMaximumSize(new Dimension(300,50));

      vBox1.add(b);

     

      Box hBox=Box.createHorizontalBox();

      vBox1.add(hBox);

       

     /*将第四与最后一个按钮加入水平排列方式的Box组件中

      */

      Box vBox2=Box.createVerticalBox();

          vBox2.add(Box.createVerticalStrut(50));

          vBox2.add(new JButton("fourth"));

          vBox2.add(Box.createVerticalStrut(50));

          hBox.add(vBox2);

         

          Box vBox3=Box.createVerticalBox();

              vBox3.add(Box.createVerticalGlue());

              vBox3.add(new JButton("THis is the last button"));

              hBox.add(vBox3);

           

      f.setTitle("BoxLayout");

      f.pack();

      f.setVisible(true);

     

      f.addWindowListener(

           new WindowAdapter(){

               public void windowClosing(WindowEvent e){

                  System.exit(0);

               }

           }

      );

     

  }

  public static void main(String[] args){

  BoxLayoutDemo  b=new BoxLayoutDemo();

  }

}

抱歉!评论已关闭.