如何处理通过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
相关产品推荐
相关产品推荐

