基于Neon的E3/E4兼容应用:编程调整EditorPart编辑器布局
嘿,这个问题我之前在做Eclipse兼容应用的时候碰到过!在Neon的E3/E4混合环境下,要把标签页里的两个EditorPart改成并排布局,其实有两种靠谱的方式,看你更偏向E3的传统做法还是E4的模型化操作:
方法一:用E3原生内部API(简单直接)
这种方式利用Eclipse工作台内部的EditorSashContainer类,它负责管理编辑器区域的布局,操作起来很直接:
// 在第一个EditorPart的操作方法里(比如按钮点击事件) public void splitEditorsHorizontally() { IWorkbenchPage page = getSite().getPage(); // 找到第二个编辑器实例(你可以用它的Input来查找,或者保存打开时的引用) IEditorPart secondEditor = page.findEditor(yourSecondEditorInput); if (secondEditor != null) { try { // 获取编辑器区域的容器 EditorSashContainer container = (EditorSashContainer) page.getEditorPresentation(); // 水平并排(左右布局),如果要上下就换成SWT.VERTICAL container.split(this, secondEditor, SWT.HORIZONTAL); } catch (ClassCastException e) { // 极端情况:EditorPresentation不是预期的容器,做个容错处理 e.printStackTrace(); } } }
注意:EditorSashContainer是Eclipse的内部类,虽然在Neon版本里稳定,但如果未来要升级到更高版本,可能需要留意API变化——不过对于Neon的E3/E4兼容场景,这个方法绝对好使。
方法二:用E4模型API(更优雅,适合未来迁移)
如果你的应用已经在往纯E4方向靠拢,用E4的模型层来操作布局会更规范,不需要依赖内部类:
public void splitWithE4Model() { IWorkbenchPage page = getSite().getPage(); IEditorPart secondEditor = page.findEditor(yourSecondEditorInput); if (secondEditor != null) { // 获取E4的核心服务 MPartService partService = PlatformUI.getWorkbench().getService(MPartService.class); EModelService modelService = PlatformUI.getWorkbench().getService(EModelService.class); // 找到两个编辑器对应的E4 Part实例 MPart firstPart = partService.findPart(getSite().getId()); MPart secondPart = partService.findPart(secondEditor.getSite().getId()); // 获取原来的标签页容器(PartStack) MPartStack originalStack = (MPartStack) firstPart.getParent(); // 创建一个新的SashForm(拆分容器),设置水平方向 MSashForm sashForm = ModelFactory.eINSTANCE.createMSashForm(); sashForm.setOrientation(SWT.HORIZONTAL); // 为每个编辑器创建单独的PartStack MPartStack stack1 = ModelFactory.eINSTANCE.createMPartStack(); MPartStack stack2 = ModelFactory.eINSTANCE.createMPartStack(); // 把编辑器Part加入各自的Stack stack1.getChildren().add(firstPart); stack2.getChildren().add(secondPart); // 将两个Stack加入SashForm,替换原来的Stack内容 sashForm.getChildren().add(stack1); sashForm.getChildren().add(stack2); originalStack.getChildren().clear(); originalStack.getChildren().add(sashForm); // 刷新模型,让布局生效 modelService.refresh(originalStack); } }
关键注意事项
- 一定要确保两个编辑器都已经成功打开,
findEditor能正确获取到实例(最好在打开第二个编辑器时就保存它的引用,避免查找出错)。 - 拆分方向:
SWT.HORIZONTAL是左右并排,SWT.VERTICAL是上下堆叠,根据你的需求调整。 - 如果你是在E3纯模式下运行,方法一的兼容性更好;如果是E4兼容模式,方法二更推荐。
内容的提问来源于stack exchange,提问作者s.d
相关产品推荐
相关产品推荐

