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蓝色字体的 //下方的三条输入框中的最上面那条输入框里面
}