监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。

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

我们是写监听器去监听其他对象,那么我们如果想设计一个对象,让这个对象可以被别的对象监听又该怎么做呢,

可以按照严格的事件处理模型来设计一个对象,这个对象就可以被别的对象监听,事件处理模型涉及到三个组件:事件源、事件对象、事件监听器。

模型图

监听器模型涉及以下三个对象,模型图如下:

(1)事件:用户对组件的一个操作,称之为一个事件

(2)事件源:发生事件的组件就是事件源

(3)事件监听器(处理器):监听并负责处理事件的方法

执行顺序如下

1、给事件源注册监听器

2、组件接受外部作用,也就是事件被触发

3、组件产生一个相应的事件对象,并把此对象传递给与之关联的事件处理器

4、事件处理器启动,并执行相关的代码来处理该事件。

监听器模式

事件源注册监听器之后,当事件源触发事件,监听器就可以回调事件对象的方法;更形象地说,监听者模式是基于:注册-回调的事件/消息通知处理模式,就是被监控者将消息通知给所有监控者。

1、注册监听器:事件源.setListener;

2、回调:事件源实现onListener。

下面,来看两个demo。

一、简化了上图所示的模型,仅仅包含事件源与监听器

1 /*

2 * 事件源:事件发生的地点3 */

4 public classEventSource {5 privateIEventListener mEventListener;6

7 //注册监听器

8 public voidsetEventListener(IEventListener arg) {9 mEventListener =arg;10 }11

12 //触发事件

13 public voidEventHappened() {14 mEventListener.onclickButton();15 }16

17 }

EventSource

1 /*

2 * 事件监听器,事件处理器3 */

4 public interfaceIEventListener {5 voidonclickButton();6 }

IEventListener

1 public classTest {2 public static voidmain(String[] args) {3

4 //事件源(被监听的对象)

5 EventSource m1 = newEventSource();6

7 //监听器

8 IEventListener mEventListener = newIEventListener() {9

10 @Override11 public voidonclickButton() {12 //TODO Auto-generated method stub

13 System.out.println("你点击了按钮");14 }15 };16

17 //注册监听器到事件源

18 m1.setEventListener(mEventListener);19 m1.EventHappened();20 }21 }

Test

【实验结果】

你点击了按钮

完整模型的demo

1 /*

2 * 事件3 */

4 public interfaceIEvent {5

6 voidsetEventListener(IEventListener arg);7

8 booleanClickButton();9

10 booleanMoveMouse();11

12 }

IEvent

1 /*

2 * 事件监听器,调用事件处理器3 */

4 public interfaceIEventListener {5

6 voiddoEvent(IEvent arg);7 }

IEventListener

1 /*

2 * 事件源:事件发生的地点3 */

4 public class EventSource implementsIEvent{5 privateIEventListener mEventListener;6 booleanbutton;7 booleanmouse;8

9 //注册监听器

10 @Override11 public voidsetEventListener(IEventListener arg){12 mEventListener =arg;13 }14

15 //触发事件

16 public voidmouseEventHappened(){17 mouse = true;18 mEventListener.doEvent(this);19 }20

21 @Override22 public booleanClickButton() {23 returnbutton;24 //TODO Auto-generated method stub

25

26 }27

28 @Override29 public booleanMoveMouse() {30 //TODO Auto-generated method stub

31 returnmouse;32 }33

34 }

EventSource

1 public class EventSource2 implementsIEvent {2 privateIEventListener ml;3 booleanbutton;4 booleanmouse;5

6 @Override7 public voidsetEventListener(IEventListener arg) {8 ml =arg;9 }10

11 @Override12 public booleanClickButton() {13 //TODO Auto-generated method stub

14 returnbutton;15 }16

17 @Override18 public booleanMoveMouse() {19 //TODO Auto-generated method stub

20 returnmouse;21 }22

23 //触发事件

24 public voidbuttonEventHappened() {25 button = true;26 ml.doEvent(this);27 }28

29 }

EventSource2

1 public classTest {2 public static voidmain(String[] args) {3

4 //事件源(被监听的对象)

5 EventSource m1 = newEventSource();6 EventSource2 m2 = newEventSource2();7 //监听器

8 IEventListener mEventListener = newIEventListener() {9

10 @Override11 public voiddoEvent(IEvent arg) {12 if (true ==arg.ClickButton()) {13 System.out.println("你点击了按钮");14 }else if(true ==arg.MoveMouse()){15 System.out.println("你移动了鼠标");16 }17 }18 };19

20 //注册监听器到事件源

21 m1.setEventListener(mEventListener);22 m1.mouseEventHappened();23

24 //注册监听器到事件源

25 m2.setEventListener(mEventListener);26 m2.buttonEventHappened();27 }28 }

Test

【实验结果】

你移动了鼠标

你点击了按钮

