綁定屬性(Bound Property)是 JavaBean 規範中四類屬性之一。當屬性值發生變化時,Bean 自動向所有註冊的監聽器發送 PropertyChangeEvent 事件。實現機制包含兩個核心要素:
firePropertyChangeadd/removePropertyChangeListener 管理監聽器手動維護監聽器列表繁瑣且易出錯,java.beans.PropertyChangeSupport 提供線程安全的監聽器管理與事件分發。
public class MyBoundBean {
private String ourString = "Hello";
// 1. 創建支持對象,this 為事件源
private PropertyChangeSupport changes = new PropertyChangeSupport(this);
// 2. 代理註冊/移除方法
public void addPropertyChangeListener(PropertyChangeListener listener) {
changes.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
changes.removePropertyChangeListener(listener);
}
// 3. Setter 中觸發事件
public void setString(String newString) {
String oldString = this.ourString;
this.ourString = newString;
// 參數:屬性名、舊值、新值(基本類型需包裝)
changes.firePropertyChange("ourString", oldString, newString);
}
public String getString() { return ourString; }
}
public class MyCallBound1 implements PropertyChangeListener {
private MyBoundBean bean = new MyBoundBean();
private JTextField textBox;
private JButton btn1, btn2;
public MyCallBound1() {
bean.addPropertyChangeListener(this);
// UI 初始化代碼省略...
}
// 按鈕點擊觸發屬性變更
public void actionPerformed(ActionEvent e) {
String text = textBox.getText();
btn1.setText(text);
bean.setString(text); // 觸發事件
}
// 事件回調
public void propertyChange(PropertyChangeEvent e) {
if (e.getSource() == bean) {
textBox.setText(e.getOldValue().toString()); // 顯示舊值
btn2.setText(e.getNewValue().toString()); // 顯示新值
}
}
}
MyBoundBean bean = new MyBoundBean();
bean.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent e) {
ourString_propertyChange(e); // 委託給自定義命名方法
}
});
void ourString_propertyChange(PropertyChangeEvent e) {
if (e.getSource() == bean) {
textBox.setText(e.getOldValue().toString());
btn2.setText(e.getNewValue().toString());
}
}
支持陣列/集合元素級別的變更通知:
void fireIndexedPropertyChange(String propertyName, int index,
Object oldValue, Object newValue);
對應事件類:IndexedPropertyChangeEvent(繼承自 PropertyChangeEvent),提供 getIndex() 方法。
PropertyChangeSupport 內部使用同步機制,確保多線程環境下監聽器列表操作與事件分發的原子性,避免並發修改異常。
public static final String PROP_OUR_STRING = "ourString"; 避免拼寫錯誤firePropertyChange 內部會自動忽略 old == new 的調用int 需傳 Integer,否則會觸發重載歧義removePropertyChangeListenerPropertyChangeSupport 是 JavaBean 綁定屬性的標準實現利器,封裝了監聽器管理、事件構建、線程安全分發等核心邏輯。配合匿名內部類可實現靈活的事件處理方法命名。掌握此機制是理解 Swing 數據綁定、Spring BeanWrapper 等高級特性的基礎。