文章目录
一:事件概述
二:事件状态对象(Event State Object)
三:事件侦听者接口( EventListener Interface )与事件侦听者
四:四、事件侦听者的注册与注销
五:两个示例
一:事件概述:
事件处理是JavaBean体系结构的核心之一。通过事件处理机制,可让一些组件作为事件源,发出可被描述环境或其它组件接收的事件。这样,不同的组件就可在构造工具内组合在一起,组件之间通过事件的传递进行通信,构成一个应用。
从概念上讲,事件是一种在"源对象"和"监听者对象"之间,某种状态发生变化的传递机制 。
事件有许多不同的用途,例如在Windows系统中常要处理的鼠标事件、窗口边界改变事件、键盘事件等。在Java和JavaBean中则是定义了一个一般的、可扩充的事件机制。
主要构成有:
事件从事件源到监听者的传递是通过对目标监听者对象的 Java 方法调用进行的。对每个明确的事件的发生,都相应地定义一个明确的 Java 方法。这些方法都集中定义在事件监听者( EventListener )接口中,这个接口要继承 java.util.EventListener 。实现了事件监听者接口中一些或全部方法的类就是事件监听者。 伴随着事件的发生,相应的状态通常都封装在事件状态对象中,该对象必须继承自 java.util.EventObject。
事件状态对象作为单参传递给对应响应该事件的监听者方法中。 发出某种特定事件的事件源的标识是:遵从规定的设计格式为事件监听者定义注册方法,并接受对指定事件监听者接口实例的引用。 有时,事件监听者不能直接实现事件监听者接口,或者还有其它的额外动作时,就要在一个源与其它一个或多个监听者之间插入一个事件适配器类的实例,来建立它们之间的联系。
二:事件状态对象(Event State Object)
与事件发生有关的状态信息一般都封装在一个事件状态对象中 ,这种对象是 java.util.EventObject 的子类。
三:事件侦听者接口( EventListener Interface )与事件侦听者
由于Java 事件模型是基于方法调用,因而需要一个定义并组织事件操纵方法的方式。JavaBean 中,事件操纵方法都被定义在继承了java.util.EventListener 类的EventListener 接口中,它是一个标志性接口
四:四、事件侦听者的注册与注销
为了各种可能的事件监听者把自己注册入合适的事件源中,建立源与事件监听者间的事件流,事件源必须为事件监听者提供注册和注销的方法。
public void add< ListenerType>(< ListenerType> listener) ;
public void remove< ListenerType>(< ListenerType> listener) ;
五:两个示例
1.1创建一个web项目
1.2在src分别创建beans,listeners,test包
1.3创建Mybean2类实现Serializable接口
package beans;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.Serializable;
public class MyBean2 implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private String changeValue;
private PropertyChangeSupport pcs;//创建一个类对象
public MyBean2() {
pcs = new PropertyChangeSupport(this);//初始化对象,this意味是事件源为此类,括号内定义事件源
}
public void setChangeValue(String newValue) {
if (!newValue.equals(changeValue)) {
String oldValue = changeValue;
changeValue = newValue;
pcs.firePropertyChange("changeValue", oldValue, newValue);
}
}
public String getChangeValue() {
return changeValue;
}
//为pcs定义注册监听器方法以便在实例测试中调用来注册监听器
public void addPropertyChangeListener(PropertyChangeListener listener) {
pcs.addPropertyChangeListener(listener);
}
//为pcs定义移出监听器
public void removePropertyChangeListener(PropertyChangeListener listener) {
pcs.removePropertyChangeListener(listener);
}
}
1.4创建MyPropertyChangeListener类实现PropertyChangeListener接口
package listeners;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
public class MyPropertyChangeListener implements PropertyChangeListener {
@Override
public void propertyChange(PropertyChangeEvent evt) {
// TODO Auto-generated method stub
System.out.println("\""+evt.getNewValue()+"\"is setted to replace the old value\""+evt.getOldValue()+"\"");
}
}
1.5测试监听器,创建TestBean1类
package test;
import listeners.MyPropertyChangeListener;
import beans.MyBean2;
public class TestBean1 {
public static void main(String[]args){
MyBean2 my=new MyBean2();//创建类对象
MyPropertyChangeListener mylistener=new MyPropertyChangeListener();//实例监听器对象以便被调用去实现监听
my.addPropertyChangeListener(mylistener);//将mylistener作为实参传给方法中的形参,注册监听器
//测试监听器
my.setChangeValue("zhangsan");
my.setChangeValue("new-value-admin");
}
}
1.6测试结果
2.1创建一个web项目
2.2在src分别创建beans,listeners,test包
1.3创建Mybean3类实现Serializable接口
package beans;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.beans.PropertyVetoException;
import java.beans.VetoableChangeListener;
import java.beans.VetoableChangeSupport;
import java.io.Serializable;
public class MyBean3 implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private String changeValue;
private PropertyChangeSupport pcs;
private VetoableChangeSupport vcs;
public MyBean3(){
pcs = new PropertyChangeSupport(this);
vcs = new VetoableChangeSupport(this);
}
//setter以及getter方法
public void setChangeValue(String newValue) throws PropertyVetoException {
if(!newValue.equals(changeValue)) {
String oldValue = this.changeValue;
vcs.fireVetoableChange("name", oldValue, newValue);
this.changeValue = newValue;
pcs.firePropertyChange("name", oldValue, newValue);
}
}
public String getChangeValue() {
return changeValue;
}
//添加add以及remove监听器方法
public void addPropertyChangeListener(PropertyChangeListener listener){
pcs.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener){
pcs.removePropertyChangeListener(listener);
}
public void addVetoableChangeListener(VetoableChangeListener listener) {
vcs.addVetoableChangeListener(listener);
}
public void removeVetoableChangeListener(VetoableChangeListener listener) {
vcs.removeVetoableChangeListener(listener);
}
}
2.4创建MyPVetoableChangeListener类实现PropertyChangeListener , VetoableChangeListener接口
package listeners;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyVetoException;
import java.beans.VetoableChangeListener;
public class MyVetoableChangeListener implements PropertyChangeListener , VetoableChangeListener {
public void propertyChange(PropertyChangeEvent evt) {
// TODO Auto-generated method stub
System.out.println("\"" + evt.getNewValue() + "\" is setted to replace the old value \"" + evt.getOldValue() + "\"");
}
public void vetoableChange(PropertyChangeEvent evt)
throws PropertyVetoException {
// TODO Auto-generated method stub
if (evt.getNewValue().equals("invalidValue")) {
System.out.println("\"" + evt.getNewValue()+ "\" is try to replace the old value \"" + evt.getOldValue() + "\"");
//抛出异常表示拒绝修改属性
throw new PropertyVetoException( "What you set \"invalidValue\" is a invalid value! operate fail!", evt);
}
}
}
1.5测试监听器,创建TestBean2类
package test;
import java.beans.PropertyVetoException;
import listeners.MyPropertyChangeListener;
import listeners.MyVetoableChangeListener;
import beans.MyBean3;
public class TestBean2 {
public static void main(String[]args)throws PropertyVetoException{
MyBean3 my=new MyBean3();
//创建两个监听器对象
MyPropertyChangeListener myListener1=new MyPropertyChangeListener();
MyVetoableChangeListener myListener2=new MyVetoableChangeListener();
//为MyBean3对象添加监听器
my.addPropertyChangeListener(myListener1);
my.addVetoableChangeListener(myListener2);
//调用Bean方法,实现监听器
my.setChangeValue("zhangsan");
my.setChangeValue("new-value-admin");
my.setChangeValue("invalidValue");
}
}