要设定容器中每个对象的大小和位置。而布局管理器能自动设定容器中组件的大小和位置,当容器改变大小时,布局管理器能自动改变其中组件的大小和布局。
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);
}
}