【问题标题】:Java GUIs, JFrames, and DialogsJava GUI、JFrame 和对话
【发布时间】:2012-08-23 16:37:03
【问题描述】:

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

【问题讨论】:

  • “我读到你不应该.show() frames..” 从1.5开始我们应该setVisible(true)

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


【解决方案1】:

我读到你不应该在主线程上使用 .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 事件来监控您的窗口何时关闭并采取适当的措施。

【讨论】:

  • 为了改进您的答案,您可以添加 SwingUtilities.invokeLater() 和 invokeAndWait() 示例:)
  • @zip 你是一个艰巨的任务大师我的朋友;)
  • 所以我应该在 EDT 上调用 show() 吗?即使它只是显示框架?我可以让框架本身也显示吗?
  • 让框架在其构造函数中显示它自己也安全吗?
  • 只要构造函数是从 EDT 中调用的。您可以使用EventQueue.isDispatchThread 进行检查
【解决方案2】:

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

setDefaultCloseOperation(EXIT_ON_CLOSE);

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

【讨论】:

  • setDefaultCloseOperation(EXIT_ON_CLOSE); 最好使用DISPOSE_ON_CLOSE
  • 是的,这取决于您希望应用程序的行为。如果是主框架,你想在不要求用户保存应用数据的情况下退出应用,你可以使用EXIT。
  • 我就是这样,你可以使用DISPOSE 一个。顺便说一句 - 一个应用程序,应该只有一个框架。
猜你喜欢
  • 2015-02-04
  • 1970-01-01
  • 2023-03-30
  • 2022-06-19
  • 2012-01-16
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多