zoukankan      html  css  js  c++  java
  • 【转】java事件监听机制

    java中的事件机制的参与者有3种角色:

    1.event object:事件状态对象,用于listener的相应的方法之中作为参数,一般存在与listerner的方法之中

    2.event source:具体的事件源,比如说,你点击一个button,那么button就是event source,要想使button对某些事件进行响应,你就需要注册特定的listener。

    3.event listener:对每个明确的事件的发生,都相应地定义一个明确的Java方法。这些方法都集中定义在事件监听者(EventListener)接口中,这个接口要继承 java.util.EventListener。 实现了事件监听者接口中一些或全部方法的类就是事件监听者。

    (个人理解:)

    将需要监听的对象封装在自定义的事件状态对象类(EventObject)中,这个类必须继承java.util.EventObject。事件状态对象作为单参传递给应响应该事件的自定义监听器方法中。该自定义监听器需实现自定义监听接口,实现此接口中以事件状态对象为参数的方法。发出某种特定事件的事件源:必须在类中实例化自定义的监听器对象,当监听到event object时,调用相应方法进行处理。

    先看看jdk提供的event包:

    public interface EventListener:所有事件侦听器接口必须扩展的标记接口。

    public class EventObject extends Object implements Serializable
    所有事件状态对象都将从其派生的根类。 所有 Event 在构造时都引用了对象 "source",在逻辑上认为该对象是最初发生有关 Event 的对象。

     举例:

    复制代码
     1 //自定义的事件状态对象类
     2 class MyEvent extends EventObject  
     3 {  
     4     private Object obj;  
     5     //此监听对象可以是自定义对象
     6     private String sName;  
     7     public MyEvent(Object source,String sName)  
     8     {   
     9         super(source);  
    10         this.obj=source;  
    11         this.sName=sName;  }  
    12     public Object getObj()  
    13     {   
    14         return obj; 
    15     }  
    16     public String getsName()  
    17     {   
    18         return sName; 
    19     }  
    20 }  
    21 //定义自定义监听器接口,继承EventListener
    22 interface MyEventListener extends EventListener  
    23 {   
    24     void handleEvent (MyEvent me);   
    25 }  
    26 //定义事件源
    27 class MyEventSource  
    28 {   
    29     private Vector list=new Vector();  
    30     private String   sName  = "";  
    31     public MyEventSource()  
    32     {  
    33         super();  
    34     }  
    35     public void addMyEventListener(MyEventListener me)  
    36     {  
    37         list.add(me);  
    38     }  
    39     public void deleteMyEventListener(MyEventListener me)  
    40     {  
    41         list.remove(me);  
    42     }  
    43     public void notifyMyEvent(MyEvent me)  
    44     {   
    45         Iterator it=list.iterator();  
    46         while(it.hasNext())  
    47         {  
    48             //在类中实例化自定义的监听器对象,并调用监听器方法
    49             ((MyEventListener) it.next()).handleEvent(me); 
    50         }  
    51     }  
    52     public void setName(String str)  
    53     {   boolean bool = false;  
    54     if (str == null && sName != null)  
    55         bool = true;  
    56     else if (str != null && sName == null)  
    57         bool = true;  
    58     else if (!sName.equals(str))  
    59         bool = true;  
    60     this.sName = str;  
    61     // 如果改变则执行事件  
    62     if (bool)  
    63         notifyMyEvent(new MyEvent(this, sName));  
    64     }  
    65     public String getsName()  
    66     {   return sName;   }  
    67 }  
    68 //自定义监听器,继承自定义监听接口
    69 class Mylistener implements MyEventListener   
    70 {   
    71     public Map<Integer, String>  map =null;
    72     public int i=0;
    73 
    74     public Mylistener(Map<Integer, String>  map) 
    75     {  
    76         this.map = map;
    77         MyEventSource mes = new MyEventSource();  
    78         mes.addMyEventListener(this);  
    79         mes.setName("niu");  
    80     }  
    81 
    82     //实现接口中的方法
    83     public void handleEvent(MyEvent me)   
    84     {   
    85         System.out.println("me.getSource()  "+me.getSource());  
    86         System.out.println("me.getsName()  "+me.getsName());
    87         //此处可以将写,将监听到的对象存入map中
    88         map.put(++i, me.getsName());
    89     }  
    90 }  
    91 //主函数
    92 public class test2  
    93 {   
    94     public static void main(String args[])  
    95     {   
    96         Map<Integer, String>  map = new HashMap<Integer, String>();
    97         Mylistener mylistener = new Mylistener(map);
    98     }  
    99 }
    复制代码

    实际运用可能是:

    事件源是一个一直接收的线程,线程中一直监听需要监听的对象

    在主函数中执行两个线程

    1.事件源的接收线程

    2.一个计时器,每隔一段时间先试一下监听到的对象个数

    复制代码
    TimerTask task = new TimerTask() {
        @Override
        public void run() {
            System.out.println("size:"+DPMap.size());
            }
    };
    
    Calendar calendar = Calendar.getInstance();
    Date firstTime = calendar.getTime();
    Timer timer = new Timer();
    timer.schedule(task, firstTime, 20*1000);
  • 相关阅读:
    ORM和JDBC
    四种会话跟踪技术以及jstl介绍
    GC、进程和线程的定义
    数组和链表的理解,及各自的优缺点
    JSP和Servlet及浏览器与tomcat交互过程
    多线程、同步实现方法及Error和Exception的区别与联系
    Eclipse创建一个普通maven项目详细步骤
    Eclipse创建一个动态maven项目详细步骤
    Myeclipse项目出现红叉解决方案
    数据结构和算法 — 平衡二叉树的实现
  • 原文地址:https://www.cnblogs.com/luochp3/p/7780193.html
Copyright © 2011-2022 走看看