簡要介紹一下,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中觸發事件是綁定的屬性名稱
*/