AWT提供了FlowLayout、BorderLayout、GridLayout、GridBigLayout、CardLayout五个常用的布局管理器,Swing还提供了一个BoxLayout布局管理器。
1. FlowLayout布局管理器
在FlowLayout布局管理器中,组件像水流一样向某方向流动(排列),遇到障碍(边界)就折回,重头开始排列。默认情况下,FlowLayout布局管理器从左到右排列所有组件,遇到边界就会折回下一行重新开始。
FlowLayout有如下三个构造器:
(1)FlowLayout():使用默认对齐方式、默认垂直、水平间距创建FlowLayout布局管理器。
(2)FlowLayout(int align):使用指定对齐方式、默认垂直、水平间距创建FlowLayout布局管理器。
(3)FlowLayout(ing align,int hgap,int vgap):使用指定对齐方式、指定垂直、水平间距创建FlowLayout布局管理器。
Panel和Applet默认使用FlowLayout布局管理器。
2. BorderLayout布局管理器
BorderLayout将容器分成EAST、SOUTH、WEST、NORTH、CENTER五个区域,普通组件可以被放置在这五个区域中任意一个。
当改变使用BorderLayout的容器大小时,NORTH、SOUTH和CENTER区域水平调整,而EAST、WEST和CENTER垂直调整。使用BorderLayout有如下两个注意点:
(1)当向使用BorderLayout布局管理器的容器中添加组件时,需要指定要添加到哪个区域里。如果没有指定添加到哪个区域里,则默认添加到中间区域里。
(2)如果向同一区域中添加多个组件后,后放入的组件会覆盖前面的组件。
BorderLayout有如下两个构造器:
(1)BorderLayout():使用默认水平间距、垂直间距创建BorderLayout布局管理器。
(2)BorderLayout(int hgap,int vgap):使用指定的水平间距、垂直间距创建BorderLayout布局管理器。
Frame、Dialog、ScrollPane默认使用BorderLayout布局管理器。
当向使用BorderLayout布局管理器的容器中添加组件时,应该使用BorderLayout类的几个静态属性来指定添加到哪个区域,BorderLayout有如下几个静态常量:EAST(东)、NORTH(北)、WEST(西)、SOUTH(南)、CENTER(中)。
3.GridLayout布局管理器
GridLayout布局管理器将容器分割成纵横分割的网线,每个网格所占的区域大小相同。当向使用GridLayout的容器中添加组件时,默认从左到右、从上到下依次添加到每个网格中。与FlowLayout不同的是,放在GridLayout布局管理器中的各个组件的大小由组件所处的区域来决定(每个组件将自动涨大到占满整个区域)。
GridLayout有如下两个构造器:
(1)GridLayout(int rows,int cols):采用指定行数、列数、默认横向间距、纵向间距将容器分割成多个网格。
(2)GridLayoug(int rows,int cols,int hgap,int vgap):采用指定行数、列数、指定横向间距、纵向间距将容器分割成多个网格。
4.CardLayout布局管理器
CardLayout布局管理器以时间而非空间来管理它里面的组件,它将加入容器的所有组件看成一叠卡片,每次只要最上面的那个Component才可见。就好像一副扑克牌,它们叠在一起,每次只有最上面的一张扑克牌可见。
CardLayout提供了如下两个构造器:
(1)CardLayout():创建默认的CardLayout布局管理器。
(2)CardLayout(int hgap,int vgap):通过指定卡片与容器左右边界的间距(hgap)、上下边界(vgap)的间距来创建CardLayout布局管理器。
CardLayout用于控制组件可见的5个常用方法:
(1)first(Container target):显示target容器中的第一个卡片。
(2)last(Container target):显示target容器中的最后一个卡片。
(3)previous(Container target):显示target容器中前一个卡片。
(4)next(Container target):显示target容器中下一个卡片。
(5)show(Container target,String name):显示target容器中指定名字的卡片。
5.BoxLayout布局管理器
GridBagLayout布局管理器虽然功能强大,但它实在太复杂了,所以Swing引入了一个新的布局管理器:BoxLayout。它保留了GridBagLayout的很多优点,但是却没有那么复杂。BoxLayout可以在垂直和水平两个方向上摆放GUI组件,BoxLayout提供了一个如下的简单构造器:
(1)BoxLayout(Container target,int axis):指定创建基于target容器的BoxLayout布局管理器。该布局管理器组件按axis方向排列。其中axis有BoxLayout.X_AXIS(横向)和BoxLayout.Y_AXIS(纵向)两个方向。
import java.awt.*;
import javax.swing.BoxLayout;
public class TestBoxLayout
{
private Frame f=new Frame("测试");
public void init()
{
f.setLayout(new BoxLayout(f,BoxLayout.Y_AXIS));
//下面按钮将会垂直排列
f.add(new Button("第一个按钮"));
f.add(new Button("第二个按钮"));
f.pack();
f.setVisible(true);
}
public static void main(String[] args)
{
new TestBoxLayout().init();
System.out.println("Hello World!");
}
}
BoxLayout通常和Box容器结合使用,Box是一个特殊的容器,它有点像Panel容器,但该容器默认使用BoxLayout布局管理器,Box提供了如下两个静态方法来创建Box对象:
(1)createHorizontalBox():创建一个水平排列组件的Box容器。
(2)createVeriticalBox():创建垂直排列的Box容器。
一旦获得了Box容器之后,就可以使用Box容器来盛装普通GUI组件,然后再将这些Box组件添加到其他容器中,从而形成整体的窗口布局。
BoxLayout没有提供设置间距的构造器和方法,因为BoxLayout采用另一种方式来控制组件的间距。BoxLayout使用Glue、Strut和RigidArea的组件来控制组件间的距离。
Box提供了如下五个静态方法来创建Glue、Strut和RigidArea:
(1)createHorizontalGlue():创建一条水平Glue(可在两个方向同时拉伸的间距)。
(2)createVerticalGlue():创建一条垂直Glue(可在两个方向同时拉伸的间距)。
(3)createHorizontalStrut(int width):创建一条指定宽度水平Strut(可在垂直方向上拉伸的间距)。
(4)createVerticalStrut(int height):创建一条指定高度垂直Strut(可在水平方向上拉伸的间距)。
(5)createRigidArea(Dimension d):创建指定宽度、高度的RigidArea(不可拉伸的间距)。
import java.awt.*;
import javax.swing.Box;
public class TestBoxSpace
{
Frame f=new Frame("测试");
//定义水平摆放的Box对象
private Box horizontal=Box.createHorizontalBox();
//定义垂直摆放的Box对象
private Box vertical=Box.createVerticalBox();
public void init()
{
horizontal.add(new Button("水平按钮一"));
horizontal.add(Box.createHorizontalStrut(10));
horizontal.add(new Button("水平按钮二"));//水平方向不可拉伸的间距、其宽度为10px
horizontal.add(Box.createHorizontalStrut(10));
horizontal.add(new Button("水平按钮三"));
//vertical.add(Box.createRigidArea(new Dimension(10,10)));
vertical.add(new Button("垂直按钮一"));
vertical.add(Box.createVerticalGlue());
vertical.add(new Button("垂直按钮二"));
//垂直方向不可拉伸的间距,其高度为10px
vertical.add(Box.createVerticalStrut(10));
vertical.add(new Button("垂直按钮三"));
f.add(horizontal,BorderLayout.NORTH);
f.add(vertical);
f.pack();
f.setVisible(true);
}
public static void main(String[] args)
{
new TestBoxSpace().init();System.out.println("Hello World!");
}
}