我编写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
上创建了附加线程。
为什么线程停下来?
为了尽快提供更好的帮助,请发布[MCVE]或[简短,独立,正确的示例](http://www.sscce.org/)。 –
根据你的“例子”,第二帧将无法接受来自用户的任何输入(如果它的事件显示其内容),因为你阻止了EDT - 一个更好的,全面的解决方案,将是简单使用'JDialog',它可以做同样的事情,但不会阻塞EDT – MadProgrammer