在 Eclipse RCP 應用開發中,富文本編輯是常見且棘手的需求。SWT/JFace 原生 Text 控件功能極其有限,無法滿足公文正文等複雜排版場景。本文分享兩種經實戰驗證的整合方案。
SWT Composite → SWT_AWT Bridge → AWT Frame → EKIT Editor
將 EKIT 封裝為可複用的 SWT 控件,透過 SWT_AWT.new_Frame() 實現 SWT 與 AWT 組件共存。
| 問題 | 影響 | 解決方案 |
|---|---|---|
| 不支援 OLE 拖放貼上 | Word/Excel 內容貼上會遺失格式 | 自行實現 TransferHandler,解析 RTF/HTML 片段 |
| AWT/SWT 事件循環衝突 | 偶發焦點丟失、鍵盤快捷鍵失效 | 統一使用 Display.asyncExec() 處理跨線程 UI 操作 |
| 列印/匯出 PDF 支援弱 | 需額外引入 iText 或 Apache PDFBox | 整合 Flying Saucer (xhtmlrenderer) 實現 CSS 2.1 列印排版 |
org.eclipse.swt.browser.Browser(WebKit/Edge/WebView2 後端)Browser.evaluate() + JavascriptFunction 雙向呼叫// SWT 端
Browser browser = new Browser(parent, SWT.NONE);
browser.setUrl("platform:/plugin/com.example.editor/editor.html");
// 註冊 Java → JS 呼叫
browser.setJavascriptEnabled(true);
// 註冊 JS → Java 回調
browser.addFunction("saveContent", new Function() {
@Override
public Object execute(Function func, Object[] args) {
String html = (String) args[0];
// 持久化至資料庫或檔案
documentService.saveContent(html);
return null;
}
});
// editor.html 關鍵 JS
const editor = ClassicEditor.create(document.querySelector('#editor'))
.then(editor => {
window.editorInstance = editor;
});
function getContent() {
return window.editorInstance.getData();
}
// 定時或按需推送給 Java
setInterval(() => {
if (window.saveContent) window.saveContent(getContent());
}, 30000);
platform:/plugin/ 協議載入evaluate() 注入風險
實務上,我們在 OA 系統採用「雙軌制」:公文正文用 CKEditor 保證貼上體驗;簡易備註欄用輕量級 EKIT 控件減少資源佔用。根據業務場景靈活組合,而非單一技術強推全場景。