广义的事件驱动:任何对象的属性值发生变化,对应一次事件。
按钮类
//一个类调用另一个类的成员函数
class A{
B b;
A(B b){
this.b = b;
}
public void setB(B b){
this.b = b;
}
void b(){
b.some();
}
}
事件类
EventObject
自定义的事件类都要以Event结尾
事件应该有的属性:事件发生的瞬间,属性的改变
class AgeChangeEvent extends java.util.EventObject{
getSource();//得到事件源
AgeChangeEvent(Object source,int aAge,int nAge){
super(source);
this.oAge = oAge;
this.nAge = nAge;
}
//事件的只有读函数,没有写函数set
public int getOldAge(){
//
}
}
事件处理
import java.util.*;
public class Student {
private int age;
// 听众集合,用来保存和听众对象的关联关系的
List<AgeChangedListener> listeners = new LinkedList<AgeChangedListener>();
// 听众注册方法,不允许某个听众对象重复注册
public void addAgeChangedListener(AgeChangedListener acl) {
if (!listeners.contains(acl)) {
listeners.add(acl);
}
}
// 年龄修改方法中,年龄数据发生变化,产生了一个事件
public void setAge(int age) {
// 这个事件封装了事件源,事件发生时的新旧年龄数据
AgeChangedEvent ace = new AgeChangedEvent(this, this.age, age);
this.age = age;
process(ace); // 调用处理这个事件的方法
}
// 内部类,使用多线程机制来完成听众对象的广播,否则,一旦某个听众的
// 事件处理程序执行缓慢会影响其他听众对象的事件处理程序的执行。
class DispatchThread extends Thread {
private AgeChangedListener acl; // 引用一个听众对象
private AgeChangedEvent ace; // 待处理的事件
public DispatchThread(AgeChangedListener acl, AgeChangedEvent ace) {
this.acl = acl;
this.ace = ace;
}
public void run() { // 线程任务就是事件委托过程
acl.processAgeChanged(ace); // 执行听众对象的事件处理程序
}
}
/////////////////////start////////////////////////////
public void process(AgeChangedEvent ace) {
// source internal processing
// 事件源内部的事件处理过程,如果没有,则不需要提供什么代码
// internal processing end.
// 开始听众的事件广播处理
for (int i = 0; i < listeners.size(); i++) { // 遍历听众集合,使用多线程进行广播
new DispatchThread(listeners.get(i), ace).start();
}
}
///////////////////使用匿名类创建线程/////////////////
public void process(AgeChangedEvent ace) {
// source internal processing
// 事件源内部的事件处理过程,如果没有,则不需要提供什么代码
// internal processing end.
// 开始听众的事件广播处理
for (int i = 0; i < listeners.size(); i++) { // 遍历听众集合,使用多线程进行广播
new Thread(){
public void run(){
listeners.get(i).processAgeChanged(ace);
}
}.start();
}
}
/////////////////////end//////////////////////////
}
听众接口
public interface AgeChangedListener
extends java.util.EventListener{//结尾为listener
public void() processAgeChange(AgeChangeEent e);
//处理函数的参数一定是一个事件,返回值一定是空
}