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

將 Swing 編輯器無縫集成到 Eclipse 平台的完整指南

     編輯:Java 相關知識

前言:為什麼需要集成 Swing 到 Eclipse?

Eclipse 平台基於 SWT(Standard Widget Toolkit)構建,而大量成熟的開發工具使用 Swing 構建 UI。完全重寫 Swing 應用為 SWT 成本極高。本文介紹一種不依賴內部 API、遵循插件規範的集成方案,實現 Swing 編輯器與 Eclipse Workbench 的雙向協作。

核心架構:單例工具類作為通信橋樑

Singleton 工具類架構圖

關鍵設計決策:避免 Swing 與 SWT 組件直接嵌入,而是讓它們擁有獨立的視窗框架,由插件單例類協調數據交換與事件傳遞。

步驟一:創建插件專案

  1. 新建 Plug-in Project:org.eclipse.jumpstart.editorintegration
  2. 勾選 "Create plug-in using a template wizard" → "Add default instance access"
  3. 自動生成 EditorintegrationPlugin 類(繼承 AbstractUIPlugin)

步驟二:配置依賴庫

在 Java Build Path 添加:

  • org.eclipse.core.resources/resources.jar
  • org.eclipse.jdt.core/jdtcore.jar
  • org.eclipse.jdt.ui/jdt.jar
  • org.eclipse.swt/swt.jar
  • org.eclipse.ui/workbench.jar

步驟三:註冊編輯器擴展點

<extension point="org.eclipse.ui.editors">
  <editor
    name="Ed - Swing Editor"
    default="true"
    icon="icons/thirdparty.gif"
    filenames="ThirdParty.java"
    launcher="org.eclipse.jumpstart.editorintegration.EdLauncher"
    id="org.eclipse.jumpstart.editorintegration.ed">
  </editor>
</extension>

注意:必須包含 icons/thirdparty.gif,否則 "Open With" 選單顯示異常。

步驟四:實現編輯器啟動器

package org.eclipse.jumpstart.editorintegration;

import org.eclipse.core.resources.IFile;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.ui.IEditorLauncher;

public class EdLauncher implements IEditorLauncher {
    @Override
    public void open(IFile file) throws Exception {
        ICompilationUnit cu = (ICompilationUnit) JavaCore.create(file);
        if (cu != null) {
            // 將源碼加載到 Swing 編輯器
            EditorintegrationPlugin.getDefault().getEd().getEditorPane().setText(cu.getSource());
            EditorintegrationPlugin.getDefault().getEd().show();
            
            // 記錄項目與包信息,供保存時使用
            EditorintegrationPlugin.getDefault().getEd().setProjectName(file.getProject().getName());
            EditorintegrationPlugin.getDefault().getEd().setPackageName(getPackagePath(file));
        }
    }
    
    private String getPackagePath(IFile file) {
        // 實現邏輯:從 IFile 解析包路徑
        return "";
    }
}

步驟五:實現雙向同步

正向同步:Swing → Workbench

在 Swing 編輯器的 "Save" 按鈕添加事件監聽器,調用工具類方法:

public void saveButtonPressed() {
    try {
        IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
        IProject project = root.getProject(ed.getProjectName());
        IFolder folder = project.getFolder(ed.getPackageName());
        IPackageFragment pkg = (IPackageFragment) JavaCore.create(folder);
        
        if (pkg != null) {
            ICompilationUnit cu = pkg.getCompilationUnit("ThirdParty.java");
            String source = ed.getEditorPane().getText();
            cu.getBuffer().setContents(source);
            cu.save(null, true);  // 交由平台持久化
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

反向同步:Workbench → Swing

實現 IElementChangedListener 監聽 JDT 元素變更:


public void elementChanged(ElementChangedEvent event) {
    IJavaElementDelta delta = event.getDelta();
    if (delta != null && delta.getElement().getElementName().equalsIgnoreCase("ThirdParty.java")) {
        // 更新 Swing 編輯器面板
        String newSource = ((ICompilationUnit) delta.getElement()).getSource();
        ed.getEditorPane().setText(newSource);
    }
}

非 Java 資源變更可用 IResourceChangeListener。

步驟六:偏好設置頁面集成

在 plugin.xml 添加擴展點:

<extension point="org.eclipse.ui.preferencePages">
  <page
    name="Swing Editor Preference Page"
    class="org.eclipse.jumpstart.editorintegration.EdPreferencePage1"
    id="SwingEditorPreferencePage">
  </page>
</extension>

偏好頁面類繼承 PreferencePage 並實現 IWorkbenchPreferencePage:

protected void performApply() {
    Color newColor = new Color(redSlider.getSelection(), greenSlider.getSelection(), blueSlider.getSelection());
    EditorintegrationPlugin.getDefault().getEd().getContentPane().setBackground(newColor);
}

public boolean performOk() {
    getPreferenceStore().setValue("redValue", redSlider.getSelection());
    getPreferenceStore().setValue("greenValue", greenSlider.getSelection());
    getPreferenceStore().setValue("blueValue", blueSlider.getSelection());
    return true;
}

偏好頁面控制 Swing 編輯器顏色

步驟七:實現 Workbench 感知功能

為 Swing 編輯器添加 "Referenced Projects" 按鈕,點擊彈出 SWT 對話框顯示項目引用:

獲取項目引用信息


private String[] getReferencedProjects(String projectName) {
    try {
        IProject[] refs = ResourcesPlugin.getWorkspace().getRoot()
            .getProject(projectName).getReferencedProjects();
        if (refs.length == 0) return new String[]{"none"};
        
        String[] names = new String[refs.length];
        for (int i = 0; i < refs.length; i++) names[i] = refs[i].getName();
        return names;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

SWT 對話框實現


public class SWTProjectReferenceFrame implements Runnable {
    private Shell shell;
    private Display display;
    private String[] projectNames;

    public SWTProjectReferenceFrame(String[] projects) {
        this.projectNames = projects;
    }

    @Override
    public void run() { open(); }

    public void open() {
        display = new Display();
        shell = new Shell(display);
        shell.setLayout(new GridLayout());
        shell.setText("Projects Referenced - SWT Frame");
        shell.setSize(400, 400);
        createListGroup();
        shell.open();

        // 獨立線程運行事件循環,避免阻塞 Swing 重繪
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                EditorintegrationPlugin.getDefault().getEd().repaint();
                display.sleep();
            }
        }
    }

    private void createListGroup() {
        Group group = new Group(shell, SWT.NONE);
        group.setLayout(new GridLayout());
        group.setLayoutData(new GridData(GridData.FILL_BOTH));
        List list = new List(group, SWT.V_SCROLL | SWT.BORDER);
        list.setItems(projectNames);
        list.setLayoutData(new GridData(GridData.FILL_BOTH));
    }
}

Swing 按鈕啟動 SWT 框架

最佳實踐總結

  1. 漸進式遷移:此方案為過渡方案,長期應逐步以 SWT/JFace 替換 Swing 組件
  2. 線程隔離:SWT 事件循環在獨立線程運行,防止界面凍結
  3. 單一職責:插件類專注於協調,不包含業務邏輯
  4. 標準擴展點:完全使用官方 API,確保版本兼容性

結語

通過單例工具類解耦 Swing 與 SWT,利用 Eclipse 標準擴展點實現編輯器註冊、雙向同步、偏好配置與 Workbench 感知功能,可在不重寫現有代碼的前提下快速集成 Swing 工具。這為遺留系統現代化提供了務實路徑。

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