博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】java事件监听机制
阅读量:4688 次
发布时间:2019-06-09

本文共 3817 字,大约阅读时间需要 12 分钟。

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 //定义自定义监听器接口,继承EventListener22 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
map =null;72 public int i=0;73 74 public Mylistener(Map
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
map = new HashMap
();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);

转载于:https://www.cnblogs.com/luochp3/p/7780193.html

你可能感兴趣的文章