3

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

4

4 回答 4

5

SwingWorker如本例所示,在这种情况下具有一些优势。

于 2011-01-23T03:23:40.200 回答
2

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

于 2011-01-22T21:28:41.880 回答
2

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

于 2011-01-22T21:29:35.917 回答
0

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

因为在这种情况下,您不太可能拥有多个侦听器,因此通常最好只有一个侦听器(降低复杂性和开销)。

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

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

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

于 2011-01-23T05:18:32.053 回答