处理 Java RCP 应用程序中工作台窗口的关闭 [英] Handle the closing of the workbench window in Java RCP application

查看:53
本文介绍了处理 Java RCP 应用程序中工作台窗口的关闭的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在编写一个 Eclipse RCP,我想询问用户是否在应用程序关闭时备份数据库.因为我定义了一个命令退出,所以从 File>Exit 菜单执行它很容易:

I'm writing an Eclipse RCP and I want to ask the user whether to backup the database when the application is closed. Doing it from the File>Exit menu was easy as I defined a command exit:

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 的菜单项,这个工作正常.然而,用户也可以通过按下关闭窗口"按钮来关闭应用程序.有没有办法捕捉这个事件?

I then linked this to a menu entry called Exit and this work right. However the user could close the application also by pressing the "close window" button. Is there any way of catching this event?

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

I found a suggestion in a previous topic (see here) using a shutdownHook. However the thread that I want execute has to open a dialog and, as I understand, this cannot be done by an external thread.

谢谢!

编辑我在这里添加了我正在使用的 shutdownHook 的代码.在应用程序类中:公共类应用程序实现 IApplication {

Edit I add here the code for the shutdownHook I'm using. In the Application class: public class Application implements 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));
                }
            }});


    }

}
}

当我尝试运行它时出现的错误是:

The error I get when I try to run it is:

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)

再次感谢.

推荐答案

WorkbenchWIndowAdvisor 的 preWindowShellClose 怎么样?

How about preWindowShellClose from WorkbenchWIndowAdvisor?

http://help.eclipse.org/helios/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/ui/application/WorkbenchWindowAdvisor.html

这篇关于处理 Java RCP 应用程序中工作台窗口的关闭的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