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
二、自定义一个事件监听接口,该接口继承自EventListener;该接口包含对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中的事件机制的参与者有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事件处理机制实现录制回放功能
- JAVA事件处理机制小议
- Java事件处理机制-自定义事件
- Java的事件处理机制
- Java事件处理机制
- java .net MFC QT事件处理机制
- JAVA事件处理机制
- java事件处理机制(自定义事件)【转】
- java中事件处理机制
- java 事件处理机制
- Java事件处理机制 - 事件监听器的四种实现方式
- 利用Java事件处理机制实现录制、回放功能
- java事件处理机制
- Java的事件处理机制
- 程序员手记:Java与C#的事件处理机制
- Flex、Java、C#、JavaFX的事件处理机制的比较
- java的事件处理机制
- java事件处理机制--事件监听器的四种实现机制(1)
- Java与C#的事件处理机制(zt)
- Java的事件处理机制