首页 > 代码库 > Java重要技术(15)内省之属性改变事件和投票否决事件
Java重要技术(15)内省之属性改变事件和投票否决事件
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 = http://www.mamicode.com/this.value; //触发属性更改事件。 changes.firePropertyChange("value", oldValue, value); this.value =http://www.mamicode.com/ 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 = http://www.mamicode.com/this.value; //出发投票事件。 vetoableChanges.fireVetoableChange("value", oldValue, value); //触发属性更改事件。 changes.firePropertyChange("value", oldValue, value); this.value =http://www.mamicode.com/ 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)
Java重要技术(15)内省之属性改变事件和投票否决事件