Java高级编程12-姜国海 事件处理

广义的事件驱动:任何对象的属性值发生变化,对应一次事件。

按钮类

//一个类调用另一个类的成员函数

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);
    //处理函数的参数一定是一个事件,返回值一定是空
}

猜你喜欢

转载自blog.csdn.net/l1558198727/article/details/81074648
今日推荐