Java Bean 規範定義了標準的屬性變更事件機制,通過 PropertyChangeSupport 與 PropertyChangeListener 實現組件間的鬆耦合通信。這是 Swing GUI 開發、數據綁定框架的基石。
public class Loan extends JPanel implements ActionListener {
// 核心:屬性變更支持器,管理監聽器列表與事件分發
protected PropertyChangeSupport changes = new PropertyChangeSupport(this);
private String loanType = "Personal Loan";
// 標準屬性訪問器,含事件觸發邏輯
public void setLoanType(String temp) {
String old = loanType; // 保存舊值
loanType = temp; // 更新新值
changes.firePropertyChange("loanType", old, temp); // 觸發事件
}
public String getLoanType() { return loanType; }
// GUI 組件初始化...
// 監聽器管理委託給 PropertyChangeSupport
public void addPropertyChangeListener(PropertyChangeListener l) {
changes.addPropertyChangeListener(l);
}
public void removePropertyChangeListener(PropertyChangeListener l) {
changes.removePropertyChangeListener(l);
}
}
public class CustomerLoan implements PropertyChangeListener {
private Loan lp; // 持有事件源引用
private JComboBox tctype; // 需動態更新的 UI 組件
public CustomerLoan() {
lp = new Loan();
// 關鍵:註冊監聽器
lp.addPropertyChangeListener(this);
// 初始化下拉框數據
tctype.addItem(lp.getLoanType());
}
// 核心回調方法:屬性變更時自動調用
@Override
public void propertyChange(PropertyChangeEvent pcevent) {
System.out.println("propertyChange was called");
// 獲取新值並更新 UI
tctype.addItem(pcevent.getNewValue());
}
}
用戶操作 Loan 面板
│
▼
actionPerformed() 觸發
│
▼
setLoanType() 執行
│
▼
firePropertyChange("loanType", old, new)
│
├──────────────────┐
▼ ▼
PropertyChangeEvent 所有註冊監聽器
封裝屬性名/舊值/新值 propertyChange()
│ │
▼ ▼
事件對象 CustomerLoan 更新 JComboBox
PropertyChangeSupport 內部使用 CopyOnWriteArrayList 存儲監聽器,天然線程安全,適合多線程環境下的屬性綁定。
// 組件銷毀時務必移除監聽器
public void cleanup() {
loan.removePropertyChangeListener(this);
loan = null; // 幫助 GC 回收
}
@ConfigurationProperties 底層同樣使用屬性變更通知ObservableValue / Property 是更強大的綁定 APIBaseObservable + @Bindable 註解| 問題 | 原因 | 解決方案 |
|---|---|---|
| 事件不觸發 | 未調用 firePropertyChange 或參數錯誤 | 檢查屬性名拼寫、確保舊值新值不同 |
| 重複觸發 | 監聽器重複註冊 | 註冊前先 remove,或用 Set 管理監聽器 |
| UI 不更新 | 非 EDT 線程修改 Swing 組件 | 用 SwingUtilities.invokeLater 包裹 UI 更新 |
Java Bean 的屬性變更事件機制是標準、輕量、線程安全的觀察者模式實現。掌握 PropertyChangeSupport 與 PropertyChangeListener 的協作模式,不僅能構建健壯的 Swing 應用,更能深入理解 Spring、JavaFX 等現代框架的數據綁定核心原理。