zoukankan      html  css  js  c++  java
  • java 事件机制

    java的事件机制一般包括三个部分:EventObject,EventListener和Source。

    EventObject

    java.util.EventObject是事件状态对象的基类,它封装了事件源对象以及和事件相关的信息。所有java的事件类都需要继承该类。

    EventListener

    java.util.EventListener是一个标记接口,就是说该接口内是没有任何方法的。所有事件监听器都需要实现该接口。事件监听器注册在事件源上,当事件源的属性或状态改变的时候,调用相应监听器内的回调方法。

    Source

    事件源不需要实现或继承任何接口或类,它是事件最初发生的地方。因为事件源需要注册事件监听器,所以事件源内需要有相应的盛放事件监听器的容器。

     

    以下是事件机制的一个简单实现,当事件源的状态改变的时候,调用相应的监听器的回调方法:

    事件对象

     1 import java.util.EventObject;
     2 
     3 /**
     4  * 
     5  * @author Thief
     6  *
     7  */
     8 public class MyEvent extends EventObject {
     9 
    10     private static final long serialVersionUID = 1L;
    11     private int sourceState;
    12     
    13     public MyEvent(Object source) {
    14         super(source);
    15         sourceState = ((Source)source).getFlag();
    16     }
    17     
    18     public int getSourceState() {
    19         return sourceState;
    20     }
    21 
    22 }
    View Code

    事件监听器

     1 import java.util.EventListener;
     2 
     3 /**
     4  * 
     5  * @author Thief
     6  *
     7  */
     8 public class StateChangeListener implements EventListener {
     9 
    10     public void handleEvent(MyEvent event) {
    11         System.out.println("触发状态改变事件。。。");
    12         System.out.println("当前事件源状态为:" + event.getSourceState());
    13         System.out.println("。。。。。。。。。。。。。。。。。。。。。。。");
    14     }
    15 }
    View Code
     1 import java.util.EventListener;
     2 
     3 /**
     4  * 
     5  * @author Thief
     6  *
     7  */
     8 public class StateChangeToOneListener implements EventListener {
     9 
    10     public void handleEvent(MyEvent event) {
    11         System.out.println("触发状态变为1的事件。。。");
    12         System.out.println("当前事件源状态为:" + event.getSourceState());
    13         System.out.println("。。。。。。。。。。。。。。。。。。。。。。。");
    14     }
    15     
    16 }
    View Code

    事件源

     1 import java.util.EventListener;
     2 import java.util.HashSet;
     3 import java.util.Set;
     4 
     5 /**
     6  * 
     7  * @author Thief
     8  *
     9  */
    10 public class Source {
    11 
    12     private int flag = 0;
    13     Set<EventListener> listeners = new HashSet<EventListener>();
    14 
    15     /**
    16      * 注册事件监听器
    17      * 
    18      * @param listener
    19      */
    20     public void addStateChangeListener(StateChangeListener listener) {
    21         listeners.add(listener);
    22     }
    23     
    24     /**
    25      * 注册事件监听器
    26      * 
    27      * @param listener
    28      */
    29     public void addStateChangeToOneListener(StateChangeToOneListener listener) {
    30         listeners.add(listener);
    31     }
    32 
    33     /**
    34      * 当事件发生时,通知注册在事件源上的所有事件做出相应的反映
    35      */
    36     public void notifyListener() {
    37         for (EventListener listener : listeners) {
    38             try {
    39                 ((StateChangeListener)listener).handleEvent(new MyEvent(this));
    40             } catch (Exception e) {
    41                 if (flag == 1) {
    42                     ((StateChangeToOneListener)listener).handleEvent(new MyEvent(this));
    43                 }
    44             }
    45         }
    46     }
    47 
    48     /**
    49      * 改变状态
    50      */
    51     public void changeFlag() {
    52         flag = (flag == 0 ? 1 : 0);
    53         notifyListener();
    54     }
    55 
    56     public int getFlag() {
    57         return flag;
    58     }
    59 }
    View Code

    测试类

     1 public class Test {
     2     
     3     public static void main(String[] args) {
     4         
     5         Source source = new Source();
     6         source.addStateChangeListener(new StateChangeListener());
     7         source.addStateChangeToOneListener(new StateChangeToOneListener());
     8         
     9         source.changeFlag();
    10         System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
    11         source.changeFlag();
    12         System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
    13         source.changeFlag();
    14     }
    15 
    16 }

    参考:

    http://ericliu1986.iteye.com/blog/629562

  • 相关阅读:
    linux软件安装方式
    docker 安装 jenkins touch: cannot touch ‘/var/jenkins_home/copy_reference_file.log’: Permission denied Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
    [ERR] Node goodsleep.vip:6379 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
    Linux 常用命令 服务器间scp 用户 export 创建文件、软连接
    redis 安装 集群 主从 哨兵 docker
    WPF密码框中禁止复制、粘贴
    Application 统计在线人数
    【转义字符】HTML 字符实体&lt; &gt: &amp;等
    SQL语句统计每天的数据
    正则表达式计算代码数
  • 原文地址:https://www.cnblogs.com/minisculestep/p/5059321.html
Copyright © 2011-2022 走看看