[Java学习小记]使用PropertyChangeSupport来监听变量的变化

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

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

  1. PropertyChangeSupport changes = new PropertyChangeSupport(aclass);  

使用到如下3种方法:

 
  1. changes.addPropertyChangeListener(listener);  
  2. changes.removePropertyChangeListener(listener);  
  3. changes.firePropertyChange("name", null, name);  

 

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

     MyClass aclass = new MyClass();  
        PropertyChangeSupport changes = new PropertyChangeSupport(aclass);  
        changes.addPropertyChangeListener(new PropertyChangeListener() {  
              
            @Override  
            public void propertyChange(PropertyChangeEvent evt) {  
                // TODO Auto-generated method stub  
                System.out.println("change");  
            }  
        });  
          
        String str = aclass.getName();  
        aclass.setName("11");  
        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修改如下。

public class MyClass {  
    private String name = "1";  
    private String age = "2";  
    private PropertyChangeSupport changes = new PropertyChangeSupport(this);  
      
    public void setName(String name) {  
        String OldName = this.name;  
        this.name = name;  
        changes.firePropertyChange("name", OldName, name);  
    }  
    public String getName() {  
        return name;  
    }  
    public void setAge(String age) {  
        this.age = age;  
    }  
    public String getAge() {  
        return age;  
    }  
      
    public void addPropertyChangeListener(PropertyChangeListener listener) {  
           changes.addPropertyChangeListener(listener);  
        }  
       
    public void removePropertyChangeListener(PropertyChangeListener listener) {  
           changes.removePropertyChangeListener(listener);  
        }  
  
}  

 

然后由该类直接调用

 

MyClass aclass = new MyClass();  
aclass.addPropertyChangeListener(new PropertyChangeListener() {  
    @Override  
    public void propertyChange(PropertyChangeEvent evt) {  
    // TODO Auto-generated method stub  
        System.out.println(evt.getPropertyName());  
        System.out.println(evt.getOldValue());  
        System.out.println(evt.getNewValue());    
    }  
});  
aclass.setName("new");  

 

输出结果:

 

name
1
new

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

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

posted on 2018-02-23 18:33  腾飞的鹰  阅读(1326)  评论(0)    收藏  举报

导航