JAVA监听器原理

来源:http://www.cnblogs.com/hulitut/archive/2012/03/27/2420414.html

Java 最新的事件处理方法是基于授权事件模型

事件源生成事件并将其发送至一个或多个监听器

监听器简单地等待,直到它收到一个事件。一旦事件被接受,监听器将处理这些事件,然后返回。


事件:在授权事件模型中,事件是一个描述事件源状态改变的对象 。
通过鼠标、键盘与 GUI 界面直接或间接交互都会生成事件。 如:按下一个按钮、通过键盘输入一个字符、选择列表框中的一项、点击一下鼠标等。


事件源:事件源是一个生成事件的对象
一个事件源可能会生成不同类型的事件
事件源提供了一组方法,用于为事件注册一个或多个监听器。
每种事件的类型都有其自己的注册方法。一般形式为:
public void add<EventType>Listener (TypeListener e)

AWT采取的事件控制过程:监听器对象属于一个类的实例,这个类实现了一个特殊的接口,名为“监听者接口”
事件源是一个对象,它可以注册一个或多个监听器对象,并向其发送事件对象。
事件源将在发生事件时向所有注册的监听器发送事件对象。
监听器对象使用事件对象中的信息来确定它们对事件的响应


事件模型:
1.基于代理(授权)事件模型
事件处理是一个事件源授权到一个或者多个事件监听器。其基本原理是:组件激发事件,事件监听器监听和处理事件,可以调用组件的add<EventType>Listener方法向组件注册监听器。把其加入到组件以后,如果组件激发了相应类型的事件,那么定义在监听器中的事件处理方法会被调用。


2.此模型主要由以三种对象为中心组成
事件源 由它来激发产生事件,是产生或抛出事件的对象。
事件监听器 由它来处理事件
实现某个特定EventListener 接口,此接口定义了一种或多种方法,事件源调用它们以响应该接口所处理的每一种特定事件类型 。
事件 具体的事件类型
事件类型封装在以java.util.EventObject为根的类层次中。当事件发生时,事件记录发生的一切事件,并从事件源传播到监听器对象


来源:http://www.javaweb.cc/language/java/272459.shtml

一. 事件监听器的参与者:

1.事件对象:
一般继承自java.util.EventObject对象,由开发者自行定义.

2.事件源:
就是触发事件的源头,不同的事件源会触发不同的事件类型.

3.事件监听器:
事件监听器负责监听事件源发出的事件.一个事件监听器通常实现java.util.EventListener这个标识接口.

其整个处理过程是这样的,事件源可以注册事件监听器对象,并可以向事件监听器对象发送事件对象.事件发生后,事件源将事件对象发给已经注册的所有事件监听器.
监听器对象随后会根据事件对象内的相应方法响应这个事件.


Demo

/**
 * 事件对象的定义
 * @author administrator
 *
 */
public class DemoEvent extends EventObject {
	private static final long serialVersionUID = 1L;

	public DemoEvent(Object source) {
		super(source);
	}
}


/**
 * DemoEvent事件监听器接口
 * @author administrator
 *
 */
public interface DemoEventListener extends EventListener {

	public void processEvent(DemoEvent demoEvent);

}

/**
 * 第一个具体的事件监听器
 * @author administrator
 *
 */
public class FirstEventListener implements DemoEventListener {

	@Override
	public void processEvent(DemoEvent demoEvent) {
		System.out.println("First event listener process event...");

	}

}

/**
 * 第二个具体的事件监听器
 * @author administrator
 *
 */
public class SecondEventListener implements DemoEventListener {

	@Override
	public void processEvent(DemoEvent demoEvent) {
		System.out.println("Second event listener process event...");

	}

}

/**
 * 定义事件源
 * @author administrator
 *
 */
public class EventSource {
	private List<DemoEventListener> listeners = new ArrayList<DemoEventListener>();

	public EventSource() {
	}

	public void addDemoListener(DemoEventListener demoListener) {
		listeners.add(demoListener);
	}

	public void notifyDemoEvent() {
		for (DemoEventListener eventListener : listeners) {
			DemoEvent demoEvent = new DemoEvent(this);
			eventListener.processEvent(demoEvent);
		}
	}
}

/**
 * 测试监听器处理过程
 * @author administrator
 *
 */
public class DemoEventClient {
	//java中文网:http://www.javaweb.cc

	public static void main(String args[]) {

		//定义事件源
		EventSource eventSource = new EventSource();

		//定义并向事件源中注册事件监听器
		FirstEventListener firstEventListener = new FirstEventListener();
		eventSource.addDemoListener(firstEventListener);

		//定义并向事件源中注册事件监听器
		SecondEventListener secondEventListener=new SecondEventListener();
		eventSource.addDemoListener(secondEventListener);

		//事件通知
		eventSource.notifyDemoEvent();
	}
}

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值