java监听器原理理解与实现
监听器模型涉及以下三个对象,模型图如下:
(1)事件:用户对组件的一个操作,称之为一个事件
(2)事件源:发生事件的组件就是事件源
(3)事件监听器(处理器):监听并负责处理事件的方法

执行顺序如下:
1、给事件源注册监听器
2、组件接受外部作用,也就是事件被触发
3、组件产生一个相应的事件对象,并把此对象传递给与之关联的事件处理器
4、事件处理器启动,并执行相关的代码来处理该事件。
监听器模式:事件源注册监听器之后,当事件源触发事件,监听器就可以回调事件对象的方法;更形象地说,监听者模式是基于:注册-回调的事件/消息通知处理模式,就是被监控者将消息通知给所有监控者。
1、注册监听器:事件源.setListener;
2、回调:事件源实现onListener。
下面,来看两个demo。
一、简化了上图所示的模型,仅仅包含事件源与监听器
- /*
- * 事件源:事件发生的地点
- */
- public class EventSource {
- private IEventListener mEventListener;
- // 注册监听器
- public void setEventListener(IEventListener arg) {
- mEventListener = arg;
- }
- // 触发事件
- public void EventHappened() {
- mEventListener.onclickButton();
- }
- }
/*
* 事件源:事件发生的地点
*/
public class EventSource {
private IEventListener mEventListener;
// 注册监听器
public void setEventListener(IEventListener arg) {
mEventListener = arg;
}
// 触发事件
public void EventHappened() {
mEventListener.onclickButton();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- /*
- * 事件监听器,事件处理器
- */
- public interface IEventListener {
- void onclickButton();
- }
/*
* 事件监听器,事件处理器
*/
public interface IEventListener {
void onclickButton();
}
- 1
- 2
- 3
- 4
- 5
- 6
- public class Test {
- public static void main(String[] args) {
- // 事件源(被监听的对象)
- EventSource m1 = new EventSource();
- // 监听器
- IEventListener mEventListener = new IEventListener() {
- @Override
- public void onclickButton() {
- // TODO Auto-generated method stub
- System.out.println(”你点击了按钮”);
- }
- };
- // 注册监听器到事件源
- m1.setEventListener(mEventListener);
- m1.EventHappened();
- }
- }
public class Test {
public static void main(String[] args) {
// 事件源(被监听的对象)
EventSource m1 = new EventSource();
// 监听器
IEventListener mEventListener = new IEventListener() {
@Override
public void onclickButton() {
// TODO Auto-generated method stub
System.out.println("你点击了按钮");
}
};
// 注册监听器到事件源
m1.setEventListener(mEventListener);
m1.EventHappened();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
【实验结果】
你点击了按钮
二、完整模型的demo
- /*
- * 事件
- */
- public interface IEvent {
- void setEventListener(IEventListener arg);
- boolean ClickButton();
- boolean MoveMouse();
- }
/*
* 事件
*/
public interface IEvent {
void setEventListener(IEventListener arg);
boolean ClickButton();
boolean MoveMouse();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- /*
- * 事件监听器,调用事件处理器
- */
- public interface IEventListener {
- void doEvent(IEvent arg);
- }
/*
* 事件监听器,调用事件处理器
*/
public interface IEventListener {
void doEvent(IEvent arg);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- /*
- * 事件源:事件发生的地点
- */
- public class EventSource implements IEvent{
- private IEventListener mEventListener;
- boolean button;
- boolean mouse;
- //注册监听器
- @Override
- public void setEventListener(IEventListener arg){
- mEventListener = arg;
- }
- //触发事件
- public void mouseEventHappened(){
- mouse = true;
- mEventListener.doEvent(this);
- }
- @Override
- public boolean ClickButton() {
- return button;
- // TODO Auto-generated method stub
- }
- @Override
- public boolean MoveMouse() {
- // TODO Auto-generated method stub
- return mouse;
- }
- }
/*
* 事件源:事件发生的地点
*/
public class EventSource implements IEvent{
private IEventListener mEventListener;
boolean button;
boolean mouse;
//注册监听器
@Override
public void setEventListener(IEventListener arg){
mEventListener = arg;
}
//触发事件
public void mouseEventHappened(){
mouse = true;
mEventListener.doEvent(this);
}
@Override
public boolean ClickButton() {
return button;
// TODO Auto-generated method stub
}
@Override
public boolean MoveMouse() {
// TODO Auto-generated method stub
return mouse;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- public class EventSource2 implements IEvent {
- private IEventListener ml;
- boolean button;
- boolean mouse;
- @Override
- public void setEventListener(IEventListener arg) {
- ml = arg;
- }
- @Override
- public boolean ClickButton() {
- // TODO Auto-generated method stub
- return button;
- }
- @Override
- public boolean MoveMouse() {
- // TODO Auto-generated method stub
- return mouse;
- }
- // 触发事件
- public void buttonEventHappened() {
- button = true;
- ml.doEvent(this);
- }
- }
public class EventSource2 implements IEvent {
private IEventListener ml;
boolean button;
boolean mouse;
@Override
public void setEventListener(IEventListener arg) {
ml = arg;
}
@Override
public boolean ClickButton() {
// TODO Auto-generated method stub
return button;
}
@Override
public boolean MoveMouse() {
// TODO Auto-generated method stub
return mouse;
}
// 触发事件
public void buttonEventHappened() {
button = true;
ml.doEvent(this);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- public class Test {
- public static void main(String[] args) {
- // 事件源(被监听的对象)
- EventSource m1 = new EventSource();
- EventSource2 m2 = new EventSource2();
- // 监听器
- IEventListener mEventListener = new IEventListener() {
- @Override
- public void doEvent(IEvent arg) {
- if (true == arg.ClickButton()) {
- System.out.println(”你点击了按钮”);
- }else if(true == arg.MoveMouse()){
- System.out.println(”你移动了鼠标”);
- }
- }
- };
- // 注册监听器到事件源
- m1.setEventListener(mEventListener);
- m1.mouseEventHappened();
- // 注册监听器到事件源
- m2.setEventListener(mEventListener);
- m2.buttonEventHappened();
- }
- }
public class Test {
public static void main(String[] args) {
// 事件源(被监听的对象)
EventSource m1 = new EventSource();
EventSource2 m2 = new EventSource2();
// 监听器
IEventListener mEventListener = new IEventListener() {
@Override
public void doEvent(IEvent arg) {
if (true == arg.ClickButton()) {
System.out.println("你点击了按钮");
}else if(true == arg.MoveMouse()){
System.out.println("你移动了鼠标");
}
}
};
// 注册监听器到事件源
m1.setEventListener(mEventListener);
m1.mouseEventHappened();
// 注册监听器到事件源
m2.setEventListener(mEventListener);
m2.buttonEventHappened();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
【实验结果】
你移动了鼠标
你点击了按钮
java监听器原理理解与实现的更多相关文章
- JAVA监听器原理
http://blog.csdn.net/longyulu/article/details/25054697 JAVA监听器原理 标签: 监听器 2014-05-05 15:40 9070人阅读 评论 ...
- Java监听器原理及实例
一.监听器原理 监听器是基于事件驱动的,用于对操作事件进行监听.处理,是观察者设计模式的应用 监听器三元素: 2.1 事件源:事件发生的源头 2.2 事件:对事件进行抽象.封装 2.3 监听器:用于监 ...
- java的classLoader原理理解和分析
java的classLoader原理理解和分析 学习了:http://blog.csdn.net/tangkund3218/article/details/50088249 ClassNotFound ...
- 深入理解Java类加载器(一):Java类加载原理解析
摘要: 每个开发人员对java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这个异常背后涉及到的是Java技术体系中的类加载机制.本文简述了JVM三种预定义类加载器,即 ...
- [JavaEE]Java NIO原理图文分析及代码实现
转http://weixiaolu.iteye.com/blog/1479656 目录: 一.java NIO 和阻塞I/O的区别 1. 阻塞I/O通信模型 2. java NIO ...
- Java基础之理解Annotation(与@有关,即是注释)
Java基础之理解Annotation 一.概念 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata) ...
- Java跨平台原理
此篇博文主要源自网络xiaozhen的天空的博客:http://xiaozhen1900.blog.163.com/blog/static/1741732572011325111945246/ 1.是 ...
- 【转】Java跨平台原理
原文地址:http://www.cnblogs.com/gw811/archive/2012/09/09/2677386.html 1.是么是平台 Java是可以跨平台的编程语言,那我们首先得知道什么 ...
- 《Java虚拟机原理图解》 1.2、class文件里的常量池
[最新更新:2014/11/11] 了解JVM虚拟机原理 是每个Java程序猿修炼的必经之路. 可是因为JVM虚拟机中有非常多的东西讲述的比較宽泛.在当前接触到的关于JVM虚拟机原理的教程或者博客中 ...
随机推荐
- bzoj 3916: friends 瞎搞
题目: 有三个好朋友喜欢在一起玩游戏,A君写下一个字符串S,B君将其复制一遍得到T,C君在T的任意位置(包括首尾)插入一个字符得到U.现在你得到了U,请你找出S. 题解: 发现字符串的长度一定为奇数. ...
- 虚拟机centos系统,停机装第二块网卡,需要更改的配置
虚拟机centos系统,停机装第二块网卡,需要更改的配置. 问题描述: 虚拟机centos系统,停机装第二块网卡,发现 /etc/sysconfig/network-scripts/ifcfg-et ...
- POJ1958:Strange Towers of Hanoi
我对状态空间的理解:https://www.cnblogs.com/AKMer/p/9622590.html 题目传送门:http://poj.org/problem?id=1958 题目要我们求四柱 ...
- Shiro 权限管理filterChainDefinitions过滤器配置
博客转载:http://blog.csdn.net/userrefister/article/details/47807075 /** * Shiro-1.2.2内置的FilterChain * @s ...
- puppet插件fact和hiera(puppet自动化系列3)
四.Fact插件 4.1 使用pluginsync进行发布 这种方法比较特殊,节点factpath目录里除了编写好的rb文件之外,还需要在puppet模块中引用,运行一次之后才会转换成fact.通常在 ...
- tomcat 自带jdk
http://blog.csdn.net/b452608/article/details/70143466
- java 设置Cookie值
原文地址:http://blog.csdn.net/lansetiankong12/article/details/52622654 /** * 读取所有cookie * 注意二.从客户端读取Cook ...
- 关于ArcGis for javascript整合百度地图 天地图 高德地图进行搜索
1.ArcGis for javascript整合百度地图搜索 1.1.首先引入百度地图的api <!-- 引入百度地图API --> <script type="text ...
- typeof用法
typeof的运算数未定义,返回的就是 "undefined". 运算数为数字 typeof(x) = "number" 字符串 typeof(x) = &qu ...
- SpringBoot04 SpringBoot 和 MyBatis 整合
1 所需的jar包 mysql驱动包:mysql-connector-java 数据库链接池:druid mybatis对应jar包:mybatis-spring-boot-starter 分页查询对 ...