记得以前看过事件监听机制背后也是有一种设计模式的.(设计模式的名字记不清了,只记得背后实现的数据结构是数组.)

附上事件监听机制的分析图:

一个事件源可以承载多个事件(只要这个事件源支持这个事件就可以,男人就不支持生孩子的事件)  事件和监听器有对应关系的.

下面用awt中的标准图形化界面分析:

接口WindowListener 中有一个实现类WindowAdapter类.适配器类.

EventListener.java 下面是所有超级接口EventListener.java的源代码   其实就是一个空接口.

1 package java.util;
2
3 /**
4  * A tagging interface that all event listener interfaces must extend.
5  * @since JDK1.1
6  */
7 public interface EventListener {
8 }

WindowListener.java 这个接口的源代码  定义了一些抽象方法

 1 public interface WindowListener extends EventListener {
 2     /**
 3      * Invoked the first time a window is made visible.
 4      */
 5     public void windowOpened(WindowEvent e);
 6
 7     public void windowClosing(WindowEvent e);
 8
 9     public void windowClosed(WindowEvent e);
10
11     public void windowIconified(WindowEvent e);
12
13     public void windowDeiconified(WindowEvent e);
14
15     public void windowActivated(WindowEvent e);
16
17     public void windowDeactivated(WindowEvent e);
18 }

WindowAdapter.java这个实现类的源代码: WindowAdapter是一个抽象类.但是这个抽象类里面却没有抽象方法!!!!!!!

所有的方法都是空实现!!!空方法!!!

 1 public abstract class WindowAdapter
 2     implements WindowListener, WindowStateListener, WindowFocusListener
 3 {
 4     /**
 5      * Invoked when a window has been opened.
 6      */
 7     public void windowOpened(WindowEvent e) {}
 8
 9     public void windowClosing(WindowEvent e) {}
10
11     public void windowClosed(WindowEvent e) {}
12
13     public void windowIconified(WindowEvent e) {}
14
15     public void windowDeiconified(WindowEvent e) {}
16
17     public void windowActivated(WindowEvent e) {}
18
19     public void windowDeactivated(WindowEvent e) {}
20
21     public void windowStateChanged(WindowEvent e) {}
22
23     public void windowGainedFocus(WindowEvent e) {}
24
25     /**
26      * Invoked when the Window is no longer the focused Window, which means
27      * that keyboard events will no longer be delivered to the Window or any of
28      * its subcomponents.
29      *
30      * @since 1.4
31      */
32     public void windowLostFocus(WindowEvent e) {}
33 }

窗口事件的抽象适配器类(WindowAdapter).此类中的方法为空.此类存在的目的是方便创建监听器对象.

如果实现WindowListener 就要覆盖其中的所有抽象方法,但是继承WindowAdapter就不需要了,JDK为你定义好了这样的一个适配器类,

实现了所有WindowListener接口中的抽象方法.所以只需继承WindowAdapter类就可以了.需要什么方法就覆盖其中的方法.

EventListener是接口,WindowListener 也是接口,WindowAdapter是一个抽象类.

EventListener接口是一个空接口,WindowListener接口定义了一些公用的抽象方法,WindowAdapter是一个抽象类,但是里面没有任何的抽象方法.

要深入理解抽象类和接口的区别.

抽象类可以不含有抽象方法的!!!

因为这样有两个好处.

1.不让该类创建对象.

2.方便创建该接口的对象.

继承我这个抽象类,选择其中的一个方法去覆盖就可以了

在其中直接用匿名内部类就可以了.用哪个覆盖哪个.

给一个按钮增加一个活动监听.ActionListener

在Button类中有一个addActionListener(Listener l)  添加指定的动作侦听器,以接收发自此按钮的动作事件。

其中要传入一个ActionListener对象.看一下这个ActionListener对象

这个ActionListener对象有N多实现类,但是却不像WindowsLisntener一样有一个对应的适配器类.因为这个ActionListener接口中只有一个方法.

这就是一种原则,规则性的问题.

只要监听器中的方法超过两个一般都有一个对应的适配器,但是这个ActionListener接口中只有一个方法.

监听器中有两个或者两个以内方法的话没有对应适配器类的,创建本身就很方便.

addActionListener(ActionListener l)方法参数传递的是接口型引用,ActionListener本身方法又不多(就只有一个方法,只要覆写一个或者两个就可以了),

方法参数中用匿名内部类就可以了,这样表示看着更简洁明了.

窗体监听(WindowListener)和活动监听(ActionListener)

