8.1.5 适配器类 捕获窗体操作: Frame.addWindowListener(listener); WindowListener 有六个接口,而通常我们只用到其中的1到2个,这个时候就可考虑改用适配器 WindowAdapter 为什么用 WindowAdapter 适配器
8.1.5 适配器类
捕获窗体操作:
Frame.addWindowListener(listener);
WindowListener 有六个接口,而通常我们只用到其中的1到2个,这个时候就可考虑改用适配器 WindowAdapter
为什么用 WindowAdapter 适配器就不用书写全部方法呢?
WindowAdapter 是一个抽象类,它实现了窗体接口相关的全部接口,让其变成非抽象方法。因此我们可以只适配其中一部分方法:
相当于,实现接口这一步它替我们做了。
当然也有个副作用,就是可以一个接口方法也不写,像这样:
但是这个副作用非常小,因为程序员逻辑上不会书写这种毫无意义的适配器。
测试下关闭监听:
public class Main {public static void main(String[] args) {
Main solution = new Main();
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
PlatFrame frame = new PlatFrame();
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
int opt = JOptionPane.showConfirmDialog(frame,
"请确认是否关闭?", "确认框",
JOptionPane.YES_NO_OPTION);
if (opt == JOptionPane.YES_OPTION) {
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}else{
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
}
}
});
frame.setVisible(true);
}
});
}
}
class PlatFrame extends JFrame{
private static final int W = 300;
private static final int H = 200;
public PlatFrame(){
setTitle("PlafTest");
setSize(W,H);
Toolkit toolkit = Toolkit.getDefaultToolkit();
Dimension rect = toolkit.getScreenSize();
setLocation((int)(rect.getWidth()-W)/2,(int)(rect.getHeight()-H)/2);
}
}
点'是'进行关闭,点'否'取消关闭
8.2 动作
有时候,多个事件对应同一种操作。比如把背景颜色为蓝色,可以同时放在一下位置:
- 按钮
- 菜单项
- 键盘CTRL+B
此处,改变背景颜色是动作。动作可以使用类继承AbstractAciton来实现,参考作者的内容加了菜单栏:
- 按钮
- 菜单项
- 键盘 CTRL+R/CTRL+B/CTRL+Y
实际操作:
按钮事件:找到 参数->值
键盘事件:找到 键盘按键->字符串x,字符串x->Action,Action.参数->值
菜单事件:找到 参数->值
public class Main {public static void main(String[] args) {
Main solution = new Main();
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
ActionFrame b = new ActionFrame();
b.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
b.setVisible(true);
}
});
}
}
class ActionFrame extends JFrame{
public static final int W = 300;
public static final int H = 200;
private JPanel buttonPanel;
public ActionFrame(){
setSize(W,H);
Toolkit t = Toolkit.getDefaultToolkit();
Dimension d = t.getScreenSize();
setLocation((int)(d.getWidth()-W)/2,(int)(d.getHeight()-H)/2);
setTitle("ActionTest");
buttonPanel = new JPanel();
Action yellowAction = new ColorAction("Yellow",Color.YELLOW);
Action blueAction = new ColorAction("Blue",Color.BLUE);
Action redAction = new ColorAction("Red",Color.RED);
buttonPanel.add(new JButton(yellowAction));
buttonPanel.add(new JButton(blueAction));
buttonPanel.add(new JButton(redAction));
add(buttonPanel);
InputMap imap = buttonPanel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
imap.put(KeyStroke.getKeyStroke("ctrl Y"),"panel.yellow");
imap.put(KeyStroke.getKeyStroke("ctrl B"),"panel.blue");
imap.put(KeyStroke.getKeyStroke("ctrl R"),"panel.red");
ActionMap amap = buttonPanel.getActionMap();
amap.put("panel.yellow",yellowAction);
amap.put("panel.blue",blueAction);
amap.put("panel.red",redAction);
JMenu menu = new JMenu("Color");
JMenuItem yellowItem = new JMenuItem("Yellow");
JMenuItem blueItem = new JMenuItem("Blue");
JMenuItem redItem = new JMenuItem("Red");
menu.add(yellowItem);
menu.add(blueItem);
menu.add(redItem);
yellowItem.setAction(yellowAction);
blueItem.setAction(blueAction);
redItem.setAction(redAction);
JMenuBar bar = new JMenuBar();
bar.add(menu);
setJMenuBar(bar);
}
private class ColorAction extends AbstractAction{
public ColorAction(String name,Color c){
putValue(Action.NAME, name);
putValue(Action.SHORT_DESCRIPTION,"Set panel color to"+name.toLowerCase());
putValue("color",c);
}
public void actionPerformed(ActionEvent event){
Color c = (Color) getValue("color");
buttonPanel.setBackground(c);
}
}
}
相关内容:选择 《Java核心技术 卷1》专栏查找相关笔记
喜欢的话,点个赞吧~!平时做题,以及笔记内容将更新到公众号。
关注公众号,互相学习:钰娘娘知识汇总