JavaBean 規範定義四種屬性類型,透過方法命名慣例與特定事件支援類別,賦予屬性豐富的語意與互動行為,是視覺化建構工具與運行時期元件協作的基石。
單一標量值,對應一對 getX()/setX() (布林可用 isX())。
public class Alden1 extends Canvas {
private String ourString = "Hello";
public String getString() { return ourString; }
public void setString(String s) { ourString = s; }
}
陣列或有序集合,提供整體存取與索引存取的重載方法組。
public class Alden2 extends Canvas {
private int[] dataSet = {1,2,3,4,5,6};
public int[] getDataSet() { return dataSet; }
public void setDataSet(int[] d) { dataSet = d; }
public int getDataSet(int i) { return dataSet[i]; }
public void setDataSet(int i, int v) { dataSet[i] = v; }
}
值變更時發送 PropertyChangeEvent,支援「屬性連結」:來源 Bean 屬性變更自動同步至目標 Bean 對應屬性。
PropertyChangeSupport 管理監聽器清單。setX() 中呼叫 firePropertyChange("x", old, new)。add/removePropertyChangeListener 供建構工具或程式註冊。public class Alden3 extends Canvas {
private String ourString = "Hello";
private PropertyChangeSupport changes = new PropertyChangeSupport(this);
public void setString(String s) {
String old = ourString; ourString = s;
changes.firePropertyChange("ourString", old, s);
}
public void addPropertyChangeListener(PropertyChangeListener l) { changes.addPropertyChangeListener(l); }
public void removePropertyChangeListener(PropertyChangeListener l) { changes.removePropertyChangeListener(l); }
}
值變更前發送 VetoableChangeEvent,監聽器可拋出 PropertyVetoException 否決變更。需同時維護 Bound 機制 (變更後通知)。
public class JellyBean extends Canvas {
private int priceInCents = 0;
private PropertyChangeSupport changes = new PropertyChangeSupport(this);
private VetoableChangeSupport vetos = new VetoableChangeSupport(this);
public void setPriceInCents(int newPrice) throws PropertyVetoException {
int old = priceInCents;
vetos.fireVetoableChange("priceInCents", old, newPrice); // 可能被否決
priceInCents = newPrice;
changes.firePropertyChange("priceInCents", old, newPrice); // 確認生效
}
// VetoableChangeListener 註冊方法
public void addVetoableChangeListener(VetoableChangeListener l) { vetos.addVetoableChangeListener(l); }
public void removeVetoableChangeListener(VetoableChangeListener l) { vetos.removeVetoableChangeListener(l); }
// PropertyChangeListener 註冊方法同 Bound
}
| 類型 | 核心支援類別 | 事件 | 典型應用 |
|---|---|---|---|
| Simple | 無 | 無 | 一般資料欄位 |
| Indexed | 無 | 無 | 表格資料、列表項目 |
| Bound | PropertyChangeSupport | PropertyChangeEvent | UI 聯動、模型同步 |
| Constrained | VetoableChangeSupport | VetoableChangeEvent | 資料驗證、權限審核 |