| 特性 | AWT | Swing | SWT (+JFace) |
|---|---|---|---|
| 發布時間 | JDK 1.0 (1996) | JDK 1.2 (1998) | Eclipse 2.1 (2003) |
| 核心架構 | Heavyweight Peer (原生封裝) | Lightweight 純 Java 繪製 | Heavyweight Peer (薄封裝) + 缺失組件仿真 |
| 組件豐富度 | 極少 (無表格/樹/進度條) | 極豐富 (JTable/JTree/JTabbedPane...) | 豐富 (Table/Tree/TabFolder/Toolbar...) |
| 外觀一致性 | 平台原生,但行為差異大 | 可換裝 L&F,跨平台一致,非原生 | 完美原生,隨 OS 版本自動更新 |
| 性能 | 線程安全鎖開銷大,組件重 | 對象多、繪製開銷大,近年優化顯著 | 輕量 Peer,原生渲染,啟動快、內存低 |
| 部署依賴 | JRE 內置,零依賴 | JRE 內置,零依賴 | 需額外分發 swt.jar + 平台專屬 DLL/so |
| 圖形能力 | Java2D/3D 支持良好 | Java2D/3D 無縫集成 | 有限,依賴 Draw2D/GEF (Eclipse 生態強綁定) |
| 可訪問性 | 幾乎無 API | 完整 Accessibility API | 依賴平台原生服務,補充基礎 API |
| 線程模型 | 線程安全 (內部同步) | 單線程 EDT,非線程安全 | 單線程 UI Thread,非線程安全,錯誤拋異常 |
| 構建方式 | 自頂向下/自底向上均可 | 自頂向下/自底向上均可 | **僅自頂向下** (父容器必須先存在) |
| 資源銷毀 | 自動 (高級組件需手動) | 自動 | **手動** (dispose()),父容器自動銷毀子控件 |
| 功能 | AWT | Swing | SWT |
|---|---|---|---|
| 單行文本 | TextField | JTextField | Text (SINGLE) |
| 多行文本 | TextArea | JTextArea | Text (MULTI) |
| 富文本 | N/A | JEditorPane/JTextPane | StyledText |
| 表格 | N/A | JTable | Table (+ JFace ContentProvider) |
| 樹 | N/A | JTree | Tree (+ JFace) |
| 標籤頁 | N/A | JTabbedPane | CTabFolder / TabFolder |
| 分割面板 | N/A | JSplitPane | Sash / SashForm |
| 進度條 | N/A | JProgressBar | ProgressBar |
| 工具欄 | N/A | JToolBar | ToolBar / CoolBar |
| 系統托盤 | N/A | N/A (Java 6+ TrayIcon) | Tray |
| 瀏覽器嵌入 | N/A | JEditorPane (HTML 3.2) / JavaFX WebView | Browser (原生 IE/WebKit/GTK WebKit) |
| 項目特徵 | 推薦選擇 | 理由 |
|---|---|---|
| **嵌入式/單平台/需原生外觀/性能敏感/集成 ActiveX/COM** | **SWT** | 原生 Peer 零模擬開銷,直接訪問平台特性 (OLE/ActiveX),Eclipse RCP 生態成熟 |
| **跨平台桌面應用/需高級圖形/繪圖工具/圖表/可視化/團隊熟悉 Swing** | **Swing** | JRE 內置零部署,Java2D/3D 強大,L&F 保證行為一致,生態文檔最豐富 |
| **極簡工具/Applet/舊系統維護/無第三方依賴嚴格限制** | **AWT** | 類庫最小,JRE 1.0+ 皆有,但功能極受限,不建議新項目 |
| **現代新項目/需聲明式 UI/綁定/動畫/觸控/移動端統一** | **JavaFX** | Java 8+ 內置,FXML+CSS 分離,硬件加速渲染,屬性綁定,逐步取代 Swing/SWT |
沒有完美的 GUI 工具包,只有最適合**當前約束**的選擇。理解三者基因差異 (Peer vs 繪製、部署模型、生態綁定),結合項目「平台範圍、性能指標、UI 複雜度、團隊技能、長期演進路線」做決策。新項目優先評估 **JavaFX**;存量 Swing/SWT 系統穩定則維護,重構時考慮遷移路徑。