Java布局管理器

   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 TestFlowLayout
{
 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);
 }
}

没有更多推荐了,返回首页