AWT提供了以下五种布局管理器:
FlowLayout:
BorderLayout;
GridLayout;
GridBagLayout;
CardLayout;
FlowLayout :
有以下3个构造器
FlowLayout():使用默认的对齐方式及默认垂直间距,水平间距。
FlowLayout(int align):使用指定的对齐方式及默认垂直间距,水平间距。
FlowLayout(int align, int hgap, int vgap):使用指定的对齐方式及指定的垂直间距,水平间距。
hgap:水平间距,vgap:垂直间距。
align:对齐方式,FlowLayout.LEFT, FlowLayout.CENTER,FlowLayout.RIGHT.
public static void FlowLayoutTest() {
Frame frame = new Frame("Test");
frame.setLayout(new FlowLayout(FlowLayout.CENTER));
for (int i=0; i<10; i++) {
frame.add(new Button("BTN"+i));
}
frame.pack(); //设置窗口为最佳大小
frame.setVisible(true);
}
BorderLayout:
BorderLayout将容器分为EAST,SOUTH,WEST,NORTH,CENTER 5个区域。
public static void BorderLayoutTest() {
Frame frame = new Frame("BorderLayout");
frame.setLayout(new BorderLayout(30, 5));
frame.add(new Button("SOUTH"), BorderLayout.SOUTH);
frame.add(new Button("NORTH"), BorderLayout.NORTH);
frame.add(new Button("CENTER"), BorderLayout.CENTER);
frame.add(new Button("EAST"), BorderLayout.EAST);
frame.add(new Button("WEST"), BorderLayout.WEST);
frame.pack();
frame.setVisible(true);
}
GridLayout:
GridLayout布局将容器分割成纵横分隔的网络,
GridLayout(int rows, int cols):指定行数,列数
GridLayout(int rows, int cols, int hgap, int vgap):指定行数,列数,横向间距,纵向间距。
public static void GridLayoutTest() {
Frame frame = new Frame("GridLayout");
Panel panel = new Panel();
panel.add(new TextField(30));
frame.add(panel, BorderLayout.NORTH);
Panel p2 = new Panel();
p2.setLayout(new GridLayout(3, 5, 4, 4));
String[] name = {"0","1","2","3"
,"4","5","6","7"
,"8","9","+","-"
,"*","/","."};
for (int i=0; i < name.length; i++) {
p2.add(new Button(name[i]));
}
frame.add(p2);
frame.pack();
frame.setVisible(true);
}
GridBagLayout;
使用步骤:
1.创建GridBagLayout布局管理器,并制定GUI容器使用该布局管理器。
GraidBagLayout bg = new GridBagLayout();
constainer.setLayout(gb);
2.创建GridBagConstraints对象,并设置该对象的相关属性(yongyushezhigaiduixiangkongzhideGUI组建的大小,跨越性等)。
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 2; // 设置受该对象控制的GUI组建位于网络的横向索引;
gbc.gridy = 1; // 设置受该对象控制的GUI组建位于网络的纵向索引;
gbc.gridwidth = 2; // 设置受该对象控制的GUI组件横向跨越多少个网格
gbc.gridheight = 1; //设置受该对象控制的GUI组件纵向跨越多少个网格
3.调用GridBadLayout对象的方法来建立GridBagConstraints 对象和手控制组件之间的关联.
gb.setConstranints(c, gbc);
GridBagConstraints属性:
->gridx,gridy:设置受该对象控制的GUI组件左上角所在网络的横向索引,纵向索引(GridBagLayout左上角索引为0,0)。这两个值还可以是GridBagConstraints.RELATIVE(默认值)表明当前组件紧跟在上一个组件之后。
->gridwidth,gridheight:设置受控该对象控制的GUI组件横向,纵向跨越多少网格,两个属性的值默认都是1,
GridBagConstraints.REMAINDER:横向或纵向最后一个组件。
GridBagConstraints.RELATIVE:横向纵向倒数第二个组件。
->fill:设置GUI组件如何占据空白区域。
GridBagContraints.NONE: GUI组件不扩大。
GridBagContraints.HORIZONTAL:GUI组件水平扩大。
GridBagContraints.VERTICAL:GUI组件垂直扩大。
GridBagContraints.BOTH:GUI组件水平垂直扩大。
->ipadx, ipady:GUI组件横向,纵向内部填充的大小。
->insets:GUI组件的外部填充的大小。
->anchor:GUI在其显示区域中的定位方式:
GridBagContraints.CENTER(中间)
GridBagContraints.NORTH(上中)
GridBagContraints.NORTHWEST(左上角)
GridBagContraints.NORTHEAST(右上角)
GridBagContraints.SOUTH(下中)
GridBagContraints.SOUTHEAST(右下角)
GridBagContraints.SOUTHWEST(左下角)
GridBagContraints.EAST(右中)
GridBagContraints.WEST(左中)
->weightx, weighty:设置受该对象控制的GUI组件占据多于空间的水平,垂直增加比例。
package javaAWT;
import java.awt.Button;
import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.naming.InitialContext;
public class GridBagTest {
private Frame f = new Frame("GridBagTest");
private GridBagLayout gb = new GridBagLayout();
private GridBagConstraints gbc = new GridBagConstraints();
private Button[] bs = new Button[10];
public void init() {
f.setL...ayout(gb);
for ( int i = 0; i < bs.length; i++ ) {
bs[i] = new Button("BTN"+i);
}
// 所有组件都可以在横向,纵向上扩展
gbc.fill = GridBagConstraints.BOTH;
gbc.weightx = 1;
addButton(bs[0]);
addButton(bs[1]);
addButton(bs[2]);
// 该GridBagConstraints控制的GUI组件将会成为横向最后一个组件
gbc.gridwidth = GridBagConstraints.REMAINDER;
addButton(bs[3]);
// 该GridBagConstraints控制的GUI组建将在横向上不会扩大;
gbc.weightx = 0;
addButton(bs[4]);
// 该GridBagConstraints控制的GUI组建将横跨两个网络
gbc.gridwidth = 2;
addButton(bs[5]);
// 该GridBagConstraints控制的GUI组件将横跨一个网络
gbc.gridwidth = 1;
// 该GridBagConstraints控制的GUI组建将在纵向上跨两个网络
gbc.gridheight = 2;
// 该GridBagConstraints控制的GUI组件将会成为横向最后一个组件
gbc.gridwidth = GridBagConstraints.REMAINDER;
addButton(bs[6]);
// 该GridBagConstraints控制的GUI组件将横向跨越一个网络,纵向跨越两个网络;
gbc.gridwidth = 1;
gbc.gridheight = 2;
// 该GridBagConstraints控制的GUI组件纵向扩大权重是一
gbc.weighty = 1;
addButton(bs[7]);
// 设置下面的按钮在纵向上不会扩大
gbc.weighty = 0;
// 该GridBagConstraints控制的GUI组件将会成为横向最后一个组件
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.gridheight = 1;
addButton(bs[8]);
addButton(bs[9]);
f.pack();
f.setVisible(true);
}
private void addButton(Button button) {
gb.setConstraints(button, gbc);
f.add(button);
}
public static void main(String[] args) {
new GridBagTest().init();
}
}
CardLayout;
两个构造方法:
CardLayout():创建默认的CardLayout布局管理器。
CardLayout(int hgap, int vgap):通过指定卡片与容器左右边界的间距来创建CardLayout布局管理器。
常用5个方法:
first(Container target):显示target容器中的第一张卡片。
last(Container target):显示target容器中的最后一张卡片。
previous(Container target):显示target容器中的前一张卡片。
next(Container target):显示target容器中的后一张卡片。
show(Container target, String name):显示target容器中指定名字的卡片。
package javaAWT;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.CardLayout;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.text.PlainDocument;
public class CardLayoutTest {
Frame f = new Frame("CardLayoutTest");
String[] name = {"第一张","第二张","第三张","第四张","第五张"};
Panel panel = new Panel();
public void init() {
final CardLayout cld = new CardLayout();
panel.setLayout(cld);
for (int i = 0; i < name.length; i++) {
panel.add(name[i], new Button(name[i]));
}
Panel p = new Panel();
//显示上一张按钮
Button previous = new Button("上一张");
previous.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
cld.previous(panel);
}
});
//显示下一张张按钮
Button next = new Button("下一张");
next.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
cld.next(panel);
}
});
//显示第一张按钮
Button first = new Button("第一张");
first.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
cld.first(panel);
}
});
//显示最后一张按钮
Button last = new Button("最后一张");
last.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
cld.last(panel);
}
});
//根据Card名字显示按钮
Button thrid = new Button("第三张");
thrid.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
cld.show(panel, "第三张");
}
});
p.add(previous);
p.add(next);
p.add(first);
p.add(last);
p.add(thrid);
f.add(panel);
f.add(p, BorderLayout.SOUTH);
f.pack();
f.setVisible(true);
}
public static void main(String[] args) {
new CardLayoutTest().init();
}
}
绝对定位
1.将Container的布局管理器设成null:setLayout(null);
2.现容器中添加组件时,先调用setBounds() 或 setSize()方法来设置组件的大小,位置。
package javaAWT;
import java.awt.Button;
import java.awt.Frame;
public class NullLayoutTest {
Frame frame = new Frame("NullLayoutTest");
Button btn1 = new Button("BTN 1");
Button btn2 = new Button("BTN 2");
public void init() {
//设置使用null布局管理器
frame.setLayout(null);
btn1.setBounds(20, 30, 90, 90);
frame.add(btn1);
btn2.setBounds(50, 50, 120, 45);
frame.add(btn2);
frame.setBounds(50, 50, 200, 200);
frame.setVisible(true);
}
public static void main(String[] args) {
new NullLayoutTest().init();
}
}
BoxLayout布局管理器:
BoxLayout布局管理器可以在X,Y两个方向上摆放组件,构造器:
BoxLayout(Container target, int axis);
BoxLayout.X_AXIS:X方向摆放。
BoxLayout.Y_AXIS:Y方向摆放。
package javaAWT;
import java.awt.Button;
import java.awt.Frame;
import javax.swing.BoxLayout;
public class BoxLayoutTest {
private Frame frame = new Frame("BoxLayoutTest");
public void init() {
frame.setLayout(new BoxLayout(frame, BoxLayout.Y_AXIS));
// 垂直排列
frame.add(new Button("Button1"));
frame.add(new Button("Button2"));
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
new BoxLayoutTest().init();
}
}
BoxLayout和Box容器结合:
Box是一个特殊的容器,类似Panel容器,Box提供了两个静态方法来创建Box对象:
createHorizontalBox():创建一个水平排列组件的Box容器;
creteVertical():创建一个垂直排列的Box容器;
package javaAWT;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import javax.swing.Box;
import org.omg.CORBA.PRIVATE_MEMBER;
public class BoxTest {
private Frame frame = new Frame("BoxTest");
// 创建水平摆放组件的box对象;
private Box horizontal = Box.createHorizontalBox();
// 创建垂直摆放组件的box对象;
private Box vertical = Box.createVerticalBox();
public void init() {
horizontal.add(new Button("Horizontal 1"));
horizontal.add(new Button("horizontal 2"));
vertical.add(new Button("Vertical 1"));
vertical.add(new Button("vertical 2"));
frame.add(horizontal, BorderLayout.SOUTH);
frame.add(vertical);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
new BoxTest().init();
}
}
Box提供了如下5个静态方法来创建Glue, Strut,RigidArea.
Glue:可以在两个方向同时拉伸。
Strut:只能在一个方向上拉伸。
RigidArea:不可拉伸。
createHorizontalGlue():创建一条水平Glue(可在两个方向上同时拉伸的间距)。
createVerticalGlue():创建一条垂直Glue(可在两个方向上同时拉伸的间距)。
createHorizontalStrut(int width):创建一条指定宽度的水平Strut(可在垂直方向上拉伸的间距)。
createVerticalStrut(int height):创建一条指定高度的水平Strut(可在水平方向上拉伸的间距)。
createRigidArea(Dimension d):创建指定宽度,高度的RigidArea(不可拉伸的间距)。
package javaAWT;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import javax.swing.Box;
public class BoxSpaceTest {
private Frame frame = new Frame("BoxSpaceTest");
// 水平摆放Box
private Box horizontal = Box.createHorizontalBox();
// 垂直摆放Box
private Box vertical = Box.createVerticalBox();
public void init() {
horizontal.add(new Button("水平 1"));
horizontal.add(Box.createHorizontalGlue());
horizontal.add(new Button("水平 2"));
// 水平方向不可拉伸的间距,宽度10px
horizontal.add(Box.createHorizontalStrut(10));
horizontal.add(new Button("水平 3"));
vertical.add(new Button("垂直 1"));
vertical.add(Box.createVerticalGlue());
vertical.add(new Button("垂直 2"));
vertical.add(Box.createVerticalStrut(10));
vertical.add(new Button("垂直 3"));
frame.add(horizontal, BorderLayout.NORTH);
frame.add(vertical);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
new BoxSpaceTest().init();
}
}