我读到你不应该在主线程上.show()
帧以避免死锁,这是一个真正的问题。这应该总是避免吗?此外,一旦您显示任何类型的对话框,例如ProgressMonitorInputStream,即使它已关闭并完成,您仍然必须调用System.exit()
来终止应用程序吗? JDialog怎么样?
答案 0 :(得分:6)
我读到你不应该在主线程上使用.show()帧来避免死锁
它停止阅读那本书/帖子/网页。
解决你的第一点:
我想你可能会错过一些观点。
所有UI代码必须在Event Dispatching Thread(EDT)上执行,这包括屏幕上甚至不在屏幕上的UI组件。
你应该不在EDT上执行耗时的任务,因为这会阻止屏幕更新并使你的应用程序无响应,这些用户真的非常讨厌。
耗时的任务应该在自己的线程中执行(这实际上是一个完全不同的主题),使用SwingWorker或SwingUtilities.invokeLater / andWait等内容来重新同步/更新UI
public class BackgroundTask implements Runnable { // extends Thread {
public void run() {
for (int i = 0; i < noQueries; i++) {
runDatabaseQuery(i);
updateProgress(i);
}
}
private void updateProgress(final int queryNo) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
statusLabel.setText("Query: " + queryNo);
}
});
}
}
解决你的第二点:
是和否。 JFrame
类提供defaultCloseOperation,您可以使用它来终止主应用程序。
但是,如果您显示的只是JDialog
或其他类型的窗口,是的,您需要调用System.exit
才能终止JVM。
如果支持,您可以使用WindowListener.windowClosed事件来监控窗口何时关闭并采取相应措施。
答案 1 :(得分:2)
关闭应用程序中的主JFrame
应该让你调用System.exit();
但是,您可以使主JFrame
关闭应用程序本身:
setDefaultCloseOperation(EXIT_ON_CLOSE);
模态JDialog
阻止了调用它们的线程。但是,这有优点。当您依靠JDialog
中用户的答案执行操作时,您必须等待。