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(); } }