SWT (Standard Widget Toolkit) 是 IBM 為 Eclipse IDE 開發的圖形介面工具包。其核心理念:**Java 程式碼調用原生 OS 控件 (Win32/Cocoa/GTK) 透過 JNI 實現**,而非像 Swing 那樣純 Java 繪製輕量級組件。這意味著:
swt.jar + 原生庫 (.dll/.so/.jnilib)。Eclipse IDE、RCP 應用、Rap (Remote Application Platform) 皆建立於 SWT 之上。
swt-3.120-win32-win32-x86_64.zip。swt.jar (Java API) + swt-win32-3.120.dll (原生庫)。swt.jar。-Djava.library.path=/path/to/swt/native/libs/folder
# 例: -Djava.library.path=D:/eclipse/plugins/org.eclipse.swt.win32_3.120.0/os/win32/x86_64
建議將原生庫資料夾加入系統 PATH 環境變數,避免每次配置。
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.*;
public class SwtHelloWorld {
public static void main(String[] args) {
// 1. Display: 與作業系統圖形子系統連接的橋樑 (每個執行緒通常一個)
Display display = new Display();
// 2. Shell: 頂層視窗 (主視窗或對話框)
Shell shell = new Shell(display);
shell.setText("SWT Hello World");
shell.setLayout(new FillLayout()); // 簡單佈局:單一子控件填滿客戶區
// 3. 建立控件: Label (標籤)
Label label = new Label(shell, SWT.CENTER); // 水平置中
label.setText("Hello, SWT! 你好,原生界面!");
// 4. 佈局與顯示
shell.pack(); // 根據子控件優選大小調整 Shell 大小
shell.open(); // 顯示視窗,非阻塞
// 5. 事件迴圈: 讀取並分發作業系統事件 (阻塞直到視窗關閉)
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep(); // 無事件時讓出 CPU
}
}
// 6. 資源釋放: 必須顯式釋放 Display (包含原生資源)
display.dispose();
System.out.println("Application exited.");
}
}
| 類別 | 職責 | 關鍵點 |
|---|---|---|
Display | 管理與 OS 圖形系統的連接、事件迴圈、色彩/字體/圖片資源快取、計時器 | 應用程式通常只有一個;dispose() 釋放所有關聯資源 |
Shell | 頂層視窗容器,可有標題欄、選單、工具欄、邊框 | setLayout() 設定佈局管理器;open() 顯示;isDisposed() 判斷是否關閉 |
Composite | 容器控件 (Panel 等同),可包含子控件,支援佈局管理 | 所有容器繼承自 Composite;Control 是所有視覺組件基類 |
Layout | 佈局管理器:FillLayout(單一填滿)、RowLayout(流式)、GridLayout(網格、最強大)、FormLayout(錨點/附著) | **GridLayout** 是複雜介面首選,類似 Swing 的 GridBagLayout 但更簡潔 |
Listener / Typed Listener | 事件處理:addListener(SWT.Selection, e -> ...) (低階) 或 addSelectionListener(new SelectionAdapter() {...}) (高階適配器) | 事件物件 Event 包含 widget, type, x, y, keyCode, button 等 |
Text (單行/多行/密碼/只讀)、Combo (下拉框)、Spinner (數值微調)。Button (PUSH/CHECK/RADIO/TOGGLE/ARROW)、ToolBar + ToolItem。List、Table + TableColumn/TableItem、Tree + TreeItem — **支援虛擬模式 (大數據懶載入)**。Browser (內嵌 WebView/WebKit/Edge)、Canvas (自定義繪圖)、DateTime (日期時間選擇)、TabFolder (分頁)。SWT 控件持有**原生 OS 控件句柄 (HWND/NSView/GtkWidget)**,**GC 不會自動回收原生資源**。必須遵守:
Color, Font, Image, GC, Printer, Display 等實作 Resource 介面的物件,用完必須呼叫 dispose()。shell.dispose() 會觸發所有子控件 dispose(),但**共享資源 (Color/Font/Image) 不會被自動釋放**,需由建立者管理。LocalResourceManager / DeviceResourceManager 可自動追蹤並釋放資源,RCP 開發強烈建議使用。SWT 以「原生」為榮,以「資源手動管理」為戒。掌握 Display 事件迴圈、GridLayout 佈局、資源釋放鐵律、JFace Viewers 模式,即可開發高效能、原生外觀的桌面應用。若目標是 Eclipse 插件/RCP 開發,SWT/JFace 是不可繞過的核心功力。