Awt包下提供了五种布局管理器:
- FlowLayout:流式布局,一行一行的,每一行都是从左向右依次排列,遇到边界就换行。
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/*
流式布局FlowLayout
1. CENTER (常量值1)
该值表示每行的组件应该居中。
2. LEADING (常量值3)
该值表示组件的每一行应该对齐到容器方向的前端,例如从左到右的方向向左。
3. LEFT (常量值0)
该值表示每一行的组件应为左对齐。
4. RIGHT (常量值2)
该值表示组件的每一行都应该是右对齐的。
5. TRAILING (常量值4)
该值表示组件的每一行应该对齐到容器方向的后端,例如从左到右的方向向右。
*/
public class FlowLayoutTest {
public static void main(String[] args) {
Frame f = new Frame("FlowLayout");
f.setVisible(true);
f.setSize(400,400);
f.setLayout(new FlowLayout(FlowLayout.CENTER));
Button bt1 = new Button("One");
Button bt2 = new Button("Two");
Button bt3 = new Button("Three");
f.add(bt1);
f.add(bt2);
f.add(bt3);
f.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
- BorderLayout:东西南北中布局,将界面分为五个方块。EAST、WEST、SOUTH、NORTH、CENTER五个部分,每个部分可放置一个组件。
import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/*
通过Border.xxxx的方式设置当前组件放在哪个位置。
*/
public class BorderLayoutTest {
public static void main(String[] args) {
Frame f = new Frame("东西南北中布局");
f.setSize(400,400);
f.setVisible(true);
Button east = new Button("East");
Button west = new Button("West");
Button south = new Button("South");
Button north = new Button("North");
Button center = new Button("Center");
f.add(east, BorderLayout.EAST);
f.add(west, BorderLayout.WEST);
f.add(south, BorderLayout.SOUTH);
f.add(north, BorderLayout.NORTH);
f.add(center, BorderLayout.CENTER);
f.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
- GridLayout:网格布局,通过设置rows和cols设置行列,将界面划分为矩阵。
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/*
1. 表格布局,以矩阵的方式布局。
2. 每个单元格大小一样,按照顺序排列
*/
public class GriLayoutTest {
public static void main(String[] args) {
Frame f = new Frame();
f.setVisible(true);
f.setSize(400,400);
f.setLayout(new GridLayout(3,2));
f.add(new Button("1-1"));f.add(new Button("1-2"));
f.add(new Button("2-1"));f.add(new Button("2-2"));
f.add(new Button("3-1"));f.add(new Button("3-2"));
f.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
-
GridBagLayout:网格包布局,在网格布局的基础上发展而来。功能强大,但是复杂。
-
CardLayout:卡片布局,将容器中的所有组件当做一叠卡片。一般配合事件监听使用发生事件时显示指定的卡片。
import java.awt.*;
public class CardLayoutTest {
public static void main(String[] args) {
Frame f = new Frame("CardLayout");
f.setSize(400,400);
f.setVisible(true);
CardLayout c = new CardLayout();
f.setLayout(c);
f.add(new Button("2")); //展示这张卡片
f.add(new Button("1")); //这张卡片叠在2下面。
}
}
Swing包下提供的一种布局:
- BoxLayout:BoxLayout是在一个方向上排列组件,从左往右水平排列或者从上往下竖直排列。相当于界面被分为一个1n或者n1的矩阵。
import javax.swing.*;
import java.awt.*;
/*
BoxLayout.Y_AXIS 上下布局
BoxLayout.X_AXIS 左右布局
*/
public class BoxLayoutTest {
public static void main(String[] args) {
Frame f = new Frame("BoxLayout");
//构造方法: Container, Axis 含义是将容器按照axis方式布局
BoxLayout b = new BoxLayout(f,BoxLayout.Y_AXIS);
f.setVisible(true);
f.setSize(400,400);
f.setLayout(b);
f.add(new Button("button1"));
f.add(new Button("button2"));
f.add(new Button("button3"));
}
}
所有的页面布局都离不开这六种布局,可以用着六种布局嵌套组合出常见的大多数界面。
例子:利用这几种布局构造出一个如下图所示的布局。
-
首先是一个Frame窗体框架,其次将这个窗体建立一个Panel面板并放入。
-
将这个布局分为上下两个等分部分那么可以利用BoxLayout竖直方向等分或者可以用一个GridLayout构造一个2*1的矩阵。
-
对于上面的部分可以利用BorderLayout布局在东西部两个面板,在中间加入一个面板。对中间的面板在嵌套一个上下的布局。
-
对于下面的部分同样利用BorderLayout布局在东西部加两个面板,在中间加入一个面板。中间的面板做一个GridLayout的2*2的矩阵即可。
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TestMain {
public static void main(String[] args) {
Frame f = new Frame();
f.setSize(300,300);
f.setVisible(true);
f.setLayout(new GridLayout(2,1));
Panel p1 = new Panel(new BorderLayout()); //上面板
Panel p2 = new Panel(new BorderLayout()); //下面板
p1.add(new Button("1"), BorderLayout.WEST);
p1.add(new Button("2"), BorderLayout.EAST);
Panel pc1 = new Panel(new GridLayout(2,1));
pc1.add(new Button("3"));
pc1.add(new Button("4"));
p1.add(pc1,BorderLayout.CENTER);
p2.add(new Button("5"), BorderLayout.WEST);
p2.add(new Button("6"), BorderLayout.EAST);
Panel pc2 = new Panel(new GridLayout(2,2));
pc2.add(new Button("7"));
pc2.add(new Button("8"));
pc2.add(new Button("9"));
pc2.add(new Button("10"));
p2.add(pc2,BorderLayout.CENTER);
f.add(p1); f.add(p2);
f.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}