Container中的component,通常是由布局管理器 (layout manager)来管理的。每个Container(如:Panel和Frame)均有一个缺省的布局管理器,用户也可通过setLayout()方法指定其他的布局管理器。
布局管理器负责决定Container内所有组件的位置和大小。
Java中包含了下列布局管理器:
Flow Layout - 是Panel和Applet缺省的布局管理器
Border Layout - 是Window和Dialog缺省的布局管理器,即也是Frame缺省的布局管理器。
Grid Layout
Card Layout
GridBag Layout
Flow Layout Manager(顺序布局管理器)
该布局管理器对应的类为java.awt.FlowLayout。以下是一个使用Flow Layout的例子。
import java.awt.*;
public class ExGui {
private Frame f;
private Button b1;
private Button b2;
public static void main(String args[]) {
ExGui guiWindow = new ExGui();
guiWindow.go();
}
public void go() {
//create a instance of the class java.awt.Frame
f = new Frame("GUI example");
//create a instance of flow layout manager
//and install it in the Frame
f.setLayout(new FlowLayout());
// create a instance of class java.awt.Button
b1= new Button("Press Me");
//the button label is defined by the String argument
//to the constructor
b2 = new Button("Don't Press Me");
//add component b1 to Container f
f.add(b1);
f.add(b2);
//强制告诉Frame对象,对它的component再排版,
//以尽量小的空间存放这些component
f.pack();
f.setVisible(true);
}
}
程序运行效果
该例所使用的flow layout是按行来放置component的,每当一行放满后,就新产生一行开始放。
与其他布局管理器不同,flow layout管理器不对其component的大小加以限制,允许component保持其自然的尺寸,即"要多大有多大"。
Flow Layout的component的排列一般是从左到右,从上到下,类似段落中的文字行。Flow Layout通常用于安排panel中的Button和其他component。用户可通过给Flow Layout的构造方法不同的参数来调整component的位置和间距。
FlowLayout类有三种构造方法,最复杂的有三个参数,格式如下:
FlowLayout(int align,int hgap,int vgap);
其中,align决定component的位置,其值有FlowLayout.LEFT, FlowLayout.CENTER, FlowLayout.RIGHT三种,缺省为FlowLayout.CENTER。 hgap和vgap分别对应水平和垂直方向的间距,缺省为5单位(unit)。
而最常用最简单的是不带参数的构造方法:
FlowLayout();
下列程序使用FlowLayout布局管理器将几个Button加到Frame中。
import java.awt.*;
public class MyFlow {
private Frame f;
private Button button1,button2,button3;
public static void main(String args[]) {
MyFlow mflow = new MyFlow();
mflow.go();
}
public void go() {
f = new Frame("Flow Layout");
f.setLayout(new FlowLayout());
button1 = new Button("Ok");
button2 = new Button("Open");
button3 = new Button("Close");
f.add(button1);
f.add(button2);
f.add(button3);
f.setSize(100,100);
f.setVisible(true);
}
}
程序运行效果
Border Layout Manager(边界布局管理器)
该布局管理器对应的类为java.awt.BorderLayout。Border Layout manager提供了在Panel或Window中放置component的更复杂的方法。它包括五个区:北区(North)、南区(South)、东区(East)、西区(West)和中区(Center)。这几个区在Panel上的分布规律是"上北下南,左西右东"。
一旦东南西北四个区被填充后,剩下的空间都留给中区。当窗口水平扩展时,北、南、中三区得到扩展,垂直扩展时,东、西、中三区得到扩展。
Border布局管理器是Dialog和Frame的缺省布局管理器。
例:
import java.awt.*;
public class ExGui2 {
private Frame f;
private Button bn,bs,bw,be,bc;
public static void main(String args[]) {
ExGui2 guiWindow2 = new ExGui2();
guiWindow2.go();
}
public void go() {
f = new Frame("Border Layout");
bn = new Button("B1");
bs = new Button("B2");
be = new Button("B3");
bw = new Button("B4");
bc = new Button("B5");
f.add(bn,BorderLayout.NORTH);
f.add(bs,BorderLayout.SOUTH);
f.add(be,BorderLayout.EAST);
f.add(bw,BorderLayout.WEST);
f.add(bc,BorderLayout.CENTER);
f.setSize(200,200);
f.setVisible(true);
}
}
程序运行效果
同样,使用BorderLayout的构造方法,可设置其component的间距。如:
BorderLayout(); //component间没有间距
BorderLayout(int hgap,int vgap); // hgap和vgap分别对应水平和垂直方向的间距。
对应Border布局管理器的五个区域,一般每个区域只能有一个component, 若在一个区域中加上多个component,则只有最后加上的那个是可见的。
Grid Layout Manager(网格布局管理器)
该布局管理器对应的类为java.awt.GridLayout。Grid布局管理器提供了放置component的灵活手段。程序员可以建立一个有多行和多列的布局管理器,然后component就可以按一定的次序(从左到右,从上到下)进行排列。
当Grid布局管理器对应的窗口发生变化时,内部component的相对位置并不变化,只有大小发生变化。
Grid布局管理器总是忽略component倾向的大小(prefered size),它把每个component的大小设置成相同的。
GridLayout类有三个构造方法:
GridLayout()
//缺省建立一行的布局,每个component占居一列
GridLayout(int rows, int cols)
//建立指定行和列的布局,rows和cols对应行数和列数
GridLayout(int rows, int cols, int hgap, int vgap)
//建立指定行列数和间距的布局,hgap和vgap分别对应水平和垂直间距。
例:
import java.awt.*;
public class GridEx {
private Frame f;
private Button b1,b2,b3,b4,b5,b6;
public static void main(String args[]) {
GridEx grid = new GridEx();
grid.go();
}
public void go() {
f = new Frame("Grid example");
f.setLayout(new GridLayout(3,2));
b1 = new Button("1");
b2 = new Button("2");
b3 = new Button("3");
b4 = new Button("4");
b5 = new Button("5");
b6 = new Button("6");
f.add(b1);
f.add(b2);
f.add(b3);
f.add(b4);
f.add(b5);
f.add(b6);
f.pack();
f.setVisible(true);
}
}
程序运行效果
Card Layout Manager(卡片布局管理器)
Card布局管理器把用户接口看成是一系列的卡片,某一时刻只有一张是可见的。可以使用add()方法把卡片加到Card Layout中,然后使用CardLayout类中的first()、next()等方法根据需要切换到新的卡片。有兴趣的同学可自己查看参考书。
GridBag Layout Manager(网格包布局管理器)
GridBag布局管理器可以比较精确地控制Container中component的位置和大小,但它非常复杂,不太实用,这里就不作介绍了。
本贴来自ZDNetChina中文社区 http://bbs.zdnet.com.cn ,本贴地址:http://bbs.zdnet.com.cn/viewthread.php?tid=1096390