“退出”菜单执行此操作很容易,因为我定义了一个命令退出: public class ExitComm-6ren">
gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:22:53 25 4
gpt4 key购买 nike

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

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 的菜单条目,并且这个工作正常。然而,用户也可以通过按下“关闭窗口”按钮来关闭应用程序。有什么办法可以捕捉到这个事件吗?

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

谢谢!

编辑我在此处添加我正在使用的 shutdownHook 的代码。在应用程序类中:公共(public)类 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)

再次感谢。

最佳答案

关于java - 处理 Java RCP 应用程序中工作台窗口的关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7658927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com