您的位置:首页 > 编程语言 > Java开发

java监听器原理理解与实现

2017-11-27 09:14 225 查看
监听器模型涉及以下三个对象,模型图如下:

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

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

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



执行顺序如下:

1、给事件源注册监听器

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

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

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

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

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

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

下面,来看两个demo。

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

[java] view plain copy print?/* * 事件源:事件发生的地点 */ 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();
}

}
[java] view plain copy print?/* * 事件监听器,事件处理器 */ public interface IEventListener { void onclickButton(); }
/*
* 事件监听器,事件处理器
*/
public interface IEventListener {
void onclickButton();
}
[java] view plain copy print?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();
}
}
【实验结果】

你点击了按钮

二、完整模型的demo

[java] view plain copy print?/* * 事件 */ public interface IEvent { void setEventListener(IEventListener arg); boolean ClickButton(); boolean MoveMouse(); }
/*
* 事件
*/
public interface IEvent {

void setEventListener(IEventListener arg);

boolean ClickButton();

boolean MoveMouse();

}
[java] view plain copy print?/* * 事件监听器,调用事件处理器 */ public interface IEventListener { void doEvent(IEvent arg); }
/*
* 事件监听器,调用事件处理器
*/
public interface IEventListener {

void doEvent(IEvent arg);
}
[java] view plain copy print?/* * 事件源:事件发生的地点 */ 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;
}

}
[java] view plain copy print?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);
}

}
[java] view plain copy print?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();
}
}
【实验结果】

你移动了鼠标

你点击了按钮
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息