Eclipse e4重写关闭按钮操作:点击[X]时最小化RCP应用
实现Eclipse RCP窗口关闭按钮最小化而非退出的方案
当然可以实现这个需求!你之前尝试的ExitAddon其实主要负责拦截Workbench级别的退出命令(比如菜单栏的File -> Exit),而窗口右上角的关闭按钮触发的是Shell自身的关闭事件,二者的处理路径不一样,所以单纯修改ExitAddon不会生效。下面是具体的实现步骤:
核心思路
通过给应用的Shell(窗口)添加WindowListener,拦截windowClosing事件,取消默认的关闭行为,转而执行窗口最小化操作。
具体实现
方式一:针对主窗口处理(最常用)
在你的WorkbenchAdvisor子类中,重写postStartup方法,获取主窗口的Shell并添加监听器:
import org.eclipse.swt.events.WindowAdapter; import org.eclipse.swt.events.WindowEvent; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.application.WorkbenchAdvisor; public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor { @Override public void postStartup() { super.postStartup(); // 获取当前激活的主窗口 IWorkbenchWindow mainWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); if (mainWindow != null) { Shell shell = mainWindow.getShell(); // 添加窗口关闭监听器 shell.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { // 取消默认的窗口关闭行为 e.doit = false; // 将窗口最小化 shell.setMinimized(true); } }); } } // 其他已实现的方法... }
方式二:处理所有打开的窗口
如果你的应用支持多窗口,想要让所有窗口的关闭按钮都触发最小化,可以监听Workbench的窗口创建事件,给每个新窗口都添加监听器:
import org.eclipse.swt.events.WindowAdapter; import org.eclipse.swt.events.WindowEvent; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.IWorkbenchWindowListener; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.application.WorkbenchAdvisor; public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor { @Override public void postStartup() { super.postStartup(); // 监听所有窗口的打开事件 PlatformUI.getWorkbench().addWindowListener(new IWorkbenchWindowListener() { @Override public void windowOpened(IWorkbenchWindow window) { Shell shell = window.getShell(); shell.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { e.doit = false; shell.setMinimized(true); } }); } // 实现接口的其他空方法 @Override public void windowClosed(IWorkbenchWindow window) {} @Override public void windowActivated(IWorkbenchWindow window) {} @Override public void windowDeactivated(IWorkbenchWindow window) {} }); } // 其他已实现的方法... }
额外说明
如果你还想保留菜单栏File -> Exit的正常退出功能,不需要修改ExitAddon,因为这个监听器只会拦截窗口关闭按钮的事件,不会影响菜单退出命令的执行。如果需要区分两种退出场景,也可以在ExitAddon中保留正常退出逻辑,二者互不干扰。
内容的提问来源于stack exchange,提问作者Zibus69
相关产品推荐
相关产品推荐

