| 類型 | 讀取器 | 寫入器 | 範例 |
| 一般 | Type getProperty() | void setProperty(Type) | getName() / setName(String) |
| Boolean | boolean isProperty() 或 getProperty() | void setProperty(boolean) | isEnabled() / setEnabled(boolean) |
| 索引 | Type getProperty(int) | void setProperty(int, Type) | getItem(int) / setItem(int, Object) |
| 綁定 | 屬性變更觸發 PropertyChangeEvent | 需手動 firePropertyChange() |
| 受限 | 變更前觸發 VetoableChangeEvent,可攔截 | 罕用 |
事件模型
// 1. 事件物件(繼承 EventObject)
public class TemperatureChangedEvent extends EventObject {
private final double newTemp;
public TemperatureChangedEvent(Object source, double newTemp) { ... }
public double getNewTemperature() { return newTemp; }
}
// 2. 監聽器介面(繼承 EventListener)
public interface TemperatureListener extends EventListener {
void temperatureChanged(TemperatureChangedEvent e);
}
// 3. 事件源(Bean)註冊管理
public class Thermometer implements Serializable {
private double temp;
private final List listeners = new ArrayList<>();
public void addTemperatureListener(TemperatureListener l) { listeners.add(l); }
public void removeTemperatureListener(TemperatureListener l) { listeners.remove(l); }
public void setTemperature(double t) {
double old = this.temp;
this.temp = t;
// 通知所有監聽器
TemperatureChangedEvent evt = new TemperatureChangedEvent(this, t);
for (TemperatureListener l : listeners) l.temperatureChanged(evt);
}
}
- 命名慣例:事件名
TemperatureChanged → 監聽器 TemperatureListener、方法 temperatureChanged、註冊 add/removeTemperatureListener。
- AWT/Swing 內建事件:
ActionEvent/ActionListener、MouseEvent/MouseListener 等,直接複用。
持久化
- 標準機制:Java 序列化(
ObjectOutputStream 寫入檔案/資料庫)。
- 長期儲存建議:XML 編碼(
XMLEncoder/XMLDecoder)或 JSON(Jackson/Gson),避免 serialVersionUID 版本衝突。
- Transient 欄位:
transient 標記不序列化(如資料庫連線、執行緒池)。
在 IDE 中使用 JavaBean
- 從調色盤拖入 Bean 到表單。
- 屬性視窗編輯屬性(綁定屬性即時反映)。
- 事件頁籤雙擊事件 → 自動產生監聽器程式碼骨架。
- 多 Bean 連線:按鈕
actionPerformed → 觸發資料庫 Bean query() → 更新表格 Bean setModel()。
常見誤區
- 以為
public 欄位就是屬性 → 錯,必須有 getter/setter。
- 忘記
Serializable → 無法持久化、無法在分散式環境傳遞(RMI/EJB)。
- 事件來源未同步註冊清單 → 多執行緒環境下
ConcurrentModificationException(建議用 CopyOnWriteArrayList)。
- 上一篇文章: Eclipse RCP 能否取代 Web 技術?雙棲開發的理性抉擇
- 下一篇文章: JavaEE Without Ajax:以 JSF Render Kit 實現零 Ajax 代碼的富客戶體驗
Copyright ©
程式碼之家 All Rights Reserved