在操作程序时,经常会遇到通过选项卡按钮来切换程序中的界面,这些界面就相当于一张张卡片,而管理这些卡片的布局管理器就是卡片布局管理器(CardLayout)。卡片布局管理器将界面看作是一系列卡片,在任何时候只有其中一张卡牌是可见的,这张卡牌占据容器的整个区域。
在 CardLayout 布局管理器中经常会用到下面几个方法,如下所示。
| 方法声明 | 功能描述 |
|---|---|
| void first(Container parent) | 显示 parent 容器的第一张卡片 |
| void last(Container parent) | 显示 parent 容器的最后一张卡片 |
| void previous(Container parent) | 显示 parent 容器的前一张卡片 |
| void next(Container parent) | 显示 parent 容器的下一张卡片 |
| void show(Container parent, String name) | 显示 parent 容器中名称为 name 的组件,如果不存在,则不会发生任何操作 |
上表中列举了 CardLayout 的常用方法,接下来通过一个案例来演示这些方法的使用,如下所示。
import java.awt.*;import java.awt.event.*;//定义 Cardlayout 继承 Frame 类,实现 ActionListener 接口class Layout extends Frame implements ActionListener{Panel cardPanel = new Panel(); //定义 Panel 面板放置卡片Panel controlPanel = new Panel(); //定义 Panel 面板放置按钮Button nextButton, preButton; //声明两个 Button 变量CardLayout cardLayout = new CardLayout(); //定义卡片布局对象//定义构造方法,设置卡片布局管理器的属性public Layout() {setSize(300, 200);setVisible(true);cardPanel.setLayout(cardLayout);//在 cardPanel 面板对象中添加 3 个文本标签cardPanel.add(new Label("第 1 个界面", Label.CENTER));cardPanel.add(new Label("第 2 个界面", Label.CENTER));cardPanel.add(new Label("第 3 个界面", Label.CENTER));//创建两个按钮对象nextButton = new Button("下一张卡片");preButton = new Button("上一张卡片");//为按钮对象注册监听器nextButton.addActionListener(this);preButton.addActionListener(this);//将按钮添加到 controlPanel 中controlPanel.add(preButton);controlPanel.add(nextButton);//将 cardPanel 面板放置在窗口边界布局的中间,窗口默认为边界布局this.add(cardPanel, BorderLayout.CENTER);//将 contrPanel 面板放置在窗口边界布局的南区,窗口默认为边界布局this.add(controlPanel, BorderLayout.SOUTH);//为窗口添加关闭事件监听器this.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {Layout.this.dispose();}});}//下面的代码实现了按钮的监听触发,并对出发事件做出相应的处理public void actionPerformed(ActionEvent e) {if (e.getSource() == nextButton) {cardLayout.next(cardPanel); //如果用户点击 nextbutton,则显示 cardPanel 面板的下一张卡片}if (e.getSource() == preButton) {cardLayout.previous(cardPanel); //如果用户点击 preButton,则显示 cardPanel 面板的上一张卡片}}}public class example06 {public static void main(String[] args) {Layout cardLayout = new Layout();}}
运行程序,生成的窗口如下所示。

上述代码块中,在顶层 Frame 容器采用 BorderLayout 布局,CENTER 区域和 SOUTH 分别放置 cardPanel 和 controlPanel 面板。其中,cardPanel 面板采用 CardLayout 布局管理器,其中放置了 3 个 Label 标签代表 3 张卡片。controlPanel 中放置了两个名为“上一张卡片”和“下一张卡片”的按钮,通过点击这两个按钮,会触发按钮的事件监听器,调用 CardLayout 的 previous()和 next()方法对 cardPanel 面板中的卡片进行切换。CardLayout 的优点是可以使两个或更多的界面共享一个显示空间,某一时刻只有一个界面可见。
