1、事件。一般继承自java.util.EventObject类,封装了事件源对象及跟事件相关的信息。
/** * 定义事件(状态)对象(该事件对象包装了事件源对象、作为参数传递给监听器、很薄的一层包装类): * 所有 Event 在构造时都引用了对象 "source",在逻辑上认为该对象是最初发生有关 Event 的**对象 */ public interface Event { public void show(); } //source—事件源对象—如在界面上发生的点击按钮事件中的按钮 //所有 Event 在构造时都引用了对象 "source",在逻辑上认为该对象是最初发生有关 Event // 的对象 不管是click事件还是double click事件都会发生在按钮之上 public class EventImplement extends EventObject implements Event { private EventSource source ; public EventImplement(EventSource source){ super(source); } @Override public void show() { System.out.println(); } }
事件监听器。实现java.util.EventListener接口,注册在事件源上,当事件源的属性或状态改变时,取得相应的监听器调用其内部的回调方法。
/** * EventListener 代表不同的行为 * 如果不同的行为只需要添加不同的 EventListener 即可 * 事件的监听者,当事件被触发,所有监听这个事件的监听者将被通知, 然后执行自己的Action 响应动作。 *listener得到事件并进行处理 */ public interface EventListener { void onEvent(Event e); } /** * 单击事件 */ public class EventListenerImplement1 implements EventListener { @Override public void onEvent(Event e) { System.out.println("single click event"); e.show();//回调 } } /** * 双击事件 */ public class EventListenerImplement2 implements EventListener { @Override public void onEvent(Event e) { System.out.println("double click event"); e.show(); } }
事件源。事件发生的地方,由于事件源的某项属性或状态发生了改变(比如BUTTON被单击、TEXTBOX的值发生改变等等)导致某项事件发生。换句话说就是生成了相应的事件对象。因为事件监听器要注册在事件源上,所以事件源类中应该要有盛装监听器的容器(List,Set等等)。
/** * 被监听者的事件集合,可能是方法,提供事件的注册加入和移除功能。 * source生产事件并分发 * eventSource应该实现EventListener的onEvent方法 */ public interface EventSource { public void registerListener(EventListener e); public void notifyEvent(); } public class EventSourceImplement implements EventSource { private Vector repository = new Vector();//监听自己的监听器队列 @Override public void registerListener(EventListener e) { repository.add(e); } //通知所有的监听器:直接调用对象里缓存repository的listener对象的onEvent方法, //这样就把Event对象分发出去了 @Override public void notifyEvent() { Enumeration enums = repository.elements(); while(enums.hasMoreElements()) { EventListener el = (EventListener)enums.nextElement(); el.onEvent(new EventImplement(this)); } } }
public class Test { public static void main(String[] args){ EventSource source = new EventSourceImplement(); EventListener click = new EventListenerImplement1(); EventListener doubleClick = new EventListenerImplement2(); source.registerListener(click); source.registerListener(doubleClick); source.notifyEvent(); } }
public class SafeListener { private final EventListener listener; private SafeListener() { listener = new EventListener() { public void onEvent(Event e) { e.show(); doSomething(e); } }; } void doSomething(Event e) { } public static SafeListener newInstance(EventSource source) { SafeListener safe = new SafeListener(); source.registerListener(safe.listener); return safe; } public static void main(String[] args){ EventSource source = new EventSourceImplement(); SafeListener safeListener = SafeListener.newInstance(source); source.notifyEvent(); } }
事件源:组件,例如Button
事件对象:event,例如MouseEvent类的对象 事件监听接口:EventListener,例如MouseListener
EventListener 接口是处理事件的主要方法。用户实现 EventListener 接口,并使用 AddEventListener 方法在 EventTarget 上注册其侦听器。用户还应该在使用完侦听器后从其 EventTarget 移除 EventListener。
MouseListener用于接收组件上“感兴趣”的鼠标事件(按下、释放、单击、进入或离开)的侦听器接口。(要跟踪鼠标移动和鼠标拖动,请使用 MouseMotionListener。)
旨在处理鼠标事件的类要么实现此接口(及其包含的所有方法),要么扩展抽象类 MouseAdapter(仅重写所需的方法)。
然后使用组件的 addMouseListener 方法将从该类所创建的侦听器对象向该组件注册。当按下、释放或单击(按下并释放)鼠标时会生成鼠标事件。鼠标光标进入或离开组件时也会生成鼠标事件。发生鼠标事件时,将调用该侦听器对象中的相应方法,并将 MouseEvent 传递给该方法。