You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Eclipse RCP:新建编辑器向导向编辑器传参问题咨询

如何在Eclipse RCP 3.X中向编辑器传递向导定义的初始值

我之前也碰到过一模一样的问题,Eclipse RCP的编辑器生命周期是由Workbench管理的,确实不能直接实例化EditorPart,不过传递初始值的核心思路是利用自定义IEditorInput——这是编辑器获取数据的入口,我们可以把向导里的初始值打包到这个输入对象里,再交给Workbench去打开编辑器。

下面是具体的实现步骤,一步步来:

1. 创建自定义IEditorInput实现类

首先要写一个实现IEditorInput的类,用来存储向导里收集到的初始值。这个类必须实现Serializable,因为Eclipse会对EditorInput进行序列化存储。

示例代码:

import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IPersistableElement;
import java.io.Serializable;

public class CustomEditorInput implements IEditorInput, Serializable {
    // 存储向导里的初始值,根据你的需求定义字段
    private String initialContent;
    private String customTitle;

    // 构造方法,传入向导收集的初始值
    public CustomEditorInput(String initialContent, String customTitle) {
        this.initialContent = initialContent;
        this.customTitle = customTitle;
    }

    // 实现IEditorInput的必要方法
    @Override
    public boolean exists() {
        // 如果编辑器不需要关联真实文件,返回false即可
        return false;
    }

    @Override
    public ImageDescriptor getImageDescriptor() {
        // 返回编辑器图标,这里用平台默认缺失图标,可替换成你的自定义图标
        return ImageDescriptor.getMissingImageDescriptor();
    }

    @Override
    public String getName() {
        // 编辑器标签页的名称,直接用向导里的自定义标题
        return customTitle;
    }

    @Override
    public IPersistableElement getPersistable() {
        // 不需要持久化的话返回null
        return null;
    }

    @Override
    public String getToolTipText() {
        return "自定义编辑器 - " + customTitle;
    }

    @Override
    public <T> T getAdapter(Class<T> adapter) {
        return null;
    }

    // 添加getter方法,供编辑器获取初始值
    public String getInitialContent() {
        return initialContent;
    }

    public String getCustomTitle() {
        return customTitle;
    }

    // 重写equals和hashCode,确保Eclipse能正确识别相同的EditorInput
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        CustomEditorInput that = (CustomEditorInput) obj;
        return initialContent.equals(that.initialContent) && customTitle.equals(that.customTitle);
    }

    @Override
    public int hashCode() {
        return initialContent.hashCode() + customTitle.hashCode();
    }
}

2. 在新建向导中传递初始值到EditorInput

在你的新建编辑器向导的performFinish()方法里,先收集用户输入的初始值,然后创建自定义的CustomEditorInput实例,最后调用IWorkbenchPage.openEditor()打开编辑器,传入这个自定义输入和你的编辑器ID。

示例代码:

import org.eclipse.jface.wizard.Wizard;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;

public class NewCustomEditorWizard extends Wizard {
    // 向导页面,用来收集用户输入
    private NewCustomEditorWizardPage page;

    @Override
    public void addPages() {
        page = new NewCustomEditorWizardPage();
        addPage(page);
    }

    @Override
    public boolean performFinish() {
        // 从向导页面获取用户输入的初始值
        String initialContent = page.getInitialContent();
        String customTitle = page.getEditorTitle();

        // 创建自定义EditorInput,把初始值传进去
        CustomEditorInput input = new CustomEditorInput(initialContent, customTitle);

        try {
            // 获取当前Workbench页面,打开编辑器
            IWorkbenchPage workbenchPage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
            workbenchPage.openEditor(input, "com.your.plugin.id.yourEditorId");
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}

3. 在EditorPart中获取初始值并初始化

在你的自定义EditorPart子类里,重写init()方法,把传入的IEditorInput强转为你自定义的类型,然后调用getter方法获取初始值,用来初始化编辑器内容。

示例代码:

import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.part.EditorPart;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.SWT;

public class CustomEditor extends EditorPart {
    public static final String ID = "com.your.plugin.id.yourEditorId";
    private Text textWidget;

    @Override
    public void init(IEditorSite site, IEditorInput input) {
        setSite(site);
        setInput(input);

        // 强转为自定义EditorInput,设置编辑器标题
        if (input instanceof CustomEditorInput) {
            CustomEditorInput customInput = (CustomEditorInput) input;
            setPartName(customInput.getCustomTitle());
        }
    }

    @Override
    public void createPartControl(org.eclipse.swt.widgets.Composite parent) {
        parent.setLayout(new FillLayout());
        textWidget = new Text(parent, SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);

        // 从CustomEditorInput获取初始值并设置到文本框
        CustomEditorInput input = (CustomEditorInput) getEditorInput();
        textWidget.setText(input.getInitialContent());
    }

    @Override
    public void setFocus() {
        textWidget.setFocus();
    }

    // 实现编辑器的保存相关方法
    @Override
    public void doSave(org.eclipse.core.runtime.IProgressMonitor monitor) {
        // 自定义保存逻辑
    }

    @Override
    public void doSaveAs() {
        // 自定义另存为逻辑
    }

    @Override
    public boolean isDirty() {
        return false;
    }

    @Override
    public boolean isSaveAsAllowed() {
        return true;
    }
}

关键注意点

  • 自定义IEditorInput必须实现Serializable,否则Eclipse在序列化时会抛出异常。
  • 一定要重写equals()和hashCode(),不然Eclipse可能会重复打开同一个编辑器实例,或者无法正确识别已打开的编辑器。
  • 如果你的编辑器需要关联真实文件,exists()方法可以返回true,并在getPersistable()里实现持久化逻辑;如果只是临时编辑器(不需要保存到文件),返回false和null即可。

内容的提问来源于stack exchange,提问作者781227

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:08:21