awt的CardLayout布局
CardLayout 布局管理器以时间而非空间来管理它里面的组件,它将加入容器的所有组件看成一叠卡片(每个卡片其实就是一个组件),每次只有最上面的那个Component才可见。就好像一副扑克牌,它们叠在一起,每次只有最上面的一张扑克牌才可见
方法 | 作用 |
---|---|
CardLayout() | 创建默认的 CardLayout 布局管理器 |
CardLayout(int hgap,int vgap) | 通过指定卡片与容器左右边界的间距C hgap)、上下边界C vgap)的间距来创建CardLayout布局管理器 |
first(Container target) | 显示target容器中的第一张卡片 |
last(Container target) | 显示target容器中的最后一张卡片 |
previous(Container target) | 显示target容器中的前一张卡片 |
next(Container target) | 显示target容器中的后一张卡片 |
show(Container taget,String name) | 显示target容器中指定名字的卡片 |
package ch29;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class a_3_6awt_CardLayout {
public static void main(String[] args) {
//1、创建Frame容器对象
Frame frame = new Frame("这里测试CardLayout");
//2、、创建一个String数组,存储不同卡片的名字
String[] names = {"第一张", "第二张", "第三张", "第四张", "第五张"};
//注意上面那行的具体顺序是49行存储进p1容器时的顺序,不是说我们写第几张它的顺序就是几,上面那行只是恰好我们存储是按顺序存储的
//3、创建一个Panel容器p1,并设置其布局管理器为CardLayout,用来存放多张卡片
CardLayout cardLayout = new CardLayout();
Panel p1 = new Panel();
p1.setLayout(cardLayout);
//4、往p1容器里面添加5个卡片;往p1容器中存储5个Button按钮,名字从String数组中取
for (int i = 0; i < 5; i++) {
p1.add(names[i], new Button(names[i]));
}
//p1容器里的5张卡片在同一时刻只能展示其中一张卡片。我们就可以通过下面的按钮来控制展示那张卡片
//5、创建一个Panel容器p2,用来存储5个按钮,完成卡片的切换
Panel p2 = new Panel();
//6、创建5个按钮,并给按钮设置监听器
ActionListener listener = new ActionListener() {
//由于上面那行的ActionListener是个接口,所以下面那行需要重写actionPerformed方法
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();//右边会得到一个字符串返回值command,其实command就是按钮上的文字
switch (command) {//判断当前点击的是哪个按钮,原理:根据按钮上的文字来判断
case "上一张"://如果文字是'上一张',就执行下面那行的CardLayout布局管理器的previous方法,作用是显示前一张卡片
cardLayout.previous(p1);
break;
case "下一张"://如果文字是'下一张',就执行下面那行的CardLayout布局管理器的next方法,作用是显示后一张卡片
cardLayout.next(p1);
break;
case "第一张"://如果文字是'第一张',就执行下面那行的CardLayout布局管理器的first方法,作用是显示第一张卡片
cardLayout.first(p1);
break;
case "最后一张"://如果文字是'最后一张',就执行下面那行的CardLayout布局管理器的last方法,作用是显示最后一张卡片
cardLayout.last(p1);
break;
case "第三张"://如果文字是'第三张',就执行下面那行的CardLayout布局管理器的show方法,作用是显示指定名字的卡片
cardLayout.show(p1, "第三张");
break;
}
}
};
//创建5个按钮组件
Button b1 = new Button("上一张");
Button b2 = new Button("下一张");
Button b3 = new Button("第一张");
Button b4 = new Button("最后一张");
Button b5 = new Button("第三张");
//把当前这个时间监听器和多个按钮绑定在一起
b1.addActionListener(listener);
b2.addActionListener(listener);
b3.addActionListener(listener);
b4.addActionListener(listener);
b5.addActionListener(listener);
//7、把5个按钮添加到p2容器中
p2.add(b1);
p2.add(b2);
p2.add(b3);
p2.add(b4);
p2.add(b5);
//8、把p1容器添加到frame容器的中间区域
frame.add(p1);//不指定区域就默认放到中间区域
//9、把p2容器添加到frame容器的南部区域
frame.add(p2, BorderLayout.SOUTH);
//10、设置frame容器最佳大小并可见
frame.pack();
frame.setVisible(true);
//给Frame设置WindowListener监听器,监听用户点击右上角X的动作,则关闭窗口
frame.addWindowListener(new WindowAdapter() {
//采用Java通过的适配器设计模式,我们只需要重写自己需要的方法,例如windowClosing方法,如下
public void windowClosing(WindowEvent e) {
System.exit(0);//原理:退出JVM虚拟机,即退出当前运行的Java程序
}
});
}
//为什么按钮里面的文字出现乱码:idea编码是UTF-8,生成的按钮是由当前win11操作系统创建的,而当前系统的默认编码是中文GBK编码,不一致就会出现乱码
//解决:让编码和解码一致
//具体解决:在idea软件的上方中间靠右一些有一个绿色锤子图标,点击锤子图标右边的输入框,点击下拉的Edit Configurations...,点击弹出来的
//选项卡的Modify options绿色字体,找到Add VM options并勾选,将'-Dfile.encoding=gbk'输入到刚才Modify options蓝色字体的
//下方的三条输入框中的最上面那条输入框里面
}