首页 > 代码库 > Java事件机制
Java事件机制
Java事件由事件类和监听接口组成,自定义一个事件前,必须提供一个事件的监听接口以及一个事件类。JAVA中监听接口是继承java.util.EventListener的类,事件类继承java.util.EventObject的类。很多基本的事件系统已经为我们定义好了,我们只要学会调用即可,但是为了更加灵活地满足特定的需求,我们有时候也需要自定义事件。
对于事件的理解:http://lyunabc.iteye.com/blog/1538940这篇博文讲的不错,有助于我们理解事件从产生到处理这一过程。
下面我实现的例子:
定义学生类,相当于一个事件源,同时这个学生类也是一个被监听类。
package event; import java.util.HashSet; import java.util.Iterator; import java.util.Set; /** * 模拟现实世界中事件的发生处理过程。 * Student:是一个被监听类,即我们所谓的事件源 * fireGpaLowLevel * fireNotPayFees * 定义这两个方法的目的就是产生事件对象,并通知事件监听器,进行事件相应的响应和处理。 */ public class Student { public static final double STANDARD_GPA = 2.00d; private String name; private String college; //所属学院 private double gpa; //学生的平均学分绩点,如果低于2.00,则劝退 private int fees; //学生缴纳的费用,不缴费退学 //事件源维护事件监听器队列,事件监听器负责把事件通知给事件处理方,即校方 private Set listeners = new HashSet(); public void addListener(StudentListener studentListener) { synchronized (listeners) { listeners.add(studentListener); } } public void fireGpaLowLevel() { Iterator iterator; synchronized (listeners) { iterator = listeners.iterator(); } if (this.gpa < Student.STANDARD_GPA) { StudentEvent studentEvent = new StudentEvent(this); studentEvent.setEventName("平均学分绩点过低"); studentEvent.setLowGpa(true); while (iterator.hasNext()) { StudentListener l = (StudentListener) iterator.next(); l.onLowGpa(studentEvent); } } } public void fireNotPayFees() { Iterator iterator; synchronized (listeners) { iterator = listeners.iterator(); } StudentEvent studentEvent = null; if (this.fees == 0) { studentEvent = new StudentEvent(this); studentEvent.setEventName("没有缴纳学费"); studentEvent.setPayFees(false); } else if (this.fees > 0 && this.fees < 10000) { studentEvent = new StudentEvent(this); studentEvent.setEventName("学费没交够"); studentEvent.setPayFees(false); } if (studentEvent != null) { while (iterator.hasNext()) { StudentListener l = (StudentListener) iterator.next(); l.onNotPayFees(studentEvent); } } } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCollege() { return college; } public void setCollege(String college) { this.college = college; } public double getGpa() { return gpa; } public void setGpa(double gpa) { this.gpa = gpa; } public int getFees() { return fees; } public void setFees(int fees) { this.fees = fees; } public Set getListeners() { return listeners; } public void setListeners(Set listeners) { this.listeners = listeners; } }
定义事件对象:事件对象的属性有事件发生的原因,具体的事件的细节信息。
package event; import java.util.EventObject; /** * 表示具体的事件,由学生这个对象产生 */ public class StudentEvent extends EventObject { private String eventName; private boolean isPayFees;//是否缴纳学费 private boolean isLowGpa; //平均学分绩点是否及格 /** * Constructs a prototypical Event. * * @param source The object on which the Event initially occurred. * @throws IllegalArgumentException if source is null. */ public StudentEvent(Object source) { super(source); } public boolean isLowGpa() { return isLowGpa; } public void setLowGpa(boolean lowGpa) { isLowGpa = lowGpa; } public String getEventName() { return eventName; } public void setEventName(String eventName) { this.eventName = eventName; } public boolean isPayFees() { return isPayFees; } public void setPayFees(boolean payFees) { isPayFees = payFees; } }
事件监听器接口,负责监听学生类产生的事件,并作出相应的处理
package event; import java.util.EventListener; /** * 定义事件监听器的接口 */ public interface StudentListener extends EventListener { public abstract void onLowGpa(StudentEvent event); public abstract void onNotPayFees(StudentEvent event); }
下面是测试程序:
package event; import org.junit.Test; /** * Created with IntelliJ IDEA. * User: ASUS * Date: 14-7-27 * Time: 下午2:42 * To change this template use File | Settings | File Templates. */ public class TestEvent { @Test public void test887() { Student student = new Student(); student.setName("lyx"); student.setCollege("software college"); student.setFees(89); student.setGpa(1.23); student.addListener(new StudentListener() { @Override public void onLowGpa(StudentEvent event) { System.out.println("发生该事件:" + event.getEventName()); Student s = (Student) event.getSource(); System.out.println(s.getName() + "同学,平均学分绩点:" + event.isPayFees() + ",退学吧。。。"); } @Override public void onNotPayFees(StudentEvent event) { System.out.println("发生该事件:" + event.getEventName()); Student s = (Student) event.getSource(); System.out.println(s.getName() + "同学,学费情况:" + event.isPayFees() + ",退学吧。。。"); } }); student.addListener(new StudentListener() { @Override public void onLowGpa(StudentEvent event) { System.out.println("发生该事件:" + event.getEventName()); Student s = (Student) event.getSource(); System.out.println(s.getName() + "同学,平均学分绩点:" + event.isPayFees() + ",叫家长来。。。"); } @Override public void onNotPayFees(StudentEvent event) { System.out.println("发生该事件:" + event.getEventName()); Student s = (Student) event.getSource(); System.out.println(s.getName() + "同学,学费情况:" + event.isPayFees() + ",叫家长来。。。"); } }); student.fireGpaLowLevel(); student.fireNotPayFees(); } }
运行结果:
发生该事件:平均学分绩点过低
lyx同学,平均学分绩点:false,叫家长来。。。
发生该事件:平均学分绩点过低
lyx同学,平均学分绩点:false,退学吧。。。
发生该事件:学费没交够
lyx同学,学费情况:false,叫家长来。。。
发生该事件:学费没交够
lyx同学,学费情况:false,退学吧。。。
====END====
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。