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

SWT/JFace 內嵌瀏覽器元件完整實作指南

     編輯:Java 相關知識

前言

SWT 提供 org.eclipse.swt.browser.Browser 元件,可在 Java 桌面應用中直接嵌入原生瀏覽器引擎(Windows 上為 Edge/WebView2、Linux 上為 WebKitGTK、macOS 上為 WebKit)。本文完整解析一個功能齊全的簡易瀏覽器範例,涵蓋工具列導航、網址列、載入進度條、狀態列、標題同步、彈出視窗處理與動畫載入指示器。

核心架構

主類別 BrowserExample 採用 FormLayout 排版,主要 UI 元件包括:

  • ToolBar:後退、前進、停止、重新整理、前往按鈕
  • Text (網址列):顯示/輸入 URL,支援 Enter 觸發導航
  • Canvas:播放載入動畫(循環顯示多張圖片)
  • Browser:核心瀏覽器元件
  • Label + ProgressBar:狀態文字與載入進度

關鍵功能實作

1. 瀏覽器建立與錯誤處理

try {
    browser = new Browser(parent, SWT.NONE);
    browser.setLayoutData(data);
} catch (SWTError e) {
    Label label = new Label(parent, SWT.CENTER | SWT.WRAP);
    label.setText("瀏覽器元件無法建立,請確認系統已安裝 WebView2 或 WebKitGTK");
    label.setLayoutData(data);
}

若系統缺少瀏覽器引擎,Browser 建構子會拋出 SWTError,此處優雅降級顯示提示訊息。

2. 導航按鈕與網址列聯動

Listener listener = new Listener() {
    public void handleEvent(Event event) {
        ToolItem item = (ToolItem) event.widget;
        if (item == itemBack) browser.back();
        else if (item == itemForward) browser.forward();
        else if (item == itemStop) browser.stop();
        else if (item == itemRefresh) browser.refresh();
        else if (item == itemGo) browser.setUrl(location.getText());
    }
};
location.addListener(SWT.DefaultSelection, e -> browser.setUrl(location.getText()));

3. 載入狀態監聽與進度條更新

browser.addProgressListener(new ProgressListener() {
    public void changed(ProgressEvent event) {
        if (event.total == 0) return;
        int ratio = event.current * 100 / event.total;
        progressBar.setSelection(ratio);
        busy = event.current != event.total;
        if (!busy) { index = 0; canvas.redraw(); }
    }
    public void completed(ProgressEvent event) {
        itemBack.setEnabled(browser.isBackEnabled());
        itemForward.setEnabled(browser.isForwardEnabled());
        progressBar.setSelection(0);
        busy = false; index = 0; canvas.redraw();
    }
});

同步更新工具列按鈕啟用狀態,提供直觀的歷史導航回饋。

4. 動畫載入指示器

display.asyncExec(new Runnable() {
    public void run() {
        if (canvas.isDisposed()) return;
        if (busy) {
            index++; if (index == images.length) index = 0;
            canvas.redraw();
        }
        display.timerExec(150, this);
    }
});

使用 display.timerExec 每 150ms 重繪 Canvas,形成循環動畫;載入完成自動停止。

5. 彈出視窗、標題、狀態文字處理

browser.addTitleListener(e -> shell.setText(e.title + " - 瀏覽器範例"));
browser.addStatusTextListener(e -> status.setText(e.text));

browser.addOpenWindowListener(new OpenWindowListener() {
    public void open(WindowEvent event) {
        Shell shell = new Shell(display);
        shell.setLayout(new FillLayout());
        Browser browser = new Browser(shell, SWT.NONE);
        initialize(display, browser); // 遞迴註冊相同監聽器
        event.browser = browser;
    }
});
browser.addVisibilityWindowListener(new VisibilityWindowListener() {
    public void show(WindowEvent event) {
        Browser b = (Browser) event.widget;
        Shell s = b.getShell();
        if (event.location != null) s.setLocation(event.location);
        if (event.size != null) s.setSize(s.computeSize(event.size.x, event.size.y));
        s.open();
    }
});
browser.addCloseWindowListener(e -> ((Browser)e.widget).getShell().close());

完整支援 window.open()、視窗顯示/隱藏/關閉事件,實現多標籤/彈出視窗行為。

6. 資源釋放

public void dispose() { freeResources(); }
void freeResources() {
    if (images != null) {
        for (Image img : images) if (img != null) img.dispose();
        images = null;
    }
}

完整程式碼結構

程式採用單一類別封裝所有邏輯,main 方法建立 Display、Shell 並實例化 BrowserExample,最後進入標準事件迴圈。圖片資源路徑為 C:/icons/web/go.gif 等,實際部署時建議改用 ImageDescriptor.createFromFile 或 ClassLoader 獲取資源。

常見問題與注意事項

  1. 瀏覽器引擎相依性: Windows 需 WebView2 Runtime,Linux 需 WebKitGTK 4.0+,macOS 內建 WebKit。
  2. 執行緒安全: 所有 UI 操作必須在 UI 執行緒;範例中使用 display.asyncExec 確保安全。
  3. 記憶體管理: Browser 內部持有原生資源,視窗關閉時務必呼叫 dispose()。
  4. 安全性: 載入外部網頁時注意 XSS、混合內容等風險,生產環境建議啟用 CSP 與同源策略。

總結

本範例展示了 SWT Browser 元件的完整應用:從基本導航、進度監控、動畫指示,到彈出視窗生命週期管理。開發者可在此基礎上擴充書籤、歷史記錄、開發者工具整合等進階功能,快速構建桌面端網頁檢視或混合應用。

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