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

   1、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); 
} 
}


程序运行效果

 

   2、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,则只有最后加上的那个是可见的。

  

3、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); 
} 
}


程序运行效果

    4、Card Layout Manager(卡片布局管理器)

Card布局管理器把用户接口看成是一系列的卡片,某一时刻只有一张是可见的。可以使用add()方法把卡片加到Card Layout中,然后使用CardLayout类中的first()、next()等方法根据需要切换到新的卡片。有兴趣的同学可自己查看参考书。

 

 

常用的也就這4種,其他的不怎麼實用、、、