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
相关产品推荐
相关产品推荐

