Java GUI,JFrame和Dialog

rub*_*buc 1 java user-interface swing awt event-dispatch-thread

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

Mad*_*mer 6

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

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

解决你的第一点:

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

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

你应该执行耗时的任务之一EDT,因为这将防止被更新的屏幕,使您的应用程序无响应,哪些用户真的,真的很讨厌.

耗时的任务应该在自己的Thread中执行(这实际上是一个完全不同的主题),使用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);
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

为了解决你的第二点:

是的,不是.本JFrame类提供了一个defaultCloseOperation您可以使用终止的主要应用.

但是,如果您显示的是所有JDialog窗口或其他类型的窗口,是的,您将需要调用System.exit以终止JVM.

在支持的位置,您可以使用WindowListener.windowClosed事件来监视窗口关闭的时间并采取适当的操作.