下面附上代码Demo

 1 import java.awt.Button;
 2 import java.awt.FlowLayout;
 3 import java.awt.Frame;
 4 import java.awt.event.ActionEvent;
 5 import java.awt.event.ActionListener;
 6 import java.awt.event.WindowAdapter;
 7 import java.awt.event.WindowEvent;
 8
 9 public class FrameDemo {
10     public static void main(String[] args) {
11
12         Frame f = new Frame("my frame");
13         f.setBounds(400, 200, 500, 400);
14         f.setLayout(new FlowLayout());//设置流式布局
15
16         Button but  = new Button("一个按钮");
17         f.add(but);//将按钮添加到窗体中。
18
19         f.addWindowListener(new WindowAdapter() {
20             @Override
21             public void windowClosing(WindowEvent e) {
22                 //System.out.println("closing......."+e);
23                 System.exit(0);
24             }
25         });
26         //在按钮上加上一个监听。  点击按钮"一个按钮"就关闭
27         but.addActionListener(new ActionListener() {
28             @Override
29             public void actionPerformed(ActionEvent e) {
30                 //System.out.println("button run .....");
31                 System.exit(0);
32             }
33         });
34         f.setVisible(true);
35         System.out.println("over");
36     }
37 }

点击"右上角的×"和"一个按钮"都是关闭的效果.

转载于:https://www.cnblogs.com/DreamDrive/p/4161632.html

关于事件监听机制的总结(Listener和Adapter)相关推荐

  1. Spring5源码 - 13 Spring事件监听机制_@EventListener源码解析

    文章目录 Pre 概览 开天辟地的时候初始化的处理器 @EventListener EventListenerMethodProcessor afterSingletonsInstantiated 小 ...

  2. Spring5源码 - 12 Spring事件监听机制_异步事件监听应用及源码解析

    文章目录 Pre 实现原理 应用 配置类 Event事件 事件监听 EventListener 发布事件 publishEvent 源码解析 (反推) Spring默认的事件广播器 SimpleApp ...

  3. Spring5源码 - 11 Spring事件监听机制_源码篇

    文章目录 pre 事件监听机制的实现原理[观察者模式] 事件 ApplicationEvent 事件监听者 ApplicationEvent 事件发布者 ApplicationEventMultica ...

  4. java监听com口_简单了解Java接口+事件监听机制

    1.接口: 定义方法: public interface interName //extends interName2, interName3...可继承多个接口 在接口里只能定义常量和抽象方法. p ...

  5. java监听机制_详解java的事件监听机制和观察者设计模式

    首先说说监听器: 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执 行. java的事件监 ...

  6. java事件监听机制pdf,事件监听机制(转)

    事件监听机制在java编程中有很重要的应用,一般我们在处理GUI编程时,只是重写一下监听接口的perform函数即可.但事件监听在底层是如何运行的?通过下面的例子我们可以有个清楚地了解. 1.     ...

  7. springBoot启动事件监听机制

    springBoot启动之事件监听机制源码解析 1. Java的事件监听机制 在进行正式的分析之前,先介绍一下Java的事件监听机制.参考05–SpringBoot启动之事件监听机制 Java事件监听 ...

  8. spring中的事件监听机制

    Spring event listener 介绍 example 简单原理解释 自定义事件.监听和发布 事件 监听器 发布者 测试 更加一般的事件 @EventListener原理 介绍 exampl ...

  9. Spring容器的事件监听机制(简单明了的介绍)

    文章目录 前言 事件 1. 定义事件 2. 定义监听器 3. 定义发布器 Spring容器的事件监听机制 1.事件的继承类图 监听器的继承类图 总结 前言 上一篇我们介绍了SpringFactorie ...

最新文章

  1. 打造属于自己的图文符号库
  2. 利用NavicatPremium把Oracle迁移到MySQL
  3. 真机运行报错:Could not change executable permissions on the application
  4. WPF之ComboBox的VisualTreeHelper
  5. 微服务升级_SpringCloud Alibaba工作笔记0014---Nacos简介和下载_10万微服务实例在线管理
  6. qt5调用python脚本 两次失败_Qt5调用Python脚本中的函数
  7. SSM整合配置文件总结
  8. Django内置数据表
  9. Sql loader使用教程
  10. iMac上用bootcamp安装Win10遇到的问题总结
  11. 离散时间傅里叶变换(DTFT)
  12. 无障碍,root,adb如何隐藏,去除检测
  13. 运行vue项目遇到的bug
  14. 面试相关-转载-well,yzl——持续更新
  15. 【C语言中的EOF】零基础看懂EOF如何使用while(scanf(“%d %d”,a,b)感叹号=EOF)
  16. 计算机用户guest无法删除吗,Win7怎么删除Guest账户?
  17. android粘性广播何时结束,Android之粘性广播理解
  18. centos+mono+nginx+jexus 搭建linux下c#运行环境测试
  19. python+adb 控制安卓手机拍照并传电脑
  20. 正则匹配问号_跟BBEdit学正则表达式,轻松地学习晦涩难解的语法

热门文章

  1. jQuery判断checkbox是否选中
  2. Android UI开发第五篇——自定义列表
  3. 从“兔子狮子谁做老板”的故事,看企业管理
  4. 将字符串分解成一个表(多行、多列)表值函数[ StrSplit_Tab]
  5. 光纤通信及周边产品知识汇总
  6. 中文输入法不触发onkeyup事件的解决办法
  7. File.documentsDirectory抛出异常Error #2014问题解决方案
  8. 关于机房有八台计算出现E盘无法更改盘符的问题
  9. H3C secpath nat的tcp会话数的限制设置
  10. 华为9.0以上系统如何没root激活XPOSED框架的流程