我读到你不应该.show()
在主线程上框架以避免死锁,这是一个真正的问题。是否应该始终避免这种情况?此外,一旦您显示任何类型的对话框,例如 ProgressMonitorInputStream,即使它关闭并完成,您还必须调用System.exit()
以终止应用程序吗?JDialog 呢?
2 回答
我读到您不应该在主线程上使用 .show() 帧以避免死锁
它会停止阅读那本书/帖子/网页。
要解决您的第一点:
我认为您可能遗漏了一些要点。
所有 UI 代码都必须在事件调度线程(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事件来监视窗口何时关闭并采取适当的措施。
关闭JFrame
应用程序中的 main 应该让您调用 System.exit(); 但是,您可以让 mainJFrame
关闭应用程序本身:
setDefaultCloseOperation(EXIT_ON_CLOSE);
ModalJDialog
正在阻塞调用它们的线程。不过,这也有好处。当您在执行操作时依赖用户的回答时JDialog
,您必须等待。