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

如何处理通过Part Descriptor动态创建的可关闭MPart的关闭事件?

实现E4 Part关闭时的确认提示功能

既然你用的是E4的MPart和EPartService来创建部件,那实现点击标签页叉号时的确认提示,最直接适配E4架构的方式就是给目标MPart设置一个CloseHandler,拦截关闭请求并弹出确认对话框。

下面是两种场景下的实现代码:

场景1:在Part类的@PostConstruct方法中处理

如果你的逻辑写在Part类内部(也就是被workbench.partdescriptor.session指向的类),可以直接注入MPart并设置处理器:

import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Composite;
import javax.annotation.PostConstruct;
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
import javax.inject.Inject;

public class SessionPart { // 你的Part类,对应partdescriptor的实现类

    @Inject
    private MPart part;

    @PostConstruct
    public void createPartControl(final Composite parent) {
        // --- 这里保留你原来的UI初始化代码 ---
        
        // 设置关闭处理器,拦截关闭操作
        part.setCloseHandler((closeOperation, closeContext) -> {
            // 弹出标准确认对话框
            boolean confirmClose = MessageDialog.openConfirm(
                parent.getShell(),
                "确认关闭",
                "你确定要关闭这个会话部件吗?"
            );
            
            // 返回true允许关闭,返回false则取消关闭
            return confirmClose;
        });
    }

    // 记得实现setFocus方法(如果是ViewPart或类似需要的话)
    // @Override
    // public void setFocus() {
    //     // 给你的某个控件设置焦点
    // }
}

场景2:在创建Part的处理器中直接设置

如果是在你创建Part的那段代码所在的处理器里要加确认逻辑,可以在创建完Part后直接绑定CloseHandler:

import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
import org.eclipse.e4.ui.workbench.modeling.EPartService;
import org.eclipse.e4.ui.workbench.modeling.PartState;
import javax.inject.Inject;

// 假设这是你的处理器类
public class SessionPartCreator {

    @Inject
    private EPartService partService;
    
    @Inject
    private Shell shell; // 注入当前工作台的Shell,用于弹出对话框

    public void createAndShowSessionPart() {
        final MPart part = partService.createPart("workbench.partdescriptor.session"); 
        
        // 给新创建的Part设置关闭确认处理器
        part.setCloseHandler((closeOperation, closeContext) -> {
            boolean confirmClose = MessageDialog.openConfirm(
                shell,
                "确认关闭",
                "你确定要关闭这个会话部件吗?"
            );
            return confirmClose;
        });
        
        partService.showPart(part, PartState.ACTIVATE);
    }
}

核心说明:

  • CloseHandler是E4专门为部件关闭设计的扩展点,完全适配E4的生命周期管理,比传统SWT监听器更可靠
  • 对话框的返回值直接决定是否允许关闭:用户点「确定」返回true,Part正常关闭;点「取消」返回false,关闭操作被终止
  • 两种场景可以根据你的代码结构自由选择,效果是完全一致的

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:21:17