Topic: java 事件处理演示. (转贴CSDN)

  Print this page

1.java 事件处理演示. (转贴CSDN) Copy to clipboard
Posted by: wmgreat
Posted on: 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.onBeforeChangeLight Bulb) {
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 构造函数中初始化三个成员
// 最后, 对成员的访问生成相应的事件, 并处理事件.
// 一切都那么和谐.......
// 欢迎各位发表自己的任何看法.....


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923