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);