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 extendsEventObject3 {4 privateObject obj;5 //此监听对象可以是自定义对象

6 privateString sName;7 publicMyEvent(Object source,String sName)8 {9 super(source);10 this.obj=source;11 this.sName=sName; }12 publicObject getObj()13 {14 returnobj;15 }16 publicString getsName()17 {18 returnsName;19 }20 }21 //定义自定义监听器接口,继承EventListener

22 interface MyEventListener extendsEventListener23 {24 voidhandleEvent (MyEvent me);25 }26 //定义事件源

27 classMyEventSource28 {29 private Vector list=newVector();30 private String sName = "";31 publicMyEventSource()32 {33 super();34 }35 public voidaddMyEventListener(MyEventListener me)36 {37 list.add(me);38 }39 public voiddeleteMyEventListener(MyEventListener me)40 {41 list.remove(me);42 }43 public voidnotifyMyEvent(MyEvent me)44 {45 Iterator it=list.iterator();46 while(it.hasNext())47 {48 //在类中实例化自定义的监听器对象,并调用监听器方法

49 ((MyEventListener) it.next()).handleEvent(me);50 }51 }52 public voidsetName(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 publicString getsName()66 { returnsName; }67 }68 //自定义监听器,继承自定义监听接口

69 class Mylistener implementsMyEventListener70 {71 public Map map =null;72 public int i=0;73

74 public Mylistener(Mapmap)75 {76 this.map =map;77 MyEventSource mes = newMyEventSource();78 mes.addMyEventListener(this);79 mes.setName("niu");80 }81

82 //实现接口中的方法

83 public voidhandleEvent(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 classtest293 {94 public static voidmain(String args[])95 {96 Map map = new HashMap();97 Mylistener mylistener = newMylistener(map);98 }99 }

实际运用可能是:

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

在主函数中执行两个线程

1.事件源的接收线程

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

TimerTask task = newTimerTask() {

@Overridepublic voidrun() {

System.out.println("size:"+DPMap.size());

}

};

Calendar calendar=Calendar.getInstance();

Date firstTime=calendar.getTime();

Timer timer= newTimer();

timer.schedule(task, firstTime,20*1000);

你可能感兴趣的:(java监听事件)