您的位置:首页 > 编程语言 > Java开发

JAVA的事件处理机制

2015-03-10 16:44 204 查看
本文引用了网上的一些案例并加以修改,只是个人做记录用。

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

1.event object(事件对象):

JAVA中的事件状态对象都必须继承java.util.EventObject(如果不考虑通用性问题也可以不继承),事件对象是在触发事件的时候创建的,JAVA中的Swing编程中的事件对像都是JDK创建的,只有底层才能捕捉到诸如鼠标点击,键盘输入的事件。

创建的事件对象需要作为参数转入listener监听类的相应方法之中,你可以在方法中通过这个事件对象来获取事件的具体信息(如鼠标坐标等....),如果是自定义事件对象则可以放入任何你想要传递的信息,事件对象就想当于一个信息载体。

2.event source(事件源):

事件源可以是任何JAVA对象,包括自己定义的类对象。比如Swing编程中的button就是event source,要想使button对某些事件进行响应,你就需要注册特定的listener,一般是通过addXXXListener(event listener)方法来实现。

3.event listener(事件监听类):

JAVA中的事件监听类都必须继承java.util.EventListener类型的接口(如果不考虑通用性问题也可以不继承),一般我们定义一个接口要继承 java.util.EventListener,并在这个接口中对事件源发生的每个事件都相应地定义一个明确的Java方法。 实现了事件监听者接口中一些或全部方法的类就是事件监听者。

例:

一:定义事件对象,必须继承EventObject

package com.yzl.event;

import java.util.EventObject;

/**
* @author gfdonx
* 自定义门的事件类
* 事件传递的信息只有一个,那就是开门或关门的人是谁
*/
public class DoorEvent extends EventObject{

private static final long serialVersionUID = 1L;

private String name;

public DoorEvent(Object source, String name) {
super(source);
this.name = name;
}

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

}


二、自定义一个事件监听接口,该接口继承自EventListener;该接口包含对DoorEvent事件的处理程序:在这里是开门和关门的方法。

package com.yzl.listener;

import java.util.EventListener;

import com.yzl.event.DoorEvent;

/**
* @author gfdonx
* 自定义监听接口
* 在接口中只定义了开门和关门的方法。
*/
public interface DoorListener extends EventListener {

/**
* 开门方法
* @param doorEvent 传入监听类的事件对象
*/
public void operDoor(DoorEvent doorEvent);

/**
* 关门方法
* @param doorEvent 传入监听类的事件对象
*/
public void closeDoor(DoorEvent doorEvent);

}


三、定义一个事件源对象Door,它用一个Collection对象来存储所有的事件监听器对象。事件源对象通过addDoorListener(..)这样的方法来增加监听对象。在相应事件发生的时候并通过notifyListeners(..)方法触发事件,在notifyListeners方法中遍历Collection集全,通知监听对象:事件发生了,你调用相应的处理函数吧。

package com.yzl.eventsource;

import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;

import com.yzl.event.SwitchEvent;
import com.yzl.listener.SwitchListener;

/**
*
* @author gfdonx
* 定义一个门,这个类对象相当于是一个事件源,相当于Swing中的Button
*/
public class Door {

//定义一个Collection用于存储监听对象
private Collection listeners;

//添加事件方法
public void addSwitchListener(SwitchListener switchListener){

if(listeners == null){
listeners = new HashSet();
}

listeners.add(switchListener);
}

//添加移除事件方法
public void removeSwitchListener(SwitchListener switchListener){

if(listeners == null){
return;
}

listeners.remove(switchListener);
}

/**
*
* @param switchEvent 事件对象,在Swing编程中一盘是由系统底层创建并传入的
* 一个开门事件
*/
public void openDoor(SwitchEvent switchEvent){

if(listeners == null){
return;
}
notifyListeners(switchEvent, "open");
}

/**
*
* @param switchEvent 事件对象,在Swing编程中一盘是由系统底层创建并传入的
* 一个关门事件
*/
public void closeDoor(SwitchEvent switchEvent){

if(listeners == null){
return;
}
notifyListeners(switchEvent, "close");
}

/**
*
* @param switchEvent 传入的事件对象
* @param eventType 事件的具体类型,用来判断调用事件的什么方法。
*/
private void notifyListeners(SwitchEvent switchEvent,String eventType){
Iterator iter = listeners.iterator();
while (iter.hasNext()) {
SwitchListener listener = (SwitchListener) iter.next();
if(eventType.equals("open")){
listener.oper(switchEvent);
return;
}
if(eventType.equals("close")){
listener.close(switchEvent);
return;
}
}
}
}


四、接下来就在主函数中测试一下,这里直接在主函数中手动触发事件,请根据实际情况做相应处理。
package com.yzl.main;

import com.yzl.event.SwitchEvent;
import com.yzl.eventsource.Door;
import com.yzl.listener.SwitchListener;

public class DoorMain {

public static void main(String[] args) {
// TODO Auto-generated method stub
//创建一个门
Door door = new Door();
//我是管家,我对门添加一个监听
door.addSwitchListener(new SwitchListener() {

@Override
public void oper(SwitchEvent switchEvent) {
// TODO Auto-generated method stub
System.out.println("管家说:欢迎您:" + switchEvent.getName());
}

@Override
public void close(SwitchEvent switchEvent) {
// TODO Auto-generated method stub
System.out.println("管家说:" + switchEvent.getName() + "您慢走!");
}
});

//我是主人,我对门添加一个监听
door.addSwitchListener(new SwitchListener() {

@Override
public void oper(SwitchEvent switchEvent) {
// TODO Auto-generated method stub
System.out.println("主人说:" + switchEvent.getName() + ",你来啦!");
}

@Override
public void close(SwitchEvent switchEvent) {
// TODO Auto-generated method stub
System.out.println("主人说:" + switchEvent.getName() + ",再见!");
}
});

//这个触发事件的方法,这步在Swing中是由JDK来完成的。
SwitchEvent switchEvent = new SwitchEvent(new DoorMain(),"郝健");
door.openDoor(switchEvent);
SwitchEvent switchEvent1 = new SwitchEvent(new DoorMain(),"大鹏");
door.openDoor(switchEvent1);
//离开
door.closeDoor(switchEvent);
door.closeDoor(switchEvent1);
}

}


执行结果:
主人说:郝健,你来啦!

主人说:大鹏,你来啦!

主人说:郝健,再见!

主人说:大鹏,再见!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java jdk 编程 测试 swing