说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

最近学习 java , 偶获心得, 贴出来与大家分享. 关键字: 事件处理, 匿名内部类

编辑:说三道四文库 发布时间:2018-06-23 02:21
HTML文档下载 WORD文档下载 PDF文档下载
// 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(i)) {
                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 构造函数中初始化三个成员
// 最后, 对成员的访问生成相应的事件, 并处理事件. 
// 一切都那么和谐.......
// 欢迎各位发表自己的任何看法.....

这种贴俺是非常非常支持的,楼主有心了
支持!!!!
up
不好意思,现在来不及看,现收藏一下
支持
支持一下
非常支持!
太好了,我正在因此而困扰呢~
感谢!
非常好,谢谢。
学习。。。。
支持,谢谢!
顶~~~
CSDN好人多,谢谢
加入mybase,good,thank you!
不错,应该支持和鼓励楼主,希望以后有更多这样的帖子,大家共同进步
楼主加油啊
严重支持~

:)
果然有见地!
厉害厉害!佩服佩服!

祝你好运!
好人!
hao
不错,希望楼主以后有更多这样的好文章涌现
这种好的心得应该多些发表
收藏:)
有劳楼主了:)
看了半天才明白原来楼主在讲解java中的事件处理机制(原理).
值得学习!!!!
不过没有搞懂为什么在java的事件处理机制中内部匿名类是关键呢?希望楼主能给一个解释!

我觉得里面的关键应该还是事件源类中关于成员方法的处理
三人行必有我师
ychotman(hotman) 说得对,关键是事件源中激发事件的方法,请问怎样编写串口事件?
先想收藏,再请
搂主解释一下,弄不明白。谢谢。
我一般编写事件都是:
1:新建一个继承于EventObject的事件类;
2:新建一个事件接口;
3:在写关于我的事件类的Prepro...("属性"那个单词,忘了)或ChangEvent变化的类;
这应该是自定义事件的标准做法吧.?
支持,我顶
收藏:)
有劳楼主了:)
厉害,博学,大度。
支持
先收藏

学习
好东西
请问能不能把自定义事件的标准再讲详细点,谢谢
楼主能把所学花宝贵时间总结并发表出来,精神实在难能可贵,不顶对不起这种精神
多谢指导,小弟希望各位高手要是有什么心得的话来和大家一起分享,谢谢
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