java监听器的原理与实现

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

(1)事件:用户对组件的一个操作,称之为一个事件
(2)事件源:发生事件的组件就是事件源
(3)事件监听器(处理器):监听并负责处理事件的方法

执行顺序如下:

1、给事件源注册监听器
2、组件接受外部作用,也就是事件被触发
3、组件产生一个相应的事件对象,并把此对象传递给与之关联的事件处理器
4、事件处理器启动,并执行相关的代码来处理该事件。

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

1、注册监听器:事件源.setListener;
2、回调:事件源实现onListener。

下面,来看两个demo。

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

  1. /*
  2. * 事件源:事件发生的地点
  3. */
  4. public class EventSource {
  5. private IEventListener mEventListener;
  6. // 注册监听器
  7. public void setEventListener(IEventListener arg) {
  8. mEventListener = arg;
  9. }
  10. // 触发事件
  11. public void EventHappened() {
  12. mEventListener.onclickButton();
  13. }
  14. }
  1. /*
  2. * 事件监听器,事件处理器
  3. */
  4. public interface IEventListener {
  5. void onclickButton();
  6. }
  1. public class Test {
  2. public static void main(String[] args) {
  3. // 事件源(被监听的对象)
  4. EventSource m1 = new EventSource();
  5. // 监听器
  6. IEventListener mEventListener = new IEventListener() {
  7. @Override
  8. public void onclickButton() {
  9. // TODO Auto-generated method stub
  10. System.out.println('你点击了按钮');
  11. }
  12. };
  13. // 注册监听器到事件源
  14. m1.setEventListener(mEventListener);
  15. m1.EventHappened();
  16. }
  17. }

【实验结果】
你点击了按钮

二、完整模型的demo

  1. /*
  2. * 事件
  3. */
  4. public interface IEvent {
  5. void setEventListener(IEventListener arg);
  6. boolean ClickButton();
  7. boolean MoveMouse();
  8. }
  1. /*
  2. * 事件监听器,调用事件处理器
  3. */
  4. public interface IEventListener {
  5. void doEvent(IEvent arg);
  6. }
  1. /*
  2. * 事件源:事件发生的地点
  3. */
  4. public class EventSource implements IEvent{
  5. private IEventListener mEventListener;
  6. boolean button;
  7. boolean mouse;
  8. //注册监听器
  9. @Override
  10. public void setEventListener(IEventListener arg){
  11. mEventListener = arg;
  12. }
  13. //触发事件
  14. public void mouseEventHappened(){
  15. mouse = true;
  16. mEventListener.doEvent(this);
  17. }
  18. @Override
  19. public boolean ClickButton() {
  20. return button;
  21. // TODO Auto-generated method stub
  22. }
  23. @Override
  24. public boolean MoveMouse() {
  25. // TODO Auto-generated method stub
  26. return mouse;
  27. }
  28. }
  1. public class EventSource2 implements IEvent {
  2. private IEventListener ml;
  3. boolean button;
  4. boolean mouse;
  5. @Override
  6. public void setEventListener(IEventListener arg) {
  7. ml = arg;
  8. }
  9. @Override
  10. public boolean ClickButton() {
  11. // TODO Auto-generated method stub
  12. return button;
  13. }
  14. @Override
  15. public boolean MoveMouse() {
  16. // TODO Auto-generated method stub
  17. return mouse;
  18. }
  19. // 触发事件
  20. public void buttonEventHappened() {
  21. button = true;
  22. ml.doEvent(this);
  23. }
  24. }
  1. public class Test {
  2. public static void main(String[] args) {
  3. // 事件源(被监听的对象)
  4. EventSource m1 = new EventSource();
  5. EventSource2 m2 = new EventSource2();
  6. // 监听器
  7. IEventListener mEventListener = new IEventListener() {
  8. @Override
  9. public void doEvent(IEvent arg) {
  10. if (true == arg.ClickButton()) {
  11. System.out.println('你点击了按钮');
  12. }else if(true == arg.MoveMouse()){
  13. System.out.println('你移动了鼠标');
  14. }
  15. }
  16. };
  17. // 注册监听器到事件源
  18. m1.setEventListener(mEventListener);
  19. m1.mouseEventHappened();
  20. // 注册监听器到事件源
  21. m2.setEventListener(mEventListener);
  22. m2.buttonEventHappened();
  23. }
  24. }

【实验结果】
你移动了鼠标
你点击了按钮

(0)

相关推荐

  • Java学习——64.JCheckBox

    Swing中的按钮组件包括JButton.JRadioButton.JCheckBox,它们都是抽象按钮类AbstractButton类的子类. 今天介绍复选框JCheckBox. 1.复选框类声明 ...

  • 事件驱动 _2

    import com.mars.util.ClassMethod;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java. ...

  • java 监听器 Listener

    监听:ServletContext,request,session.监听他们的创建. requestListener:当request被创建,就被触发.即,当有请求进到服务后台,监听器就会被调用. s ...

  • [Java] SpringMVC工作原理之一:DispatcherServlet

    一.DispatcherServlet 处理流程 在整个 Spring MVC 框架中,DispatcherServlet 处于核心位置,它负责协调和组织不同组件完成请求处理并返回响应工作.在看 Di ...

  • Java的运行原理

    在Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器.这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口.编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由 ...

  • Java跨平台原理与Java虚拟机(JVM)

    Java跨平台原理(字节码文件.虚拟机) C/C++语言都直接编译成针对特定平台机器码.如果要跨平台,需要使用相应的编译器重新编译. Java源程序(.java)要先编译成与平台无关的字节码文件(.c ...

  • Java并发多线程编程——Volatile原理与使用

    优质文章,第一时间送达 76套java从入门到精通实战课程分享 一.volitile的理解 Volatile称之为轻量级锁,被volatile修饰的变量,在线程之间是可见的. 可见即一个线程修改了这个 ...

  • 详述Java线程池实现原理

    优质文章,第一时间送达一.写在前面1.1 线程池是什么线程池(Thread Pool) 是一种池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL.线程过多会带来额外的开销,其中包括创建销毁 ...

  • Java并发之AQS原理剖析

    优质文章,第一时间送达 作者 |  Yanci丶 来源 |  urlify.cn/IFJ3Mb 概述: AbstractQueuedSynchronizer,可以称为抽象队列同步器. AQS有独占模式 ...

  • Java中synchronized的实现原理与应用

    转自:https://blog.csdn.net/u012465296/article/details/53022317 Java中的每一个对象都可以作为锁,而在Synchronized实现同步的几种 ...

  • 聊一聊JAVA指针压缩的实现原理(图文并茂,让你秒懂)

    转自:https://blog.csdn.net/liujianyangbj/article/details/108049482 前言 在网上大家很多都看到过这样一句话:"JVM内存最好不要 ...