PropertyChangeSupport来监听变量的变化

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值