【问题标题】:press x on top right corner Event for eclipse-rcp在 eclipse-rcp 的右上角按 x 事件
【发布时间】:2013-05-07 04:23:35
【问题描述】:

我正在开发一个 eclipse-rcp 项目。我想实现一个 EventListener (或类似的东西),当用户按下窗口右上角的 x 时,它会被调用。 知道在哪里/如何实现吗?

谢谢大家!

【问题讨论】:

    标签: java eclipse-rcp rcp


    【解决方案1】:

    有不同的方法可以做到这一点,具体取决于您的需要。如果您想在某些情况下禁止关闭主 shell,您可能需要在 WorkbenchWindowAdvisor 中使用 preWindowShellClose() 方法。 http://help.eclipse.org/helios/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Freference%2Fapi%2Forg%2Feclipse%2Fui%2Fapplication%2FWorkbenchWindowAdvisor.html.

    如果你只想在主窗口关闭时执行一些操作,你可以像这样添加一个shutdownHook(另见这个线程:What is the correct way to add a Shutdown Hook for an Eclipse RCP application?):

        public class IPEApplication implements IApplication {
          public Object start(IApplicationContext context) throws Exception {
            final Display display = PlatformUI.createDisplay();
            Runtime.getRuntime().addShutdownHook(new ShutdownHook());  }
            // start workbench...
          }
        }
    
    private class ShutdownHook extends Thread {
      @Override
      public void run() {
        try {
          final IWorkbench workbench = PlatformUI.getWorkbench();
          final Display display = PlatformUI.getWorkbench()
                                            .getDisplay();
          if (workbench != null && !workbench.isClosing()) {
            display.syncExec(new Runnable() {
              public void run() {
                IWorkbenchWindow [] workbenchWindows = 
                                workbench.getWorkbenchWindows();
                for(int i = 0;i < workbenchWindows.length;i++) {
                  IWorkbenchWindow workbenchWindow =
                                            workbenchWindows[i];
                  if (workbenchWindow == null) {
                    // SIGTERM shutdown code must access
                    // workbench using UI thread!!
                  } else {
    
    
            IWorkbenchPage[] pages = workbenchWindow
                                           .getPages();
                for (int j = 0; j < pages.length; j++) {
                  IEditorPart[] dirtyEditors = pages[j]
                                           .getDirtyEditors();
                  for (int k = 0; k < dirtyEditors.length; k++) {
                    dirtyEditors[k]
                             .doSave(new NullProgressMonitor());
                  }
                }
              }
            }
          }
        });
        display.syncExec(new Runnable() {
          public void run() {
            workbench.close();
          }
        });
      }
    } catch (IllegalStateException e) {
      // ignore
    }
    
      }
    }
    

    希望这会有所帮助。

    【讨论】:

    • 感谢您的回答。我认为 preWindowShellClose() 应该对我有用。但是我在我的项目中找不到 WorkbenchWindowAdvisor 对象。在哪里可以找到/创建它的任何线索?
    • 尝试搜索扩展 WorkbenchWindowAdvisor 的类。当您创建应用程序时,在实现 IPlatformRunnable 的类中,您传递 WorkbenchAdvisor 的一个实例(类似于 PlatformUI.createAndRunWorkbench(display, new ApplicationWorkbenchAdvisor());)在 WorkbenchAdvisor 中,您应该覆盖 createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer 配置器) 方法创建您正在寻找的 WorkbenchWindowAdwisor 的实例。如果这对您有所帮助,请接受主要答案。
    猜你喜欢
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多