長久以來,Java 桌面應用(AWT/Swing)面臨兩大詬病:外觀異質(與作業系統原生風格脫節)與效能低落(啟動緩慢、記憶體佔用高)。雖 JBuilder、NetBeans、JProbe 等大型 IDE 證明 Swing 可構建複雜應用,但對一般使用者而言,體驗仍不盡理想。
Standard Widget Toolkit (SWT) 最初為 Eclipse IDE 開發,採用JNI 直接呼叫作業系統原生圖形 API(Win32、GTK、Cocoa、Photon 等),僅在作業系統缺乏對應元件時才自行模擬。這一設計理念帶來雙重優勢:
org.eclipse.swt 套件結構、類別/方法命名長期保持相容,升級通常僅需替換 swt.jar 與對應平台原生庫(.dll/.so)。package com.example.swt;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class OpenShell {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.open();
// 事件迴圈
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose(); // 釋放原生資源
}
}
執行關鍵:
swt.jar-Djava.library.path=<原生庫目錄> 指向 swt-win32-xxxx.dll (Windows) 或 libswt-gtk-xxxx.so (Linux)所有類別位於 org.eclipse.swt 根套件下:
| 套件 | 用途 | 關鍵類別 |
|---|---|---|
widgets | 基礎元件 | Button, Combo, Text, Label, Shell, Composite |
layout | 佈局管理 | FillLayout, RowLayout, GridLayout, FormLayout + 對應 LayoutData |
custom | 進階/擴充元件 | CLabel(圖文混排), StyledText(富文本), StackLayout |
graphics | 繪圖基礎 | GC, Image, Font, Color, Device |
events | 事件模型 | Listener 介面, Event 類別, TypedListener |
JPanel,承載子元件並配合 Layout 管理佈局。沿用 Swing 雙層設計:Layout 定義演算法,LayoutData 為各元件攜帶佈局參數(如 GridData 指定跨欄、對齊、邊距)。常用四種:
FillLayout:單列/單行填滿RowLayout:流式排列,可換行GridLayout:表格式,最彈性、最常用FormLayout:錨點式精確定位swt.jar 與原生庫。swt.jar;啟動配置加入 -Djava.library.path。swing2swt 或自訂 ClassLoader 載入)。SWT 以「薄封裝、重委派」架構,成功解決 Java 桌面應用的外觀與效能難題。雖開發者需處理原生資源釋放(dispose())、平台差異測試,但換來的是真正原生級的使用者體驗。對追求高品質跨平台桌面應用的團隊,SWT 是除 JavaFX 外最成熟的選擇。