Java的GUI界面设计中,布局控制是相当重要的一个环节。将一个组件加入容器中时,布局控制器决定了所加入的组件的大小和位置。如果将一个容器的布局管理器设为null,即用方法setLayout(null),则

要设定容器中每个对象的大小和位置。而布局管理器能自动设定容器中组件的大小和位置,当容器改变大小时,布局管理器能自动改变其中组件的大小和布局。
    java.awt包共定义了五种布局管理器,每个布局管理器对应一各布局策略,分别是
FlowLayout,BorderLayout,CardLayout,GridLayout和GridBagLayout。下面详细讨论前四种布局管理器。
一、 FlowLayout
     FlowLayout 是容器Panel和它的子类Applet默认的布局管理器,如果不专门为Panel或Applet指定 布局管理器,则它们就使用FlowLayout.
  FlowLayout将其中组件按照加入的先后顺序从左向右排列,一行排满之后就下转到下一行继续从左到右排列每一行都据中排列;在组件不多时,使用这种策略非常方便,但是当容器内的GUI元素增加时,就显示得高低不齐 对于使用FlowLayout的容器,加入组件使用add(组件名)方法 设定一个容器的布局管理器,可以使用setLayout(布局管理器名)方法
  FlowLayout的构造方法有三种形式:
   FlowLayout();
   FlowLayout(int align); 
FlowLayout(int align,int hgap,int vgap);
参数align指定每行组件的对齐方法,可以取三个静态常量LEFT,CENTER,RIGHT之一,默认为CENTER。hgap,vgap指定组件间的间距,默认为5个像素。 如图所示:
例:
Import java.awt.*;
public  class  Test FlowLayout
{
  public  static  void  main(String[] args)
  {
   Frame frame =  new  Frame( "FlowLayoutDemo" );
   Button[] buttonArray =  new  Button[8];
  
   int  length = buttonArray. length ;
   for  ( int  i = 0; i < length; i++)
   {
    buttonArray[i] =  new  Button( "按钮"  + (i + 1));
   }
   frame.setLayout( new  FlowLayout(FlowLayout. LEFT , 10, 20));
   for  ( int  i = 0; i < length; i++)
   {
    frame.add(buttonArray[i]);
   }
   frame.setSize(400, 200);
   frame.setVisible( true );
  }
}
二、 BorderLayout
BordderLayout是容器Frame和Dialog默认的布局管理器,它把容器简单地划分为东、西、南、北、中五个区域,每加入一个组件都应该指明把这个组件加在哪个区域。分布在北部和南部区域的组件将横向扩展至 占据整个容器的长度,分布在东部和西部的组件将伸展至占据容器剩余部分的全部宽度,最后剩余部分将分配给中央的组件。如果某个区间没有分配组件,则其它组件可以占据它的空间。例如,如果北部没有分配组件,则西部 和东部的组件将扩展到容器的上方,如果西部和东部没有分配组件,则位于中央的组件将横向扩展到容器的左右边界。  如图所示:
                                  
能指 定五个区域位置。如果一个区域加入的组件超过多个,则只能显示区域的最后加入的一个对象。如果容器中需要 加入超过五个组件,就必须用容器的嵌套或改变用其它的布局策略 
BorderLayout的构造方法有两种 
BorderLayout();
BorderLayout(int hgap,int vgap);
hgap及vgap指组件间的间距,默认为0个像素
例:
Import java.awt.*;
public class TestBorderLayout
{
  public static void main(String[] args)
  {
   Frame frame = new Frame("BorderLayout");
   frame.setLayout(new BorderLayout());
   frame.add(new Button("北"), BorderLayout.NORTH);
   frame.add(new Button("南"), BorderLayout.SOUTH);
   frame.add(new Button("西"), BorderLayout.WEST);
   frame.add(new Button("东"), BorderLayout.EAST);
   frame.add(new Button("中"), BorderLayout.CENTER);
   frame.setSize(200, 200);
   frame.setVisible(true);
  }
}
三、CardLayout
使用CardLayout的容器表面上可以容纳多个组件,但是实际上,在同一时间容器只能从这些组件中选出一个来显示,就像一叠“扑克牌”每次只能显示最上桌的一张一样,这个被显示的组件将占据所有的容器空间 CardLayout的构造方法有两种形式:
  CardLayout(); CardLayout(int hgap,int vgap);
   其中,hgap,vgap指组件间的横纵间距,默认为0个像素。 如图所示:
               
