Java GUI,JFrame和Dialog

时间:2012-08-29 05:51:39

标签: java swing user-interface awt event-dispatch-thread

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

2 个答案:

答案 0 :(得分:6)

  

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

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

解决你的第一点:

我想你可能会错过一些观点。

所有UI代码必须Event Dispatching Thread(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事件来监控窗口何时关闭并采取相应措施。

答案 1 :(得分:2)

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

setDefaultCloseOperation(EXIT_ON_CLOSE);

模态JDialog阻止了调用它们的线程。但是,这有优点。当您依靠JDialog中用户的答案执行操作时,您必须等待。