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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:17:11