从工作线程更新进度条

3

我正在构建一个下载服务器上N个元素的Java程序。我希望有一个工作进度条,显示“已下载的元素”/N的百分比。目前,我通过将GUI对象的引用传递给线程来更新进度条值,但这使得代码变得“丑陋”(GUI类创建线程,其中包含对GUI本身的引用,从而创建了一种循环)。

是否有更好的方法?

4个回答

5

SwingWorker在这方面有一些优势,正如这个示例所建议的那样。


SwingWorker在此情况下具有一些优点,如此示例所示。

2

阅读JProgressBar API,并跟随链接进入Swing教程,了解如何使用进度条的工作实例。


1
@pst,这些链接可以在API中找到。如果您无法轻松访问API以供参考,则无法进行编程。 - camickr

2
为了解决"循环"问题,创建一个界面接口,让GUI继承它,并将该接口传递给工作线程。

0

这里可能有用的一个设计模式是监听器模式。向工作线程注册进度监听器,监听器负责将进度信息发布到GUI(或其他对进度感兴趣的地方)。

因为在这种情况下很少会有多个监听器,所以通常最好只有一个监听器(减少复杂性和开销)。

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

SwingWorker确实有一些代码可以帮助合并多个更新,但它建立在长时间运行的任务应该继承自SwingWorker的假设之上,这并没有帮助关注点分离。你真正要走哪条路取决于你——我个人更喜欢我的数据操作与GUI无关。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接