http://blog.youkuaiyun.com/njchenyi/archive/2006/02/26/610573.aspx
如何自己定制事件的API
最近的实习需要用到手势识别系统,所以不能再用JAVA自带的鼠标API,被要求写一个通用的事件接口程序。
通过对比ActionEvent这个例子,可以简单的知道至少需要3个class,一个定义事件,一个激发事件的组件,还有一个接口给别人实现
- The component
- The event class
- The listener interface
组件
组件激发event。event是让listener知道事情发生的方法。因此一个组件需要提供注册和注销event listener的机制。组件还必须储存这些listener然后把events发送给这些listener。 因此这个组件需要对会发生的所有类型的event拥有addXXXListener
and removeXXXListener方法。
当然这个组件还需要存储listener。通常可以将listener存储到java.util.Vector或者
javax.swing.event.EventListenerList。
为了将event激发给listener需要用循环激发每个listener
例如:
XXXEvent
.。
...
EventListenerList xxxListeners = new EventListnerList();
public void addXXXListener(XXXListener listener)
{
xxxListeners.add(XXXListener.class, listener);
}
public void removeXXXListener(XXXListener listener)
{
xxxListeners.remove(XXXListener.class, listener);
}
protected void fireXXX(XXXEvent xxxEvent)
{
Object[] listeners = xxxListeners.getListenerList();
// loop through each listener and pass on the event if needed
Int numListeners = listeners.length;
for (int i = 0; i<numListeners; i+=2)
{
if (listeners[i]==XXXListener.class)
{
// pass the event to the listeners event dispatch method
((XXXListener)listeners[i+1]).dispatchXXX(xxxEvent);
}
}}
这个例子可以看出注册,注销和激发不用类型的
event class
event类存储了对listener有关的的所有会发生的事情的信息。这个类需要很仔细的考虑和设计
listener interface
event listener接口类定义了抽象的方法给组件发送event,每种类型的event在接口类中至少拥有一个相对应的抽象方法
listener interface通常是下面的这种格式:
XXXListener
interface 同时也要把自己注册到组件中。当一个event发生,组件才会正确的激发发送event的方法。
public interface XXXListener
extends EventListener
{
// event dispatch methods
somethingHappened(XXXEvent e);
somethingElseHappened(XXXEvent e);
...
}
为了监听事件,listener必须implement
基本的结构就是这样的,剩下来的就是具体的应用这个API了,我想用过ActionEvent的人都知道具体的几个步骤,唯一不太一样的就是需要自己创建组件的实例。