SWT(Standard Widget Toolkit)是Eclipse基金會開發的原生GUI工具包,通過JNI調用操作系統原生組件(Windows用Win32、Linux用GTK、macOS用Cocoa),兼具原生外觀、高性能、豐富組件特性。與Swing的繪製式渲染不同,SWT「委託給OS繪製」,體驗更接近原生應用。本文以Eclipse IDE為例,手把手構建首個SWT應用。
swt-4.28-win32-win32-x86_64.zip),無需解壓File → Import → Existing Projects into Workspace → Select archive file 選中zip → Finish,產生org.eclipse.swt項目Properties → Java Build Path → Projects → Add → 勾選org.eclipse.swt → OK
圖1:將SWT項目加入構建路徑
public class HelloWorld {
public static void main(String[] args) {
// 1. Display:連接底層OS、管理事件循環、資源倉庫
Display display = new Display();
// 2. Shell:頂層窗口容器,對應OS原生窗口
Shell shell = new Shell(display);
shell.setText("Hello World"); // 窗口標題
shell.setBounds(100, 100, 200, 50); // x, y, width, height
shell.setLayout(new FillLayout()); // 填充佈局:單組件鋪滿
// 3. Label:標籤組件,SWT.CENTER居中對齊
Label label = new Label(shell, SWT.CENTER);
label.setText("Hello World");
// 4. Color:顏色資源,需手動dispose
Color red = new Color(display, 255, 0, 0); // RGB構建
// 替代:Color red = display.getSystemColor(SWT.COLOR_RED); // 系統色無需dispose
label.setForeground(red); // 設置前景色
// 5. 打開窗口並進入事件循環
shell.open();
while (!shell.isDisposed()) { // 窗口未關閉時循環
if (!display.readAndDispatch()) { // 讀取並分發事件
display.sleep(); // 無事件時休眠,節省CPU
}
}
// 6. 資源釋放(逆序:先創建後釋放)
red.dispose(); // 非系統色必須釋放
display.dispose(); // 釋放所有OS資源、結束事件循環
}
}
| 行號 | 核心對象 | 職責 | 注意事項 |
|---|---|---|---|
| 2 | Display | 進程級單例,橋接JVM與OS,管理事件隊列、字體/顏色/圖片資源 | 應用僅創建一個,最後dispose() |
| 3 | Shell | 頂層窗口,可含菜單欄、工具欄、客戶區 | 無parent則為主窗口;有parent則為Dialog |
| 6 | FillLayout | 最簡單佈局:單組件填滿客戶區 | 實際開發用GridLayout/FormLayout |
| 9 | Color | 非系統色需手動dispose() | 系統色getSystemColor()無需釋放 |
| 12-14 | 事件循環 | 讀取OS事件→分發給Listener→無事件睡眠 | UI線程必須跑此循環,否則界面凍結 |
| 15-16 | 資源清理 | 防止OS句柄洩漏、GDI對象耗盡 | 原則:誰創建誰釋放,逆序釋放 |
Run As → Java Application → 拋UnsatisfiedLinkError(找不到swt-win32-*.dll)Run As → SWT Application → 彈出啟動配置 → Run
圖2:SWT Application啟動配置
原理:SWT Application自動設置-Djava.library.path指向SWT原生庫目錄。

圖3:運行結果——紅色居中文字的原生窗口
display.asyncExec(() -> { ... })或syncExec()Font、Image、Color、GC、Printer等實現Resource接口,用完必須dispose()。建議用try-with-resources或Display#disposeExec()統一管理GridLayout(表單)、FormLayout(精確控制)、StackLayout(向導/卡片切換)DataBinding框架,實現Model-View雙向同步,大幅減少樣板代碼swt-maven-plugin或tycho,自動解析平台相關依賴,產出原生安裝包SWT以原生性能、原生外觀、豐富組件贏得Eclipse IDE、RCP應用、科學計算可視化等領域青睞。掌握Display-Shell-Widget三層架構、事件循環機制、資源生命周期管理,即可構建專業級桌面應用。下一步建議學習JFace(Viewer/Provider/LabelProvider)、DataBinding、RCP平台開發,解鎖企業級應用構建能力。