【问题标题】:Java Swing Progress Monitor for GUI Creation (EDT)用于 GUI 创建 (EDT) 的 Java Swing 进度监视器
【发布时间】:2014-05-08 06:33:52
【问题描述】:


我想在真正复杂的对话开始时使用进度监视器来显示进度!!!

对话框的创建是在事件调度线程中完成的。这可能需要长达 10 秒,具体取决于客户端系统。

然后我希望在前台看到一个进度监视器,它显示每个当前加载部分的状态。与此同时,对话框正在后台建立。

问题是进度监视器总是冻结,直到对话框启动。当对话启动完成时,progressmonitor 会做出反应并显示当前状态。

我尝试了很多在论坛上阅读的内容,但如果没有两个不同的主题,它就无法正常工作。这是让进度监视器和对话框创建都在 EDT 中运行的示例。

final CVProgressMonitorDialog progressMonitor = new CVProgressMonitorDialog();
progressMonitor.startPollingThread();
SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
         try {
                startComplexDialog();
            }
            finally {
                close(progressMonitor);
            }
        }
    });

CVProgressMonitorDialog主要是swing自带的ProgressMonitor。

解决方案是让对话框的创建在另一个线程中运行。

final CVProgressMonitorDialog progressMonitor = new CVProgressMonitorDialog();
progressMonitor.startPollingThread();
    new Thread() {

        @Override
        public void run() {
            try {
                startComplexDialog();
            }
            finally {
                close(progressMonitor);
            }
        }
    }.start();

由于 swing 不是线程安全的,使用第二种解决方案是否会导致潜在的麻烦?
是否有通用的解决方案来监控 EDT 内的任务?

【问题讨论】:

  • 是的,第二种解决方案不安全。解决此问题的一种方法是将对话的初始化拆分为不同的任务,并将它们作为不同的块启动到 EDT,并在它们之间适当地更新进度监视器(也在 EDT 中)。如果您正在读取数据或创建内部非 Swing 相关结构,还要检查是否可以将一些工作移到 EDT 之外。

标签: java swing progressdialog swingworker event-dispatch-thread


【解决方案1】:

你说:

对话框的创建是在事件调度线程中完成的。这可能需要长达 10 秒,具体取决于客户端系统。

还有你的问题。您需要在后台线程中运行任何非 Swing 长时间运行的代码,例如由 SwingWorker 提供的代码,但要注意确保任何更改可见 Swing 组件状态的代码都在事件线程上完成。

然后我希望在前台看到一个进度监视器,它显示每个当前加载部分的状态。与此同时,对话框正在后台建立。

再次,在 SwingWorker 派生的后台线程中执行您的工作,在创建过程中更新 SwingWorker 的进度属性,并使用添加到 SwingWorker 的 PropertyChangeListener 来监视和显示进度更改。

【讨论】:

    【解决方案2】:

    正如另一个答案中所述,您不应在 EDT 中执行冗长的操作。但是,如果您赶时间,我已经使用模态 JDialog 处理了类似的情况。当模态对话框可见时,它将阻塞进行 setVisible(true) 调用的线程并获得它自己的调度线程。它可以独立于 EDT 进行更新。在其中一个中做你的进度条,它应该没问题。

    【讨论】:

      猜你喜欢
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多