wmgreat
CJSDN高级会员
发贴: 286
积分: 105
|
于 2003-03-05 09:00
// java 事件处理演示. // 本演示代码旨在说明 java 对事件处理的模型, 这个模型的关键就是匿名内部类. // 关键字: anonymous inner class (匿名内部类) // 作者: realdreamer
//事件接口, 封装事件被引发后, 被调用的方法原型. interface MyEvent{ //修改前向实体确认, 返回 true, 将修改它, //返回 false, 不做修改并且 onValueChanged 也不会引发 public boolean onBeforeChange(int newValue); public void onValueChanged(int currValue); }
//事件源, MyEvent 的相关事件将由它来引发 class EventSource { private int i; private MyEvent e; public void setValue(int i) { if (e != null) { if (e.onBeforeChange) { this.i = i; e.onValueChanged(this.i); } } this.i = i; } public int getValue() { return this.i; } public void addMyEventListener(MyEvent e) { this.e = e; } }
//////////////////////////////////////////////////// //////////////////////////////////////////////////// //在 java 类库中, 有一大堆事件, 像上面一个类和一个接口的定义就是一个简单的模拟. //你可以把类 EventSource 想象成 JButton, 把接口想象成 ActionListener. //如果我说得这么浅显你都不明白, 那你该........那个什么了......... //大多数情况下, 我们只是 java 类库的使用者, 我们 //该如何正确而清淅的使用java类库中的事件模型呢? //继续往下看:
class EventReceipter { EventSource es1; EventSource es2; EventSource es3; //三个事件监听器实例, 这里用了 java 的内部匿名类, //这三个匿名内部类实现了MyEvent接口的方法 //这些方法将调用转发到外部类的方法上. //java 内部匿名类的语法让事件监听的实现具有很大灵活性. //这与 c# 中的事件模型是类似的, c# 编译器进行了一些事件转发帮助. //在 microsoft c++ 7.0 扩展中, 事件模型得到了统一, 在语义上是与java一致的. MyEvent listener1 = new MyEvent(){ public boolean onBeforeChange(int newValue) { return onMyMember1_BeforeChange(newValue); } public void onValueChanged(int currValue) { onMyMember1_ValueChanged(currValue); } }; MyEvent listener2 = new MyEvent() { public boolean onBeforeChange(int newValue) { return onMyMember2_BeforeChange(newValue); } public void onValueChanged(int currValue) { onMyMember2_ValueChanged(currValue); } }; MyEvent listener3 = new MyEvent() { public boolean onBeforeChange(int newValue) { return onMyMember3_BeforeChange(newValue); } public void onValueChanged(int currValue) { onMyMember3_ValueChanged(currValue); } };
public boolean onMyMember1_BeforeChange(int newValue) { //.. do something return false; } public void onMyMember1_ValueChanged(int currValue) { //.. do something } public boolean onMyMember2_BeforeChange(int newValue) { //.. do something System.out.println("ok, can change it, the value will be " + newValue); return true; } public void onMyMember2_ValueChanged(int currValue) { //.. do something System.out.println("changed. the value is " + currValue); } public boolean onMyMember3_BeforeChange(int newValue) { //.. do something return false; } public void onMyMember3_ValueChanged(int currValue) { //.. do something }
//构造函数 public EventReceipter () { //创建对象 es1 = new EventSource(); es2 = new EventSource(); es3 = new EventSource(); //添加对象的监听器 es1.addMyEventListener(listener1); es2.addMyEventListener(listener2); es3.addMyEventListener(listener3); } }
class EventStudy { public static void main(String args[]) { //创建实现, 并调用实例成员 es2 的方法 setValue. //这将引发事件. 控制台打印事件结果 new EventReceipter().es2.setValue(12345); } }
// 总结, 这个演示事实上实现了基本的所谓 framework. // EventReceipter 是应用程序中的主要类. // 它的三个成员 es1, es2, es3, 是组成类的重要元素. // 类 EventReceipter 构造函数中初始化三个成员 // 最后, 对成员的访问生成相应的事件, 并处理事件. // 一切都那么和谐....... // 欢迎各位发表自己的任何看法.....
|