在操作程序时,经常会遇到通过选项卡按钮来切换程序中的界面,这些界面就相当于一张张卡片,而管理这些卡片的布局管理器就是卡片布局管理器(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 的常用方法,接下来通过一个案例来演示这些方法的使用,如下所示。

    1. import java.awt.*;
    2. import java.awt.event.*;
    3. //定义 Cardlayout 继承 Frame 类,实现 ActionListener 接口
    4. class Layout extends Frame implements ActionListener{
    5. Panel cardPanel = new Panel(); //定义 Panel 面板放置卡片
    6. Panel controlPanel = new Panel(); //定义 Panel 面板放置按钮
    7. Button nextButton, preButton; //声明两个 Button 变量
    8. CardLayout cardLayout = new CardLayout(); //定义卡片布局对象
    9. //定义构造方法,设置卡片布局管理器的属性
    10. public Layout() {
    11. setSize(300, 200);
    12. setVisible(true);
    13. cardPanel.setLayout(cardLayout);
    14. //在 cardPanel 面板对象中添加 3 个文本标签
    15. cardPanel.add(new Label("第 1 个界面", Label.CENTER));
    16. cardPanel.add(new Label("第 2 个界面", Label.CENTER));
    17. cardPanel.add(new Label("第 3 个界面", Label.CENTER));
    18. //创建两个按钮对象
    19. nextButton = new Button("下一张卡片");
    20. preButton = new Button("上一张卡片");
    21. //为按钮对象注册监听器
    22. nextButton.addActionListener(this);
    23. preButton.addActionListener(this);
    24. //将按钮添加到 controlPanel 中
    25. controlPanel.add(preButton);
    26. controlPanel.add(nextButton);
    27. //将 cardPanel 面板放置在窗口边界布局的中间,窗口默认为边界布局
    28. this.add(cardPanel, BorderLayout.CENTER);
    29. //将 contrPanel 面板放置在窗口边界布局的南区,窗口默认为边界布局
    30. this.add(controlPanel, BorderLayout.SOUTH);
    31. //为窗口添加关闭事件监听器
    32. this.addWindowListener(new WindowAdapter() {
    33. public void windowClosing(WindowEvent e) {
    34. Layout.this.dispose();
    35. }
    36. });
    37. }
    38. //下面的代码实现了按钮的监听触发,并对出发事件做出相应的处理
    39. public void actionPerformed(ActionEvent e) {
    40. if (e.getSource() == nextButton) {
    41. cardLayout.next(cardPanel); //如果用户点击 nextbutton,则显示 cardPanel 面板的下一张卡片
    42. }
    43. if (e.getSource() == preButton) {
    44. cardLayout.previous(cardPanel); //如果用户点击 preButton,则显示 cardPanel 面板的上一张卡片
    45. }
    46. }
    47. }
    48. public class example06 {
    49. public static void main(String[] args) {
    50. Layout cardLayout = new Layout();
    51. }
    52. }

    运行程序,生成的窗口如下所示。
    QQ截图20200618185558.png QQ截图20200618185606.png QQ截图20200618185617.png

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