我编写 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
.
线程怎么会停止?