浅析Java与C#的事件处理机制(一)
Java与C#的事件处理都是实现了事件源 事件响应者机制 但又不完全相同 Java实现的是一种事件源与事件响应者两级实体对象方式 这里的事件响应者也是事件监听者 而C#实现的是一种事件源 代理 事件响应者三级实体对象方式 下面就这两种方式来具体说明
Java事件处理
从概念上讲 事件是一种在 源对象 和 监听者对象 之间 某种状态发生变化的传递机制 事件有许多不同的用途 例如在Windows系统中常要处理的鼠标事件 窗口边界改变事件 键盘事件等 在Java中则是定义了一个普通的 可扩充的事件机制 这种机制能够
对事件类型和传递的模型的定义和扩充提供一个公共框架 并适合于广泛的应用
与Java语言和环境有较高的集成度
事件能被描述环境捕获和触发
能使其它构造工具采取某种技术在设计时直接控制事件 以及事件源和事件监听者之间的联系
事件机制本身不依赖于复杂的开发工具
事件从事件源到监听者的传递是通过对目标监听者对象的Java方法调用进行的 对每个明确的事件的发生 都相应地定义一个明确的Java方法 这些方法都集中定义在事件监听者(EventListener)接口中 这个接口要继承java util EventListener 实现了事件监听者接口中一些或全部方法的类就是事件监听者 伴随着事件的发生 相应的状态通常都封装在事件状态对象中 该对象必须继承自java util EventObject 事件状态对象作为单参传递给应响应该事件的监听者方法中 发出某种特定事件的事件源的标识是 遵从规定的设计格式为事件监听者定义注册方法 并接受对指定事件监听者接口实例的引用 有时 事件监听者不能直接实现事件监听者接口 或者还有其它的额外动作时 就要在一个源与其它一个或多个监听者之间插入一个事件适配器类的实例 来建立它们之间的联系
事件状态对象(Event State Object)
与事件发生有关的状态信息一般都封装在一个事件状态对象中 这种对象是java util EventObject的子类 按设计习惯 这种事件状态对象类的名应以Event结尾 例如
public class MouseMovedExampleEvent extends java util EventObject { protected int x y /* 创建一个鼠标移动事件MouseMovedExampleEvent */ MouseMovedExampleEvent(java awt Component source Point location) { super(source); x = location x; y = location y; } /* 获取鼠标位置*/ public Point getLocation() { return new Point(x y); } }
事件监听者接口(EventListener Interface)与事件监听者
由于Java事件模型是基于方法调用 因而需要一个定义并组织事件操纵方法的方式 事件操纵方法都被定义在继承了java util EventListener类的EventListener接口中 按规定 EventListener接口的命名要以Listener结尾 任何一个类如果想操纵在EventListener接口中定义的方法都必须以实现这个接口方式进行 这个类也就是事件监听者 例如
/*先定义了一个鼠标移动事件对象*/ public class MouseMovedExampleEvent extends java util EventObject { // 在此类中包含了与鼠标移动事件有关的状态信息 } /*定义了鼠标移动事件的监听者接口*/ interface MouseMovedExampleListener extends java util EventListener { /*在这个接口中定义了鼠标移动事件监听者所应支持的方法*/ void mouseMoved(MouseMovedExampleEvent mme); }
在接口中只定义方法名 方法的参数和返回值类型 如 上面接口中的mouseMoved方法的具体实现是在下面的ArbitraryObject类中定义的
class ArbitraryObject implements MouseMovedExampleListener { public void mouseMoved(MouseMovedExampleEvent mme){ } }
ArbitraryObject就是MouseMovedExampleEvent事件的监听者
事件监听者的注册与注销
为了各种可能的事件监听者把自己注册入合适的事件源中 建立源与事件监听者间的事件流 事件源必须为事件监听者提供注册和注销的方法 在前面的bound属性介绍中已看到了这种使用过程 在实际中 事件监听者的注册和注销要使用标准的设计格式
public void add< ListenerType>(< ListenerType> listener) public void remove< ListenerType>(< ListenerType> listener)
首先定义了一个事件监听者接口
public interface ModelChangedListener extends java util EventListener { void modelChanged(EventObject e); }
接着定义事件源类
lishixinzhi/Article/program/net/201311/14840