java监听器的原理_[转]Java监听器的原理与实现相关推荐

  1. java项目----教务管理系统_基于Java的教务管理系统

    java项目----教务管理系统_基于Java的教务管理系统 2022-04-22 18:18·java基础 最近为客户开发了一套学校用教务管理系统,主要实现学生.课程.老师.选课等相关的信息化管理功 ...

  2. java 字节码增强原理_深入浅出Java探针技术1--基于java agent的字节码增强案例

    Java agent又叫做Java 探针,本文将从以下四个问题出发来深入浅出了解下Java agent 一.什么是java agent? Java agent是在JDK1.5引入的,是一种可以动态修改 ...

  3. java 检测硬盘原理_深入Java核心 Java内存分配原理精讲

    Java内存分配与管理是Java的核心技术之一,一般Java在内存分配时会涉及到以下区域: ◆寄存器:我们在程序中无法控制 ◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 ...

  4. java语言 编译原理_【Java学习】深入分析Java的编译原理

    在<Java代码的编译与反编译>中,有过关于Java语言的编译和反编译的介绍.我们可以通过javac命令将Java程序的源代码编译成Java字节码,即我们常说的class文件.这是我们通常 ...

  5. java swing 注册事件_比较Java Swing中三种注册事件的方法

    Swing 是目前Java中不可缺少的窗口工具组,是建立图形化用户界面(GUI)程序的强大工具.Java Swing组件自动产生各种事件来响应用户行为.Java将事件封装成事件类,并且为每个事件类定义 ...

  6. java 写字板源代码_基于JAVA的模拟写字板的设计与实现(含录像)

    基于的模拟写字板的设计与实现(含录像)(任务书,开题报告,中期检查表,外文翻译,毕业论文18800字,程序代码,答辩PPT,答辩视频录像) 摘要 目前,很多新的技术领域都涉及到了Java语言,Java ...

  7. java pdf插件下载_免费java pdf控件

    云原生的概念和理论体系非常的完备,but talk is cheap , show me the code ! 但是作为一名程序员,能动手的咱绝对不多BB,虽然talk并不cheap , 能跟不同层次 ...

  8. java 包装类可以被继承_【Java基本功】一文了解Java中继承、封装、多态的细节...

    本节主要介绍Java面向对象三大特性:继承 封装 多态,以及其中的原理. 本文会结合虚拟机对引用和对象的不同处理来介绍三大特性的原理. 继承 Java中的继承只能单继承,但是可以通过内部类继承其他类来 ...

  9. java是什么格式_是java格式

    错误:编码GBK的不可映射字符的解决办法 最近在重新补javaSE的基础,编辑器编写完代码以后,在控制台运行代码段的时候,出现了以下的错误提示:错误:编码GBK的不可映射字符 在通过查询谷哥和度娘以后 ...

  10. java 异常处理发生异常_处理Java中的异常

    java 异常处理发生异常 每个程序员都希望编写一个完美的程序. 也就是说,程序运行时没有任何障碍. 好吧,如果希望是马,乞g就会骑. 除了程序员的所有愿望之外,有时还会发生无法预料的情况. 在Jav ...

最新文章

  1. 输出一个为递增排序数组的旋转数组中的最小元素——8
  2. 王炸养成记——看Linux 25周年发展变化
  3. 软件测试第二次作业:JUNIT单元测试方法
  4. MySQL Group Replication调研剖析
  5. JS的编码:escape,encodeURI,encodeURIComponent,解码:unescape,decodeURI,decodeURIComp
  6. this 和super关键字
  7. 脚本错误和安全警报怎么解决_适用于应用程序错误的AWS警报
  8. 作者:何波(1989-),男,就职于中国信息通信研究院互联网法律研究中心
  9. 64位汇编中的布尔指令
  10. OpenCV3学习(8.3)模板匹配函数matchTemplate详解
  11. 【英语学习】【Level 07】U08 Old Stories L6 Looking back
  12. C# Lambda表达式使用累加器例子
  13. form表单序列化后的数据转json对象
  14. ERROR 1045 (28000): Access denied for user 'root'@'localhost' 的解决方法
  15. 使用Web界面登陆vSphere
  16. FW:星巴客装B指南
  17. 超强的照片无损放大修复工具 SmartDeblur模糊照片变清晰工具
  18. mac打开chm格式文件
  19. win7怎样更改计算机密码,win7系统电脑怎么设置开机密码
  20. python编程从入门到实践练习7-10:梦想的旅游胜地

热门文章

  1. decimal 和 numeric 的区别
  2. mounted钩子函数_vue中created钩子函数与mounted钩子函数的使用区别
  3. 后端技术 - 收藏集 - 掘金
  4. c语言strlen用法,如何使用c语言中的strlen()函数
  5. 佟刚老师javaweb笔记(二)
  6. Android案例手册 - 定位点圆形水波纹和椭圆水波纹
  7. vue姓名筛选模糊搜索
  8. linux SIGSEGV信号 内存访问错误 Segmentation fault
  9. 关于pip下载很慢很慢
  10. 被迫停运|黑客组织攻击俄罗斯天然气公司石油网站