前言:一場關於 GUI 靈魂的戰爭
SWT (Standard Widget Toolkit) 與 Swing 的論戰贯穿 Java 客戶端開發史。本文基於 IBM 內部視角回溯:從 AWT 缺陷、Amy Fowler 主導 Swing、IBM 移植 Smalltalk 原生組件誕生 SWT、Eclipse 與 NetBeans 代理戰、Sun 認證封殺,還原技術選型背後的商業博弈與人性衝突。
第一幕:AWT 的失敗與 Amy Fowler 的登場
- 早期 AWT 採用「最小公分母」策略,僅封裝各平台通用原生控件 (Peer),缺失表格、樹等高級組件,且 Peer 實現充滿平台差異 Bug。
- Sun 開發 Graham、Otto 慣於將 Bug 歸咎於 OS 差異 (如焦點順序、快捷鍵行為)。
- 1996 年,**Amy Fowler** (來自 Smalltalk 廠商 ObjectShare/ParcPlace-Digitalk) 加入 Sun,承諾以「輕量級」純 Java 繪製解決所有問題,說服管理層掌管 GUI 組,帶入原班人馬開發 Swing。
第二幕:Smalltalk 陣營的慘痛教訓
- 90 年代初三大 Smalltalk 巨頭:IBM (原生 Peer)、ParcPlace (仿真繪製)、Digitalk (原生 Peer)。
- ParcPlace 併購 Digitalk 組成 PPD,試圖融合兩套架構 (Jigsaw 專案),因「原生派」與「仿真派」開發者內戰潰敗,股價從 $60 跌至 <$1,被 NASDAQ 摘牌。
- **教訓**:混合兩種架構極難,團隊內耗致命。Sun 卻重蹈覆轍,讓 Amy 推行全仿真路線。
第三幕:IBM 的反擊 — SWT 誕生
- IBM VisualAge for Java 基於 Smalltalk (原生 Peer) 開發,遷移到 Java 時極其厭惡 Swing:龐大、Bug 多、醜陋、非原生感。
- 客戶對比 Visual Studio 時僅因外觀拒絕,IBM 決定移植 Smalltalk 原生組件 → **SWT** (由加拿大 OTI 團隊完成)。
- SWT 設計原則:
- 核心組件映射原生 Peer (如 AWT),但定義豐富組件集 (表格、樹、Tab、ToolBar),缺失平台組件才仿真 (C 開頭類如
CTabFolder)。
- Peer 僅為薄封裝,**不**掩蓋平台差異,應用直接面對原生行為 (WOTE: Write Once, Test Everywhere)。
- 自定義事件循環修復 Swing 讀取 Windows 消息隊列的內存洩漏 Bug,導致 SWT 與 AWT/Swing **無法共存同一 JVM**。
- SWT 落地 Eclipse,目標直指 Visual Studio。Eclipse 開源,吸引 TogetherSoft、Rational 等 ISV 入駐。
第四幕:Sun 的圍堵與代理戰
- NetBeans (Sun 支持) 與 Eclipse 直接競爭。
- Sun 拒絕認證 Eclipse (含原生代碼),法律威脅禁止稱「Java IDE」,Eclipse GUI 設計器禁用 SWT 控件拖拽。
- Sun 指責 SWT 綁定 Windows,實則 SWT 已支持 GTK (Linux/Mac)、Photon (QNX)、Windows CE 等嵌入式平台。
技術本質對比:本質區別在於「誰繪製控件」
| 維度 | Swing (仿真/輕量級) | SWT (原生/重量級 Peer) |
| 繪製者 | Java 代碼調用 paint(Graphics) 自繪 | OS 原生窗口管理器 |
| 外觀 | 可換裝 (Metal/Nimbus/GTK/Windows L&F),但常「像而不神」 | 完美原生,自動獲得 OS 版本更新 (如 Vista Aero、Win10 Fluent) |
| 性能 | 大量對象、雙緩衝、GC 壓力大;近年優化明顯 | 輕量 Java Peer,原生端承擔渲染,啟動快、內存低 |
| 可移植性 | 真正 WORA,行為一致性高 | WOTE,需各平台測試,但覆蓋主流桌面/嵌入式 |
| 高級圖形 | Java2D/3D 無縫集成,繪圖應用首選 | 依賴 Draw2D/GEF (Eclipse 環境強綁定),獨立使用困難 |
| 線程模型 | 單線程規則 (EDT),非線程安全 | 單線程規則 (UI Thread),非線程安全,錯誤拋異常 |
用戶心聲:兩種哲學
Swing 擁護者:「花幾年精通它,就能正確使用。」—— 維護專業技術壁壘。
SWT 擁護者:「哇,真快,跟原生一樣,還有 XP 皮膚……又輕又小。」—— 追求即時體驗與原生一致性。
精彩比喻:「Swing 就像 Java 決定不通過 OS 讀寫磁盤,而是用磁頭馬達 API 自己讀扇區。它拿著底層 paint(Graphics) 自己畫所有控件。」
現狀與啟示
- Swing 隨 JDK 內置,JavaFX 試圖現代化但未完全取代。
- SWT 隨 Eclipse 平台演進,仍是 Eclipse RCP/IDE 的基石。
- **啟示**:技術選型非純技術決策,受組織政治、歷史包袱、生態鎖定主導。理解歷史有助於在現有約束下做最佳工程權衡。