SwingWorker#setProgress
会抛出IllegalArgumentException
。我认为setProgress
方法的主要目的是更新JProgressBar
(如它在this tutorial)。如果是这种情况,当SwingWorker
的进度不受限制时,为什么要将JProgressBar
的进度限制为[0,100]?
答案 0 :(得分:8)
讨论api设计非常有趣,但容易猜测: - )
本周末的一些随意的想法:
SwingWorker的基本流程模型是允许在后台执行某些操作并支持将中间结果和最终结果报告回EDT。
它的目的是进行子类化(正如@trashgod已经强调的那样),同时它试图最大限度地减少所需的工作量:状态和进度是完全定义和实现的便利属性,意味着按原样使用。
这样,api doc规则 - 它明确地说明绑定属性进程的有效值在0 ... 100范围内,是不正常的。没有歧义,在自定义实现中不允许更改任何内容。以百分比显示进度是最常见的用例,支持开箱即用是合理的事情。
用于报告坐标不同于百分比的中间结果,其中的intenteded路径是实现过程(..)。这取决于自定义implmentation究竟是什么,可以触发自定义属性或直接填充视图模型或......等等
最后,教程示例就是一个例子。此外,它本身也不一致:提及方法task.getLenghtOfTask的描述,该方法未在自定义swingworker中实现。我的(疯狂)猜测是,示例文本仍然基于可能支持任意值的旧版本。
回答这个问题(我的0.02Euro美分:-) - 设计没什么不好,它是一个平衡的基础实现,可以立即处理常见用例,同时又足够灵活,可以提供更多功能高级要求易于实施。
在单条信息可用时更新
您无法完全控制报告粒度:您所能做的就是定义最小块的单元,然后必须预期接收一个或几个最小的硬币。
答案 1 :(得分:5)
是否有充分的理由将进度限制在[0,100]?
如果这个问题有一个建设性的答案,那么构成进展的概念可能最为人所知,无论在后台线程中建模的是什么。缩放限制了必须公开的细节量。
与此同时,SwingWorker
意图被分类。没有什么能阻止添加setProgress(int progress, in min, int max)
方法和随之而来的属性更改支持,但很难看到任何优势 - 收件人只需要将其缩放以进行显示。
答案 2 :(得分:2)
1)SwingWorker#setProgress
--->我把它当作百分比数量,基本上是0到100之间的范围,同意代数知道负%或1M at%,但同样的方法你可以计算第四/第五维度,稍微更强硬可能是Drake equation,但可能
2)JProgressBar
--->没有这种限制/反应,因为你可以编写好的代码,在哪里可以切换(JComboBox)在%,Mb之间的值,保持....进展
答案 3 :(得分:2)
这取决于您的用例,但您也可以使用publish方法发布进度并更新publish方法中的进度条。有关示例,请参阅my answer on another SO question