关闭主Swing窗口时,不会创建EventQueue上的另一个线程

时间:2017-07-15 20:40:04

标签: java multithreading swing countdownlatch eventqueue

我编写Java SE 8桌面应用程序。它有一个Swing UI。

平台:

  • Eclipse IDE
  • Windows 10 OS

现在当我关闭主窗口时,按下右上角的“X”,我有一个听众来听这样的事件。

听众就在这里:

 private void listenerForClosingResources(){
         this.addWindowListener(new WindowAdapter() {
             @Override
             public void windowClosing(WindowEvent e) {
                 if(e.getID() == WindowEvent.WINDOW_CLOSING){
                     CountDownLatch continueOn = new CountDownLatch(1);
                     saveUnsavedTmpProject(continueOn);

                     try {
                         continueOn.await();
                     }
                     catch(InterruptedException ee) {
                         ee.printStackTrace();
                     }                      
                 }
             }
         });    
     }

因此,我使用侦听器来识别窗口关闭事件,当发生这种情况时,我会询问用户是否保存项目(它是数据库中的数据)。

此方法(saveUnsavedTmpProject(continueOn);)指向另一个窗口,该窗口应该采用保存项目的名称。

现在CountDownLatch强制主窗口保持运行,直到用户确认/拒绝将项目保存在另一个面板上。

创建窗口,导致保存项目的另一个类方法就在这里:

public static void getInstance(CountDownLatch continueOn, String openProjectName) {
        if(frame == null) {
            synchronized(SaveAsPane.class) {
                if(frame == null) {
                    carryOn = continueOn;

                    if(!openProjectName.isEmpty()){
                        openProject = openProjectName;
                    }

                    EventQueue.invokeLater(new Runnable() {
                        public void run() {
                            try {
                                frame = new SaveAsPane();
                                frame.setVisible(true);
                                frame.setLocationRelativeTo(MainGUI.getMainGUI());

                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    });                     
                }
            }
        }
    }

现在,当我运行应用程序时,我没有进入 run()方法(并且没有弹出窗口)。 但是只有当我仅从上面提到的侦听器访问此方法时才会发生这种情况。具有CountDownLatch,并且它似乎停止执行新线程。

当用户确认/拒绝保存项目时,锁存器会倒计时,以便继续执行流程。 然而,我在EventQueue上创建了额外的帖子。

线程如何停止?

1 个答案:

答案 0 :(得分:0)

facebook.com上的 Java小组向我指出了正确的方向。 解决方案是:

  • 重新定义关闭按钮(X)在主GUI上的作用。

它来了:

setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);   

现在,当我点击主GUI窗口的关闭按钮时,关闭不会导致关闭窗口。这意味着我不再需要CountDownLatch类,这会阻止主窗口关闭(并等待用户倒计时在另一个类上)。

最后,我让应用程序以我喜欢的方式工作。