繁体   English   中英

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

[英]On closing the main Swing window, the other thread on the EventQueue gets not created

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

平台:

  • 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();
                     }                      
                 }
             }
         });    
     }

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

此方法( 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上创建了其他线程。

线程为何停止?

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

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

它来了:

setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);   

现在,当我单击GUI主窗口的关闭按钮时,关闭不会导致关闭该窗口。 这意味着我不再需要CountDownLatch类,该类可以停止关闭主窗口(并等待用户在另一个类上递减计数 )。

最后,我以自己喜欢的方式使应用程序正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM