从工作线程更新进度条

时间:2011-01-22 21:24:31

标签: java swing swingworker jprogressbar

我正在构建一个从服务器下载N个元素的java程序。我想要一个工作进度条,显示“已经下载的元素”/ N百分比。现在,我通过向线程传递对GUI对象的引用来更新进度条值,但它使代码“丑陋”(GUI类创建线程,其中包含对GUI本身的引用,创建一种循环)。 有没有更好的方法呢?

4 个答案:

答案 0 :(得分:5)

SwingWorker在此上下文中具有一些优势,如example中所述。

答案 1 :(得分:2)

阅读JProgressBar API,并点击关于如何使用进度条的Swing教程的链接作为工作示例。

答案 2 :(得分:2)

为了删除“循环”。创建一个GUI扩展的接口,传递给工作线程。

答案 3 :(得分:0)

这里可能使用的一种设计模式是听众模式。使用工作线程注册进度监听器。然后,监听者负责发布到GUI(或任何其他可能对进展感兴趣的内容)。

因为在这种情况下你不太可能有多个监听器,所以通常只有一个监听器会更好(降低复杂性和开销)。

在我的应用程序中,通过传入ProgressTracker(具有两种事件类型:百分比和状态文本)来调用长时间运行的操作。此信息用于更新JProgressBar,JLabel,等等......我还使用ProgressTracker来检查是否应该取消该操作。

SwingWorker确实有一些代码可以帮助合并多个更新 - 但它是基于长期运行的任务应该从SwingWorker继承的假设而构建的,这无助于分离关注点。这取决于你的方向 - 我个人更喜欢我的数据操作与GUI无关。

请记得使用SwingUtilities.invokeLater()将您的更新发布到EDT上的任何Swing组件