1. CardLayout——卡堆布局:
1) 顾名思义就是一堆卡片,只有最上面的那张卡片可见,每张卡片存放一个组件,只有最上面的那个组件才是可见的,底下的都会被遮盖住;
2) 构造器:
i. 默认无参构造器:CardLayout();
ii. 指定和边界的间隔:CardLayout(int hgap, int vgap); // 指定了组件和卡片边界之间的间距
3) 管理器如何对组件进行布局:
i. 容器必须先setLayout指定卡堆布局,然后容器add组件,组件按照add的顺序从前往后编号;
ii. 布局管理器不能在setLayout中临时new,必须提前new好并用引号保留它的访问方式,因为后面布局的管理需要引用该布局管理器:CardLayout cl = new CardLayout();
iii. 使用管理器cl的各种方法控制卡片的显示:都是CardLayout的方法
a. void first(Container parent); // 显示父容器里的第一张卡片(即第一个被add的组件)
b. void last(Container parent); // 显示父容器里最后一张卡片
c. void previous(Container parent); // 显示前一张卡片
d. void next(Container parent); // 显示下一张卡片
e. void show(Container parent, String name); // 显示标签为name的那个卡片
!!这里的标签就是指组件的文本内容,比如new Button("push");,那么"push"就是按钮组件的标签文本内容,这个name就是指这个;
!!add组件时可以指定组件的标签,Container对add的重载:Component Container.add(String name, Component comp); // name指定了该组件在容器中的字符串标识
!!我们可以看到setLayout中cl是参数,在调用first等方法是容器c有时cl的参数,这不符合面向对象的编程思想,因此AWT其实是一种面向过程的工具,因此非常笨拙,代码相当冗余;
4) 示例:
public class AwtTest {
private String[] names = { "1", "2", "3", "4", "5" };
public void init() {
Frame f = new Frame("CardLayout Test");
// 卡堆面板
Panel p = new Panel();
CardLayout cl = new CardLayout();
p.setLayout(cl);
// 卡堆上的5个组件初始化
for (int i = 0; i < 5; i++) {
p.add(names[i], new Button(names[i]));
}
// 卡堆下5个按钮具有控制功能,设置它们的监听器
ActionListener listener = e -> {
switch (e.getActionCommand()) {
case "previous":
cl.previous(p);
break;
case "next":
cl.next(p);
break;
case "first":
cl.first(p);
break;
case "last":
cl.last(p);
break;
case "third":
cl.show(p, "3");
break;
default:
break;
}
};
// 卡堆下的5个控制按钮组成一个面板
Panel pb = new Panel();
Button prev = new Button("previous");
Button next = new Button("next");
Button first = new Button("first");
Button last = new Button("last");
Button third = new Button("third");
prev.addActionListener(listener);
next.addActionListener(listener);
first.addActionListener(listener);
last.addActionListener(listener);
third.addActionListener(listener);
pb.add(prev);
pb.add(next);
pb.add(first);
pb.add(last);
pb.add(third);
f.add(p); // 卡堆用来显示
f.add(pb, BorderLayout.SOUTH); // 控制面板
f.pack();
f.setVisible(true);
}
public static void main(String[] args) {
new AwtTest().init();
}
}