2

我读到你不应该.show()在主线程上框架以避免死锁,这是一个真正的问题。是否应该始终避免这种情况?此外,一旦您显示任何类型的对话框,例如 ProgressMonitorInputStream,即使它关闭并完成,您还必须调用System.exit()以终止应用程序吗?JDialog 呢?

4

2 回答 2

6

我读到您不应该在主线程上使用 .show() 帧以避免死锁

它会停止阅读那本书/帖子/网页。

要解决您的第一点:

我认为您可能遗漏了一些要点。

所有 UI 代码都必须事件调度线程(EDT) 上执行,这包括尚未出现在屏幕上的 UI 组件。

您不应该EDT 中执行耗时的任务,因为这会阻止屏幕更新并使您的应用程序无响应,这是用户非常非常讨厌的。

耗时的任务应该在自己的线程中执行(这实际上是一个完全不同的主题),使用诸如SwingWorkerSwingUtilities.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事件来监视窗口何时关闭并采取适当的措施。

于 2012-08-29T06:04:55.907 回答
2

关闭JFrame应用程序中的 main 应该让您调用 System.exit(); 但是,您可以让 mainJFrame关闭应用程序本身:

setDefaultCloseOperation(EXIT_ON_CLOSE);

ModalJDialog正在阻塞调用它们的线程。不过,这也有好处。当您在执行操作时依赖用户的回答时JDialog,您必须等待。

于 2012-08-29T06:04:45.823 回答