首页 > 代码库 > 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)内省之属性改变事件和投票否决事件