直接上代码,代码有保姆级注释
package notebook;
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 FileUtil {
public static void main(String[] args) {
new Cardlayout();//给该对象分配内存,调用构造方法
}
}
class Cardlayout extends Frame implements ActionListener {//component、container、windows、frame//容器类继承自Frame
// 控件 容器 顶级窗口 窗口
Panel cardPanel = new Panel();//放置卡片的panel面板
Panel controlpaPanel = new Panel();//放置按钮的容器、面板
Button nextbutton, preButton;//声明两个button 类型 的 变量
CardLayout cardlayout = new CardLayout();//卡片布局管理器
//==================================================================================================================
public Cardlayout() {//构造方法,对象一实例化就调用
this.setSize(300, 200);//调用父类的Frame的设置窗口大小的方法
this.setVisible(true);//是否可见
//关闭事件监听
this.addWindowListener(new WindowAdapter() {//添加你要监听的窗口,要监听的窗口对象(实现接口)接口的意义:统一 cut 看到这个方法就知道他要干嘛
@Override
public void windowClosing(WindowEvent e) {//如果监听到这个窗口被关闭
Cardlayout.this.dispose();//关闭该窗口
//这里this不能直接定位到Cardlayout类,所以要加上类名,而只有类名又不代表实例化,所以要加上this
//监听windowAdapter对象(窗口),如果关闭,那么就关闭
}
});
cardPanel.setLayout(cardlayout);//这个窗口的布局方式是cardlayout
cardPanel.add(new Label("第一个界面", Label.CENTER));//添加控件,且位于中心
cardPanel.add(new Label("第2个界面", Label.CENTER));
cardPanel.add(new Label("第3个界面", Label.CENTER));
nextbutton = new Button("下一张卡片");//设置按钮内容(label)
preButton = new Button("上一张卡片");
nextbutton.addActionListener(this);//监听当前窗口(this)里的nextbutton按钮
preButton.addActionListener(this);
controlpaPanel.add(preButton);
controlpaPanel.add(nextbutton);//添加控件
this.add(cardPanel, BorderLayout.CENTER);//为什么这里调用的是container的方法,而不是cardlayout的?
//将指定的组件添加到此容器的末尾
//cardPanel不是一个panel的容器吗?怎么在这里被当作组件了。 把cardpanel这个容器当作一个组件放进了cardlayout容器中
//BorderLayout是一个容器? 是的
this.add(controlpaPanel, BorderLayout.SOUTH);
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == nextbutton) {//点击nextbutton
cardlayout.next(cardPanel);
}
if (e.getSource() == preButton) {//点击prebutton
cardlayout.previous(cardPanel);//显示这个窗口里的上一个界面
}
}
}