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

SWT 入門實戰:基於 Java 的原生圖形介面開發 (Eclipse RCP 基石)

     編輯:Java 程式設計入門

前言:SWT vs Swing — 另一條原生之路

SWT (Standard Widget Toolkit) 是 IBM 為 Eclipse IDE 開發的圖形介面工具包。其核心理念:**Java 程式碼調用原生 OS 控件 (Win32/Cocoa/GTK) 透過 JNI 實現**,而非像 Swing 那樣純 Java 繪製輕量級組件。這意味著:

  • **外觀原生**:應用長得像原生應用 (Windows 長得像 Windows,Mac 長得像 Mac)。
  • **效能優異**:繪製、事件分發由 OS 處理,記憶體佔用低、啟動快。
  • **平台細節暴露**:需為每個平台打包對應 swt.jar + 原生庫 (.dll/.so/.jnilib)。

Eclipse IDE、RCP 應用、Rap (Remote Application Platform) 皆建立於 SWT 之上。

環境搭建 (以 Eclipse 4.30 / SWT 3.120 / Windows x64 為例)

  1. 下載 Eclipse SDK:Eclipse Packages (含 SWT 庫)。
  2. 或獨立下載 SWT:Eclipse Downloads → swt-3.120-win32-win32-x86_64.zip。
  3. 解壓取得:swt.jar (Java API) + swt-win32-3.120.dll (原生庫)。

Eclipse IDE 專案配置

  1. 新建 Java Project → Properties → Java Build Path → Libraries → Add External JARs → 選擇 swt.jar。
  2. 關鍵步驟:Run Configurations → Arguments → VM Arguments 添加:
    -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 環境變數,避免每次配置。

第一個 SWT 程式:Hello World

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 不會自動回收原生資源**。必須遵守:

  1. 誰建立,誰釋放:Color, Font, Image, GC, Printer, Display 等實作 Resource 介面的物件,用完必須呼叫 dispose()。
  2. 父容器銷毀會遞歸銷毀子控件:shell.dispose() 會觸發所有子控件 dispose(),但**共享資源 (Color/Font/Image) 不會被自動釋放**,需由建立者管理。
  3. JFace 資源管理器:LocalResourceManager / DeviceResourceManager 可自動追蹤並釋放資源,RCP 開發強烈建議使用。

進階學習路徑

  1. JFace:SWT 之上的 UI 框架,提供 Viewers (TableViewer/TreeViewer/ComboViewer) 綁定模型、資料綁定、動作/貢獻項、對話框/嚮導、資源管理器 — **RCP 開發必學**。
  2. Eclipse RCP (Rich Client Platform):基於 OSGi 的模組化桌面應用平台,Workbench (透視圖/視圖/編輯器)、擴展點/擴展、偏好設定、幫助系統、自動更新 (p2)。
  3. Data Binding:雙向資料綁定 (UI ↔ Model),驗證、轉換、驗證狀態傳播。
  4. SWTBot / Jubula:UI 自動化測試框架。

結語

SWT 以「原生」為榮,以「資源手動管理」為戒。掌握 Display 事件迴圈、GridLayout 佈局、資源釋放鐵律、JFace Viewers 模式,即可開發高效能、原生外觀的桌面應用。若目標是 Eclipse 插件/RCP 開發,SWT/JFace 是不可繞過的核心功力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved