我正在构建一个下载服务器上N个元素的Java程序。我希望有一个工作进度条,显示“已下载的元素”/N的百分比。目前,我通过将GUI对象的引用传递给线程来更新进度条值,但这使得代码变得“丑陋”(GUI类创建线程,其中包含对GUI本身的引用,从而创建了一种循环)。
是否有更好的方法?
我正在构建一个下载服务器上N个元素的Java程序。我希望有一个工作进度条,显示“已下载的元素”/N的百分比。目前,我通过将GUI对象的引用传递给线程来更新进度条值,但这使得代码变得“丑陋”(GUI类创建线程,其中包含对GUI本身的引用,从而创建了一种循环)。
是否有更好的方法?
阅读JProgressBar API,并跟随链接进入Swing教程,了解如何使用进度条的工作实例。
这里可能有用的一个设计模式是监听器模式。向工作线程注册进度监听器,监听器负责将进度信息发布到GUI(或其他对进度感兴趣的地方)。
因为在这种情况下很少会有多个监听器,所以通常最好只有一个监听器(减少复杂性和开销)。
在我的应用程序中,长时间运行的操作是通过传递ProgressTracker来调用的(它具有两种事件类型:百分比和状态文本)。这些信息用于更新JProgressBar、JLabel等等...我还使用ProgressTracker来检查操作是否应该被取消。
SwingWorker确实有一些代码可以帮助合并多个更新,但它建立在长时间运行的任务应该继承自SwingWorker的假设之上,这并没有帮助关注点分离。你真正要走哪条路取决于你——我个人更喜欢我的数据操作与GUI无关。
记得使用SwingUtilities.invokeLater()将更新发布到任何Swing组件上的EDT。