处理Java RCP应用程序中工作台窗口的关闭

我正在编写Eclipse RCP,我想询问用户是否在应用程序关闭时备份数据库。 从文件>退出菜单执行此操作非常简单,因为我定义了一个命令退出:

public class ExitCommand extends AbstractHandler implements IHandler { @Override public Object execute(ExecutionEvent event) throws ExecutionException { final IWorkbench workbench = PlatformUI.getWorkbench(); if (workbench == null) return null; // Ask whether the user wants to back up the information Shell shell = new Shell(workbench.getDisplay()); MessageBox messageBox = new MessageBox(shell, SWT.ICON_QUESTION | SWT.YES | SWT.NO); messageBox.setMessage("You are leaving CatSysPD. Do you want to make a backup of the DataBase? (recommended)"); messageBox.setText("On Exit Backup"); int response = messageBox.open(); if (response == SWT.YES){ new BackupDataBaseAction(shell); } final Display display = workbench.getDisplay(); display.syncExec(new Runnable() { public void run() { if (!display.isDisposed()) workbench.close(); } }); return null; }} 

然后我将它链接到一个名为Exit的菜单项,这项工作正确。 但是,用户也可以通过按“关闭窗口”按钮关闭应用程序。 有没有办法捕捉这个事件?

我在前一个主题( 见这里 )中找到了一个使用shutdownHook的建议。 但是,我想要执行的线程必须打开一个对话框,据我所知,这不能由外部线程完成。

谢谢!

编辑我在这里添加我正在使用的shutdownHook的代码。 在Application类中:public class Application实现IApplication {

 final double NIDAQmxPortingVersionDependency = 1.001; public final static String PLUGIN_ID = "CatsysPD"; private static Logger logger = Logger.getLogger(Application.class .toString()); /* * (non-Javadoc) * * @see org.eclipse.equinox.app.IApplication#start(org.eclipse.equinox.app. * IApplicationContext) */ public Object start(IApplicationContext context) { logger.info("Starting the application"); Display display = PlatformUI.createDisplay(); systemCheck(display); initializeApplication(display); try { int returnCode = PlatformUI.createAndRunWorkbench(display, new ApplicationWorkbenchAdvisor()); if (returnCode == PlatformUI.RETURN_RESTART) { return IApplication.EXIT_RESTART; } BackupOnExitHook backupOnExitHook = new BackupOnExitHook(PlatformUI.getWorkbench().getDisplay()); Runtime.getRuntime().addShutdownHook(backupOnExitHook); return IApplication.EXIT_OK; } finally { display.dispose(); } } private void systemCheck(Display display) {...} public void stop() {...} public void initializeApplication(Display display) {...} private class BackupOnExitHook extends Thread { private Display display; public BackupOnExitHook(Display display){ this.display = display; } @Override public void run(){ display.syncExec(new Runnable(){ @Override public void run() { MessageBox messageBox = new MessageBox(new Shell(display), SWT.ICON_QUESTION | SWT.YES | SWT.NO); messageBox.setMessage("You are leaving CatSysPD. Do you want to make a backup of the DataBase? (recommended)"); messageBox.setText("On Exit Backup"); int response = messageBox.open(); if (response == SWT.YES){ new BackupDataBaseAction(new Shell(display)); } }}); } } } 

我尝试运行它时得到的错误是:

 Exception in thread "Thread-5" org.eclipse.swt.SWTException: Device is disposed at org.eclipse.swt.SWT.error(SWT.java:4083) at org.eclipse.swt.SWT.error(SWT.java:3998) at org.eclipse.swt.SWT.error(SWT.java:3969) at org.eclipse.swt.widgets.Display.error(Display.java:1249) at org.eclipse.swt.widgets.Display.syncExec(Display.java:4581) at dk.catsys.pd.Application$BackupOnExitHook.run(Application.java:128) 

再次感谢。