用于GUI创建的Java Swing Progress Monitor(EDT)

时间:2014-05-08 06:33:53

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


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

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

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

问题是进度监视器总是冻结,直到对话框启动。对话框启动完成后,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();

使用第二种解决方案会导致潜在的麻烦,因为摆动不是线程安全的吗? 在EDT内是否有监控任务的一般解决方案?

2 个答案:

答案 0 :(得分:1)

你说:

  

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

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

  

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

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

答案 1 :(得分:0)

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