首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 秘史:SWT 與 Swing 之爭背後的商業博弈與技術抉擇

     編輯:Java 相關知識

前言:一場關於 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 設計原則:
    1. 核心組件映射原生 Peer (如 AWT),但定義豐富組件集 (表格、樹、Tab、ToolBar),缺失平台組件才仿真 (C 開頭類如 CTabFolder)。
    2. Peer 僅為薄封裝,**不**掩蓋平台差異,應用直接面對原生行為 (WOTE: Write Once, Test Everywhere)。
    3. 自定義事件循環修復 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 的基石。
  • **啟示**:技術選型非純技術決策,受組織政治、歷史包袱、生態鎖定主導。理解歷史有助於在現有約束下做最佳工程權衡。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved