1.1. 属性改变事件和投票否决事件
PropertyChangeSupport类为Java Bean支持属性改变事件提供了方便。

/**
* @Title: EventBean.java
* @Package com.test.javatechnology.introspection
* @Description:
* @author http://www.cnblogs.com/coe2coe/
* @date 2017年3月25日 下午6:02:36
* @version V1.0
*/
package com.test.javatechnology.introspection;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
/**
* @ClassName: EventBean
* @Description:
* @author http://www.cnblogs.com/coe2coe/
* @date 2017年3月25日 下午6:02:36
*
*/
public class EventBean {
public EventBean(){
}
//定义属性更改事件支持。
private PropertyChangeSupport changes = new PropertyChangeSupport(this);
/**
* 添加属性更改事件监听器。
* @param propertyName 待监听的属性名称
* @param listener 事件监听器。
*/
public void addListener(String propertyName,PropertyChangeListener listener){
changes.addPropertyChangeListener(propertyName, listener);
}
/**
* 移除属性更改事件监听器。
* @param propertyName 待监听的属性名称
* @param listener 事件监听器。
*/
public void removeListener(String propertyName,PropertyChangeListener listener){
changes.removePropertyChangeListener(propertyName, listener);
}
//唯一的属性。
private int value;
public int getValue() {
return value;
}
//在更改属性时出发事件。
public void setValue(int value) {
try{
int oldValue = this.value;
//触发属性更改事件。
changes.firePropertyChange("value", oldValue, value);
this.value = value;
}catch(Exception e){//当在事件监听器中发生异常时忽略本次属性赋值操作。
e.printStackTrace();
}
}
}
//添加事件监听器的代码如下:
//创建Java Bean的实例。
EventBean obj = new EventBean();
//添加属性改变事件监听器。
obj.addListener("value", new PropertyChangeListener(){
@Override
public void propertyChange(PropertyChangeEvent evt) {
//输出属性的名称,旧值,新值。
System.out.println("propertyChange:"
+ "property:" + evt.getPropertyName()
+ " oldValue:" + evt.getOldValue()
+ " newValue:" + evt.getNewValue());
}
});
//设置新值。
obj.setValue(1);
obj.setValue(100);

运行结果如下:
propertyChange:property:value oldValue:0 newValue:1
propertyChange:property:value oldValue:1 newValue:100
使用否决投票监听器可以阻止属性的更改操作。VetoableChangeSupport类为投票监听器提供了方便。
支持否决投票监听器的Java Bean如下所示:

/**
* @Title: EventBean.java
* @Package com.test.javatechnology.introspection
* @Description:
* @author http://www.cnblogs.com/coe2coe/
* @date 2017年3月25日 下午6:02:36
* @version V1.0
*/
package com.test.javatechnology.introspection;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.beans.VetoableChangeListener;
import java.beans.VetoableChangeSupport;
/**
* @ClassName: EventBean
* @Description:
* @author http://www.cnblogs.com/coe2coe/
* @date 2017年3月25日 下午6:02:36
*
*/
public class VetoableEventBean {
public VetoableEventBean(){
}
//定义否决更改事件支持
private VetoableChangeSupport vetoableChanges = new VetoableChangeSupport(this);
public void addListener(String propertyName,VetoableChangeListener listener){
vetoableChanges.addVetoableChangeListener(propertyName,listener);
}
public void removeListener(String propertyName,VetoableChangeListener listener){
vetoableChanges.removeVetoableChangeListener(propertyName,listener);
}
//定义属性更改事件支持。
private PropertyChangeSupport changes = new PropertyChangeSupport(this);
/**
* 添加属性更改事件监听器。
* @param propertyName 待监听的属性名称
* @param listener 事件监听器。
*/
public void addListener(String propertyName,PropertyChangeListener listener){
changes.addPropertyChangeListener(propertyName, listener);
}
/**
* 移除属性更改事件监听器。
* @param propertyName 待监听的属性名称
* @param listener 事件监听器。
*/
public void removeListener(String propertyName,PropertyChangeListener listener){
changes.removePropertyChangeListener(propertyName, listener);
}
//唯一的属性。
private int value;
public int getValue() {
return value;
}
//在更改属性时出发事件。
public void setValue(int value) {
try{
int oldValue = this.value;
//出发投票事件。
vetoableChanges.fireVetoableChange("value", oldValue, value);
//触发属性更改事件。
changes.firePropertyChange("value", oldValue, value);
this.value = value;
}catch(Exception e){//当在事件监听器中发生异常时忽略本次属性赋值操作。
e.printStackTrace();
}
}
}

投票否决监听器的例子代码如下所示:

/**
* @Title: VetoableListenerTest.java
* @Package com.test.javatechnology.introspection
* @Description:
* @author http://www.cnblogs.com/coe2coe/
* @date 2017年3月25日 下午6:27:53
* @version V1.0
*/
package com.test.javatechnology.introspection;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyVetoException;
import java.beans.VetoableChangeListener;
/**
* @ClassName: VetoableListenerTest
* @Description:
* @author http://www.cnblogs.com/coe2coe/
* @date 2017年3月25日 下午6:27:53
*
*/
public class VetoableListenerTest {
/**
* @param args
*/
public static void main(String[] args) {
//创建Java Bean的实例。
VetoableEventBean obj = new VetoableEventBean();
//添加否决投票事件监听器。
obj.addListener("value", new VetoableChangeListener(){
@Override
public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException {
System.out.println("veto:"
+ "property:" + evt.getPropertyName()
+ " oldValue:" + evt.getOldValue()
+ " newValue:" + evt.getNewValue());
//当属性值为3时否决。
if( evt.getNewValue().equals(3)){
throw new PropertyVetoException("new value must not equal 3\r\n",evt);
}
}
});
//添加属性改变事件监听器。
obj.addListener("value", new PropertyChangeListener(){
@Override
public void propertyChange(PropertyChangeEvent evt) {
//输出属性的名称,旧值,新值。
System.out.println("propertyChange:"
+ "property:" + evt.getPropertyName()
+ " oldValue:" + evt.getOldValue()
+ " newValue:" + evt.getNewValue());
}
});
//设置新值。
obj.setValue(1);
System.out.println("value:" + obj.getValue());
//将不会改变
obj.setValue(3);
System.out.println("value:" + obj.getValue());
}
}

在投票监听器的事件处理中当新值为3时,通过抛出VetoException异常阻止了赋值的操作。
运行结果如下:
veto:property:value oldValue:0 newValue:1
propertyChange:property:value oldValue:0 newValue:1
value:1
veto:property:value oldValue:1 newValue:3
java.beans.PropertyVetoException: new value must not equal 3
value:1
at com.test.javatechnology.introspection.VetoableListenerTest$1.vetoableChange(VetoableListenerTest.java:44)
at java.beans.VetoableChangeSupport.fireVetoableChange(Unknown Source)
at java.beans.VetoableChangeSupport.fireVetoableChange(Unknown Source)
at java.beans.VetoableChangeSupport.fireVetoableChange(Unknown Source)
at com.test.javatechnology.introspection.VetoableEventBean.setValue(VetoableEventBean.java:75)
at com.test.javatechnology.introspection.VetoableListenerTest.main(VetoableListenerTest.java:68)
本文介绍JavaBean如何使用PropertyChangeSupport和VetoableChangeSupport来处理属性改变事件和投票否决事件。通过具体代码示例展示了如何添加和移除事件监听器,并在属性变化时触发事件。
1175

被折叠的 条评论
为什么被折叠?



