java.beans.PropertyChangeSupport小解! 簡潔精闢

簡要介紹一下,java.beans.PropertyChangeSupport是一個實用工具類,支持綁定該屬性的bean能夠使用該類。還是不多廢話了,用代碼說話。

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;

public class PropertyChangeSupportTest {

	transient protected PropertyChangeSupport listeners = new PropertyChangeSupport(
			this);

	public void addPropertyChangeListener(PropertyChangeListener listener) {
		listeners.addPropertyChangeListener(listener);
	}

	protected void firePropertyChange(String prop, Object old, Object newValue) {
		listeners.firePropertyChange(prop, old, newValue);
	}

	public void removePropertyChangeListener(PropertyChangeListener l) {
		listeners.removePropertyChangeListener(l);
	}
}

可以看見PropertyChangeSupport的構造方法,是將此類本身綁定到該屬性,以便他的子類也能夠使用此工具類。主要看他的第2個方法,觸發屬性變化事件(prop爲綁定的屬性名,在後面的事件處理中可以根據此屬性名獲得事件處理源)
再看看它的子類:
public class BeanTest extends PropertyChangeSupportTest {

    public static final String TEST = "test";

    private String name = "";

    public void setName(String name) {
        if (this.name.equals(name)) {
            System.out.println("BeanTest 的 name 屬性沒有變化!");
            return;
        }
        this.name = name;
        firePropertyChange(TEST, null, name);
    }

    public String getName() {
        return this.name;
    }
}
BeanTest類有一個name屬性,在改變name的值時,會觸發PropertyChangeEvent事件。接下來我們看看事件監聽極其處理:

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

public class BeanTestListener implements PropertyChangeListener{

    public void propertyChange(PropertyChangeEvent evt) {
        if(evt.getPropertyName().equals(BeanTest.TEST))
            System.out.println("BeanTest 的 name 屬性變化!");
        
    }
    public static void main(String[] args){
        BeanTest test = new BeanTest();
        test.addPropertyChangeListener(new BeanTestListener());
        test.setName("hql_");
        test.setName("hql_");
        System.out.println(test.getName());
    }

}

可以看到是通過evt.getPropertyName().equals(BeanTest.TEST)來確定事件源的。運行結果如下:

BeanTest 的 name 屬性變化!
BeanTest 的 name 屬性沒有變化!
hql_

/**
 * 當執行setName操作時,會觸發firePropertyChange事件,
 * 因爲PropertyChangeSupportTest和PropertyChangeSupport綁定
 * 那麼在BeanTestListener中,因爲添加里支持類的監聽器,所以應該觸發propertyChange事件,
 * 並且會根據evt.getPropertyName()來獲得你在BeanTest中觸發事件是綁定的屬性名稱
 */

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章