当前位置 : 主页 > 编程语言 > java >

《Java 核心技术 卷1》 笔记 第八章 事件处理(3)

来源:互联网 收集:自由互联 发布时间:2022-07-13
8.1.5 适配器类 捕获窗体操作: Frame.addWindowListener(listener); WindowListener 有六个接口,而通常我们只用到其中的1到2个,这个时候就可考虑改用适配器 WindowAdapter 为什么用 WindowAdapter 适配器


8.1.5 适配器类

捕获窗体操作:

Frame.addWindowListener(listener);

WindowListener 有六个接口,而通常我们只用到其中的1到2个,这个时候就可考虑改用适配器 WindowAdapter

为什么用 WindowAdapter 适配器就不用书写全部方法呢?

《Java 核心技术 卷1》 笔记 第八章 事件处理(3)_intellij idea

WindowAdapter 是一个抽象类,它实现了窗体接口相关的全部接口,让其变成非抽象方法。因此我们可以只适配其中一部分方法:

《Java 核心技术 卷1》 笔记 第八章 事件处理(3)_intellij idea_02

相当于,实现接口这一步它替我们做了。

当然也有个副作用,就是可以一个接口方法也不写,像这样:

《Java 核心技术 卷1》 笔记 第八章 事件处理(3)_swing_03

但是这个副作用非常小,因为程序员逻辑上不会书写这种毫无意义的适配器。

测试下关闭监听:

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);
}

}

《Java 核心技术 卷1》 笔记 第八章 事件处理(3)_java_04

点'是'进行关闭,点'否'取消关闭

8.2 动作

有时候,多个事件对应同一种操作。比如把背景颜色为蓝色,可以同时放在一下位置:

  • 按钮
  • 菜单项
  • 键盘CTRL+B

此处,改变背景颜色是动作。动作可以使用类继承AbstractAciton来实现,参考作者的内容加了菜单栏:

  • 按钮
  • 菜单项
  • 键盘 CTRL+R/CTRL+B/CTRL+Y

实际操作:

按钮事件:找到 参数->值

键盘事件:找到 键盘按键->字符串x,字符串x->Action,Action.参数->值

  • ActionMap 给出 字符串 x -> Action 的映射
  • InputMap 给出 键盘事件->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》 笔记 第八章 事件处理(3)_idea_05

    《Java 核心技术 卷1》 笔记 第八章 事件处理(3)_idea_06

    《Java 核心技术 卷1》 笔记 第八章 事件处理(3)_idea_07

    《Java 核心技术 卷1》 笔记 第八章 事件处理(3)_swing_08

    相关内容:选择 《Java核心技术 卷1》专栏查找相关笔记

     喜欢的话,点个赞吧~!平时做题,以及笔记内容将更新到公众号。

    关注公众号,互相学习:钰娘娘知识汇总

    《Java 核心技术 卷1》 笔记 第八章 事件处理(3)_idea_09

    网友评论