繁体   English   中英

用于GUI创建(EDT)的Java Swing进度监视器

[英]Java Swing Progress Monitor for GUI Creation (EDT)


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

对话框的创建是在事件分配器线程中完成的。 最多可能需要10秒钟,具体取决于客户端系统。

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

问题是进度监视器始终冻结,直到启动对话框为止。 对话框启动完成后,进度监视器将做出反应并显示当前状态。

我尝试了很多在论坛上阅读的内容,但是没有两个不同的线程是行不通的。 这是使进度监视器和对话框创建都在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();

由于摆动不是线程安全的,因此使用第二种解决方案是否会引起潜在的麻烦?
在EDT中是否有监视任务的通用解决方案?

您声明:

对话框的创建是在事件分配器线程中完成的。 最多可能需要10秒钟,具体取决于客户端系统。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM