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);
    //处理函数的参数一定是一个事件,返回值一定是空
}
已标记关键词 清除标记
相关推荐
1. 发现错误并改错。给出一个实现插入排序的程序,文件名为InsertionSort.java,该文件中有代码错误,请单步调试,发现错误, 并改正错误,提示:只有一行程序有错误,所以只能修改代码中的某一行程序。要求演示在eclipse开发环境下 单步调试程序,如果没有eclipse开发环境,也可以使用其它集成开发环境,但是必须演示调试能力。 2. 请编写程序输出13/17小数点后第100位的数字是几?考察循环和除法运算以及模运算(求余数运算)。 请补齐FractionalDigit.java文件中的代码 3. 请编写程序,分别使用循环和递归两种方法计算斐波那契数列第项是几? 斐波那契数列的第1项为1,第2项为1,后续任意项的值为其前两项的和。 请补齐Fibo.java文件中的代码 4. 实现Array类中的indexOf函数; 阅读Node.java和SingleLinkedList.java两个关于单链表的类, 实现SingleLinkedList类中的indexOf函数; 5. 阅读Node.java和SingleLinkedList.java类,利用它们来实现栈和双向队列功能,请阅读Stack.java 和Deque.java(双向队列),请实现Stack类中的pop函数,请实现Deque.java中的removeLast函数。 6. 利用前面的Stack.java和Deque.java类,实现下面问题的求解: 队列中有从1到7(由小到大排列)的7个整数,问经过一个整数栈后,出栈的所有排列数有多少? 如果整数栈的容量是4(栈最多能容纳4个整数),那么出栈的排列数又是多少?(百度查询 卡特兰数) 请补齐Catalan.java文件中的代码 7. 八皇后问题。在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、 同一列或同一斜线上,问有多少种摆法。该程序代码在EightQueens.java文件中,请将void place(int n)函数 中未完成的代码补齐,并写出运行结果。 禁止修改其他代码。 8. 学生排序。给出4名同学,请按照学生的年龄排序,然后输出学生的学号和姓名。具体代码见Student.java文件, 请实现sort函数。并运行该程序。 9. 二叉排序树检索。BstNode.java和BinarySortTree.java是关于二叉排序树的程序文件,请阅读这两个程序 文件,请实现contains函数,并运行该程序。 10. BASE64编码转换问题。请百度百科查询base64编码,实现将二进制字节数据编码转换为base64的字符串数据,以及 将base64字符串转换回二进制字节数据。禁止使用JDK自带的Base64转换程序以及Apache开源网站上的程序, 必须自己编写代码来实现BASE64编码和解码函数。可以为该类添加其他数据成员和函数成员。
第二次作业: 1. 编写点类(Point类),属性成员有x,y,都是double数据类型。需要为Point类编写构造函数。 编写直线类(Line类),需要提供两点确定一条直线的函数功能。 如果两点重合,可以返回异常或者返回null引用来解决这个问题。 直线类的数据成员和函数成员请自行设计。 2. 给定文本文件,文件名称为a.txt,文件内容为一个8行8列的字符矩阵,内容为1和0字符, 请编程计算出该矩阵中水平方向或者垂直方向或者斜线方向连续1最多的个数。 例如: 11001101 10110101 01010101 11001000 01010101 11001101 00011000 11110000 3. 编写程序求出1万以内的所有素数,并将这些素数输出到一个文本文件中,每行文本只包含一个素数数据。 该文本文件内容要求可以用记事本程序来查看。 4. 编写程序求出1万以内的所有素数,然后再判断这些素数中哪些是由素数拼接而成的。 例如素数23就符合条件,23本身是素数,其由素数2,和素数3拼接(连接)组成。 素数29就不满足条件,2是素数,而9不是素数。素数307不满足条件,不能忽略0. 7907这个素数符合条件,7是素数,907是素数。 需要把符合条件的拼接素数全部输出,并统计个数。 5. 要求从控制台输入英语单词及单词解释两项数据, 把录入的数据追加到文件中。要求提供单词查询功能。 用户输入单词后,从单词库文件中查找,如果存在则输出 该单词的解释。注意,单词不能有重复,如果重复则覆盖替换 以前的解释数据。 6. 通过命令行参数输入一个文件夹的路径名称,然后编写程序找出该文件夹下文件名称重复并且文件大小也一样的文件, 如果没有“重复文件”,则输出“没有重复文件”的提示,如果有,需要输出文件名称,和文件所在的文件夹路径(绝对路径)。 提示,需要遍历该文件夹下所有子文件夹,设计一个文件类,属性包括文件名称,文件路径,文件大小,然后进行“重复” 判断,如果文件重复,则需要记录并输出,有可能有文件名重复,但是文件大小不一样,重复的文件可能不止2个,可能 在不同的子文件夹下有多个文件重复。 7. 霍夫曼编码实现压缩文本文件,见文件huffman.rar. 对文件数据读写等功能已经实现,程序在Q2Resources.zip中。 Q2Resources.zip中的文件禁止修改。请将TextZip.java文件所有未实现的函数按照要求给以实现。 改成了控制台输入,因为命令行输入太麻烦了,不过像用命令行也就是改一改就好。
©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页