在操作程序时,经常会遇到通过选项卡按钮来切换程序中的界面,这些界面就相当于一张张卡片,而管理这些卡片的布局管理器就是卡片布局管理器(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 的优点是可以使两个或更多的界面共享一个显示空间,某一时刻只有一个界面可见。