使用PropertyChangeSupport监听变量变化

今天要处理的问题是:监听一个变量,当该变量的值出现变化时能够获知,并进行相应处理。

使用java.bean.PropertyChangeSupport类。看如下的构造方法,其实就是将你要控制的对象绑定到该工具中。

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. PropertyChangeSupport changes = new PropertyChangeSupport(aclass);  

使用到如下3种方法:

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. changes.addPropertyChangeListener(listener);  
  2. changes.removePropertyChangeListener(listener);  
  3. changes.firePropertyChange("name"null, name);  

分别是注册监听器,移除监听器,和触发一个监听事件。其中name就是aclass中一个String属性变量。


[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. MyClass aclass = new MyClass();  
  2.         PropertyChangeSupport changes = new PropertyChangeSupport(aclass);  
  3.         changes.addPropertyChangeListener(new PropertyChangeListener() {  
  4.               
  5.             @Override  
  6.             public void propertyChange(PropertyChangeEvent evt) {  
  7.                 // TODO Auto-generated method stub  
  8.                 System.out.println("change");  
  9.             }  
  10.         });  
  11.           
  12.         String str = aclass.getName();  
  13.         aclass.setName("11");  
  14.         changes.firePropertyChange("name", str, aclass.getName());  

使用匿名内部类来实现监听器,在propertyChange方法中实现你要的处理。该方法会在firePropertyChange触发了事件之后捕获该事件然后执行。也可以通过implements PropertyChangeListener接口实现。

bean的属性发生变化时,使用PropertyChangeSupport对象的firePropertyChange方法,它会将一个事件发送给所有已经注册的监听器。该方法有三个参数:属性的名字、旧的值以及新的值。属性的值必须是对象,如果是简单数据类型,则必须进行包装。

注意:如果str 和aclass.getName(),也就是旧值和新值是相同的,不会触发事件。如果将str改为Null,则都会触发事件。

结果:

change


       因为一般变量值的变化都是调用了setter方法,所以我们可以在MyClass中直接绑定PropertyChangeSupport对象。然后在需要监听的属性的setter方法中调用firePropertyChange方法,并将添加监听器和移除监听器的方法也由在MyClass中实现。

简单的对MyClass修改如下。

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. public class MyClass {  
  2.     private String name = "1";  
  3.     private String age = "2";  
  4.     private PropertyChangeSupport changes = new PropertyChangeSupport(this);  
  5.       
  6.     public void setName(String name) {  
  7.         String OldName = this.name;  
  8.         this.name = name;  
  9.         changes.firePropertyChange("name", OldName, name);  
  10.     }  
  11.     public String getName() {  
  12.         return name;  
  13.     }  
  14.     public void setAge(String age) {  
  15.         this.age = age;  
  16.     }  
  17.     public String getAge() {  
  18.         return age;  
  19.     }  
  20.       
  21.     public void addPropertyChangeListener(PropertyChangeListener listener) {  
  22.            changes.addPropertyChangeListener(listener);  
  23.         }  
  24.        
  25.     public void removePropertyChangeListener(PropertyChangeListener listener) {  
  26.            changes.removePropertyChangeListener(listener);  
  27.         }  
  28.   
  29. }  

然后由该类直接调用

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. MyClass aclass = new MyClass();  
  2. aclass.addPropertyChangeListener(new PropertyChangeListener() {  
  3.     @Override  
  4.     public void propertyChange(PropertyChangeEvent evt) {  
  5.     // TODO Auto-generated method stub  
  6.         System.out.println(evt.getPropertyName());  
  7.         System.out.println(evt.getOldValue());  
  8.         System.out.println(evt.getNewValue());    
  9.     }  
  10. });  
  11. aclass.setName("new");  

 
输出结果: 

name
1
new

可以参考,http://zhangjunhd.blog.51cto.com/113473/36838/

http://www.blogjava.net/fuxueliang/archive/2006/07/18/58738.html

至于提到的javabean,以及其四种属性之类的内容,也不是很了解。等了解了再进行补充吧。

转自:http://blog.csdn.net/yoier/article/details/25891077

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值