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

Java 桌面開發新選擇:SWT 與 JFace 核心技術深度解析

     編輯:Java 相關知識

SWT 為何而生?

Java 桌面應用長期面臨「界面異質、性能低下、啟動緩慢」三大痛點。SWT (Standard Widget Toolkit) 由 Eclipse 團隊開發,最大化調用操作系統原生圖形 API(通過 JNI),僅在 OS 不提供組件時自行模擬。結果:原生外觀、高性能、跨平台,幾乎無法辨別是 Java 程序。

SWT 穩定性雙重保障

  1. 性能穩定:依賴 OS 原生組件穩定性。
  2. API 穩定:類/方法結構極少變動,升級只需替換 JAR。

第一個 SWT 程序:空窗口


import org.eclipse.swt.widgets.*;
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();
    }
}

編譯:javac -cp swt.jar OpenShell.java
運行:java -Djava.library.path=/path/to/native/libs -cp swt.jar:. OpenShell

SWT 核心包結構

  • org.eclipse.swt.widgets:Button、Combo、Text、Label、Table、**Shell**、**Composite** 等核心組件。
  • org.eclipse.swt.layout:FillLayout、RowLayout、GridLayout(最強大)、StackLayout 等,配合 LayoutData 使用。
  • org.eclipse.swt.custom:CLabel(圖文混排)、StyledText(富文本)、TableEditor 等增強組件。
  • org.eclipse.swt.events:Listener 接口與 Event 類(MouseListener、KeyListener、DisposeListener 等),採用觀察者模式。
  • org.eclipse.swt.graphics:Image、Font、Color、GC(繪圖上下文)。
  • org.eclipse.swt.ole.win32:Windows 下 OLE/ActiveX 嵌入(可內嵌 IE、Word、Excel)。

進階示例:表單佈局與資源管理


private void initShell(Shell shell) {
    GridLayout gl = new GridLayout(); shell.setLayout(gl);
    Composite panel = new Composite(shell, SWT.NONE);
    panel.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH));
    GridLayout gpl = new GridLayout(); panel.setLayout(gpl);
    
    Color bkColor = new Color(Display.getCurrent(), 200, 0, 200);
    panel.setBackground(bkColor);
    
    Text text = new Text(panel, SWT.MULTI | SWT.WRAP);
    text.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH));
    
    Button btn = new Button(panel, SWT.PUSH); btn.setText("Push");
    btn.addMouseListener(new MouseAdapter() {
        public void mouseDown(MouseEvent e) { text.setText("Hello SWT"); }
    });
    
    shell.addDisposeListener(e -> bkColor.dispose()); // 釋放系統資源
}

系統資源管理:兩條黃金法則

  1. 誰佔用,誰釋放:調用構造函數創建資源(Color、Font、Image 等),必須在適當時機調用 dispose()。JVM GC 不可控,不可依賴。
  2. 父銷毀,子隨亡:調用父組件 dispose() 會遞歸銷毀所有子組件及其資源。

線程模型:單一 UI 線程

非 UI 線程直接訪問組件拋出 SWTException。跨線程更新 UI 必須用 Display 方法:


// 異步執行(立即返回)
display.asyncExec(() -> { new Button(panel, SWT.PUSH).setText("Push"); });
// 同步執行(等待完成)
display.syncExec(() -> { /* 耗時 UI 操作 */ });

JFace:SWT 之上的高級封裝

如 MFC 之於 SDK。提供:

  • 對話框:MessageDialog.openWarning(parent, "Warning", "Msg");(SWT 需 30+ 行)。
  • 偏好設置頁面、Tree/Table 的 Model-View 分離(Viewer + ContentProvider + LabelProvider)。
  • 豐富文本處理框架 (org.eclipse.jface.text)。

開發建議:先找 JFace,再用 SWT。

發布為原生 EXE

解決 JRE 依賴與源碼暴露問題,工具如 Excelsior JET、Launch4j 可將類編譯為原生可執行文件。

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