2017-07-15 40 views
0

我编写Java SE 8桌面应用程序。它有一个Swing UI。关闭主Swing窗口时,不会创建EventQueue上的其他线程

平台:

  • 的Eclipse IDE
  • 的Windows 10操作系统

现在,当我关闭主窗口,通过按 “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(); 
        }      
       } 
      } 
     });  
    } 

所以,我用听者识别窗口关闭事件,以及发生在我询问用户是否要保存该项目(它的数据对DB) 。

这种方法(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(); 
          } 
         } 
        });      
       } 
      } 
     } 
    } 

现在,当我运行应用程序,我没有在运行内部得到()方法(并且没有窗口弹出)。 但是,只有当我只从上面提到的监听器访问这个方法时才会发生这种情况。其中有CountDownLatch,它似乎停止执行新线程。

锁定获得倒计时当用户确认/拒绝保存项目,以便继续执行流程。 但是,我在EventQueue上创建了附加线程。

为什么线程停下来?

+0

为了尽快提供更好的帮助,请发布[MCVE]或[简短,独立,正确的示例](http://www.sscce.org/)。 –

+0

根据你的“例子”,第二帧将无法接受来自用户的任何输入(如果它的事件显示其内容),因为你阻止了EDT - 一个更好的,全面的解决方案,将是简单使用'JDialog',它可以做同样的事情,但不会阻塞EDT – MadProgrammer

回答

0

Java组facebook.com指出我正确的方向。 解决方法如下:

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

这里说到:

setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 

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

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

相关问题