Java 桌面應用(Swing/SWT)常需嵌入 Web 內容:OAuth 登錄、富文本編輯、報表預覽、舊系統 Web 界面集成。標準 JEditorPane 僅支援 HTML 3.2/CSS 1,現代 Web 技術(HTML5、CSS3、JS 框架)完全無法渲染。SWT Browser 組件通過封裝原生瀏覽器引擎解決此痛點。
| 版本 | Windows | Linux | macOS | 問題 |
|---|---|---|---|---|
| ≤ 3.2 | IE (MSHTML) | Mozilla (GtkMozEmbed) | WebKit (Safari) | 跨平台行為不一致 (如 about:config 僅 Linux 生效) |
| 3.3 M5+ | Mozilla Everywhere (XULRunner) | 統一內核,行為一致 | ||
| 3.3 M6+ | + JavaXPCOM 支援 | Java 直接調用 XPCOM 接口,深度定制 | ||
XULRunner 是 Firefox/Thunderbird 核心運行時,提供 libxul 供嵌入。
Mozilla FTP 選擇版本(如 45.0.2,兼容 SWT 4.6+)。注意:macOS 需 1.8.1.2+ 版支援 JavaXPCOM。
| OS | 全局註冊 | 當前用戶註冊 |
|---|---|---|
| Windows | xulrunner.exe --register-global | xulrunner.exe --register-user |
| Linux | sudo ./xulrunner --register-global | ./xulrunner --register-user |
| macOS | sudo ./xulrunner-bin --register-global | ./xulrunner-bin --register-user |
先執行 --unregister-global/user 移除舊版。
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
// 關鍵:SWT.MOZILLA 指定內核
Browser browser = new Browser(shell, SWT.MOZILLA);
// 可選:同步頁面標題到 Shell
browser.addTitleListener(event -> shell.setText(event.title));
browser.setUrl("https://www.eclipse.org");
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) display.sleep();
}
display.dispose();
MozillaInterfaces.jar)。MozillaInterfaces.jar)。MozillaInterfaces.jar 加入 Java Build Path。// 獲取 XPCOM 入口:nsIWebBrowser
nsIWebBrowser webBrowser = (nsIWebBrowser) browser.getWebBrowser();
if (webBrowser == null) return;
// 獲取 DOM Window -> Document -> Element
nsIDOMWindow domWindow = webBrowser.getContentDOMWindow();
nsIDOMDocument doc = domWindow.getDocument();
nsIDOMElement input = doc.getElementById("input1");
// 修改屬性
input.setAttribute("value", "value after change");
應用場景:表單自動填充、頁面數據注入、自動化測試驗證。
Mozilla mozilla = Mozilla.getInstance();
nsIServiceManager sm = mozilla.getServiceManager();
String contractID = "@mozilla.org/preferences-service;1";
nsIPrefService prefService = (nsIPrefService) sm.getServiceByContractID(contractID, nsIPrefService.NS_IPREFSERVICE_IID);
// 獲取配置樹根分支
nsIPrefBranch branch = prefService.getBranch("");
// 設置 HTTP 代理
branch.setCharPref("network.proxy.http", "127.0.0.1");
branch.setIntPref("network.proxy.http_port", 8080);
branch.setIntPref("network.proxy.type", 1); // 1 = 手動代理
修改即時生效,可在 about:config 驗證。
XUL (XML User Interface Language) 以 XML 定義界面,擁有豐富原生控件 (tree, tabbox, deck 等),配合 CSS 樣式與 JS 邏輯。Browser 可直接加載 .xul 文件 (本地 file:// 或 chrome:// 協議)。
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<window title="Calculator" width="180"
xmlns="https://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<vbox>
<textbox id="display" readonly="true" value="0"/>
<grid>
<rows>
<row><button label="7"/><button label="8"/><button label="9"/><button label="/"/></row>
<row><button label="4"/><button label="5"/><button label="6"/><button label="*"/></row>
<row><button label="1"/><button label="2"/><button label="3"/><button label="-"/></row>
<row><button label="0"/><button label="."/><button label="="/><button label="+"/></row>
</rows>
</grid>
</vbox>
</window>
另存為 calc.xul,browser.setUrl("file:///path/calc.xul") 即可運行。JS 邏輯可內聯或外部引入。
| 優點 | 缺點 |
|---|---|
| 跨平台行為高度一致 (同一 XULRunner 版本) | 需預裝/註冊 XULRunner (部署複雜度↑) |
| 支援現代 Web 標準 (HTML5/CSS3/ES6) | 體積較大 (~50MB XULRunner 運行時) |
| JavaXPCOM 深度定制 (DOM、偏好、網絡、安全) | SWT 僅支援單線程 UI,長耗時 JS 會阻塞 UI |
| 原生 XUL UI 開發效率高 | Mozilla 內核升級快,SWT 版本跟進有延遲 |
SWT Browser + XULRunner 是「零成本、高兼容、可深度定制」的最佳平衡點。掌握 JavaXPCOM 開啟了從「單純顯示網頁」到「雙向融合桌面與 Web 技術」的大門。遷移至 Eclipse RCP 或 SWT 獨立應用均適用。