使用CardLayout的一般方法步骤如下:
   ( 1)创建CardLayout对象作为布局管理器:Mycard=new CardLayout();
   (2)使用容器的setLayout()方法为容器设置布局管理器:setLayout(MyCard);
   (3)调用容器的方法add()将组件加入容器,同时为组件分配一个字符串名字,以便布局管理器根据这个名字调用显示这个组件 add(字符串,组件);
   (4)调用CardLayout的方法show(),根据字符串显示一个组件:show(容器名,字符串);或按组件加入容器的顺序显示组件,如first(容器名)方法第显示第一个组件,last(容器名)方法显示最后一个组件等
例:
// 程序中,按钮加入了事件处理,单击鼠标左键到下一组件,单击鼠标右键到前一组件
Import java.awt.*;
public class TestCardLayout
{
  public static void main(String[] args)
  {
   final Frame myFrame = new  Frame("CardLayout");
   final CardLayout cardLayout = new CardLayout();
   Button[] buttonArray = new Button[8];
   int length = buttonArray.length;
   for (int i = 0; i < length; i++)
   {
    buttonArray[i] = new Button("按钮" + (i + 1));
    buttonArray[i].addMouseListener(new MouseAdapter()
    {
     public void mouseClicked(MouseEvent e)
     {
      if (e.getModifiers() == InputEvent.BUTTON1_MASK)
      {
       cardLayout.next(myFrame);
      }
      else
      {
       cardLayout.previous(myFrame);
      }
     }
    });
   }
   myFrame.setLayout(cardLayout);
   for (int i = 0; i < buttonArray.length; i++)
   {
    myFrame.add("" + (i + 1), buttonArray[i]);
   }
   myFrame.setSize(200, 200);
   myFrame.setVisible(true);
  }
}
三、 GridLayout
GridLayout是使用最多的布局管理器,其基本布局策略是把容器的空间划分成若干行若干列的网格区域,组件就位于这些 划分出来的小格中.GridLayout比较灵活,划分多少网格由程序自由控制,而且组件定位也精确. 使用GridLayout布局布局管理器的一般步骤如下:
   (1)创建GridLayout对象作为布局管理器.指定划分网格的行数和列数,并使用容器的setLayout()方法为容器设置这个 布局管理器:
      setLayout(new GridLayout(行数,列数组))
   (2)调用容器的方法add()将组件加入容器.组件填入容器的顺序将按照第一行第一个、第一行第二个,¡¤¡¤¡¤¡¤¡¤,最后一行最后一个。 每网格中都必须填入组件,如果希望某个网格为空白,可以为它加入一个空的标签add(new Label()) 。如图所示:
                                        
例:
Import java.awt.*;
public class TestGridLayout
{
  public static void main(String[] args)
  {  
        Frame myFrame = new   Frame("GridLayout");
   Button[] buttonArray = new Button[20];
   int length = buttonArray.length;
   for (int i = 0;i < length; i++)
   {
    buttonArray[i] = new Button("" + (i+1));
    buttonArray[i].setBackground(new Color(230,250,230));
   }
   myFrame.setLayout(new GridLayout(4,5));
  
   for (int i = 0;i < length; i++)
   {
    myFrame.add(buttonArray[i]);
   }
   myFrame.setSize(200,200);
   myFrame.setVisible(true);
  }
}

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