天天看點

[Java學習小記]使用PropertyChangeSupport來監聽變量的變化

最近開始要着手寫一個web項目 ,之前沒怎麼 寫過Java ,是以覺得蠻有必要把每天學習到的一些知識點或者解決的一些問題給記錄下來 。一來供自己在整理過程中掌握鞏固,二來也為以後再次出現該問題時能快速效率地查閱自己所寫的文章,也希望能夠對檢視本文的讀者有些許幫助。平時沒怎麼寫過這種部落格,寫的不好也請見諒,也希望能夠慢慢地鍛煉自己這項能力吧。前言就不多說了。

今天要處理的問題是:監聽一個變量,當該變量的值出現變化時能夠獲知,并進行相應處理。

使用java.bean.PropertyChangeSupport類。看如下的構造方法,其實就是将你要控制的對象綁定到該工具中。

PropertyChangeSupport changes = new PropertyChangeSupport(aclass);
           

使用到如下3種方法:

changes.addPropertyChangeListener(listener);
changes.removePropertyChangeListener(listener);
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

至于提到的javabean,以及其四種屬性之類的内容,也不是很了解。等了解了再進行補充吧。