SwingWorker
用于以下目的:
- 用于在不同的线程中运行长时间运行的任务,以防止 GUI 无响应
- 用于在任务结束时通过
done()
方法使用长时间运行的任务产生的结果更新 GUI。 - 在
publish()
和process()
方法的帮助下,使用任务生成和发布的中间结果不时更新 GUI。
SwingUtilities.invokeLater()
可以按如下方式执行上述任务:
- 我们可以执行
ExecutorService.submit(new MyRunnable())
而不是从 EDT 执行SwingWorker.execute()
方法,因为它还会创建另一个线程可以执行长时间运行的任务。 - 为了在任务结束时更新 GUI,我们可以将代码(写在案例 1 的
done()
方法中)SwingUtilites.invokeLater(new RunnableToExecuteDoneMethodCode())
在任务结束时。 - 为了在任务中间更新 GUI,我们可以放置代码(写在案例 1 的
process()
方法中)SwingUtilites.invokeLater(new RunnableToExecuteProcessMethodCode())
在案例 1 中我们调用publish()
方法的地方。
我问这个问题是因为问题 Java - SwingWorker - Can we call one SwingWorker from other SwingWorker instead of EDT 中指定的问题可以用SwingUtilities.invokeLater()
解决,不能用SwingWorker
最佳答案
SwingWorker
是一个辅助类 -- 并不是说您需要使用它,而是使用它比手动完成相同的工作要简单明了得多。 (它还使检查进度更容易。)请注意,它是在版本 6 中添加的——在此之前,有些人使用了 Swing 教程中定义的更简单的类,或者执行了与您提到的类似的步骤。
关于Java - SwingWorker 和 SwingUtilities.invokeLater() 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2829364/