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

  • 相关阅读:
    pt-align的用法简要记录
    percona-toolkit 3.0.13 简单安装记录
    mysql8.0.17复制搭建及其gtid的1062和1032异常
    percona-xtrabackup-8.0.7简单快捷使用
    8.0.17 MySQL Community Server 二进制手工安装
    mysql参数sql_log_bin配置
    ERROR 1040 (08004): Too many connections
    MongoDB 副本集+分片 认证方式搭建
    属性配置文件详解(2)(十七)
    属性配置文件详解(1)(十六)
  • 原文地址:https://www.cnblogs.com/minisculestep/p/5059321.html
Copyright © 2011-2022 走看看