0

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

平台:

  • Eclipse IDE
  • 视窗 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.

线程怎么会停止?

4

1 回答 1

0

Java 小组为我facebook.com指明了正确的方向。解决方案是这样的:

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

它来了:

setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);   

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

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

于 2017-07-15T23:52:04.540 回答