为什么SwingWorker#setProgress限于[0,100]?

Jef*_*rey 8 java swing progress swingworker

SwingWorker#setProgressIllegalArgumentException如果参数不是从0到100 ,则抛出一个.我认为该setProgress方法的主要目的是更新a JProgressBar(就像在本教程中一样).如果是这种情况,为什么SwingWorkerJProgressBar进度不受限制时,将进度限制为[0,100] ?

kle*_*tra 8

讨论api设计很有趣,但容易猜测:-)

本周末的一些随机想法:

  • SwingWorker的基本流程模型是允许在后台执行某些操作,并支持将中间结果和最终结果报告回EDT.

  • 它的目的是进行子类化(正如@trashgod已经强调的那样),同时它试图最大限度地减少所需的工作量:完全定义状态和进度并实现方便属性,意味着按原样使用.

  • 因此,api doc规则 - 明确规定绑定属性进程的有效值在0 ... 100的范围内,是不允许的.没有歧义,在自定义实现中不允许更改任何内容.以百分比显示进度是最常见的用例,支持开箱即用是合理的事情.

  • 为了报告坐标不同于百分比的中间结果,intenteded路径是实现过程(..).这取决于自定义implmentation究竟是什么,可能是触发自定义属性或直接填充视图模型或...

  • 最后,教程示例就是一个例子.此外,它本身也不一致:提及方法task.getLenghtOfTask的描述,该方法未在自定义swingworker中实现.我的(疯狂)猜测是,示例文本仍然基于可能支持任意值的旧版本.

要回答这个问题(我的0.02Euro美分: - ) - 设计没什么不好,它是一个平衡良好的基础实现,可以立即处理常见的使用情况,同时又足够灵活,可以使更高级的要求变得简单实施.

一旦获得单条信息就更新

你不能完全控制报告的粒度:你所能做的就是定义最小块的单位,然后必须期望收到一个或几个最小的硬币.


tra*_*god 5

是否有充分的理由将进度限制在[0,100]?

如果这个问题有一个建设性的答案,那么构成进展的概念可能最为人所知,无论在后台线程中建模的是什么.缩放限制了必须公开的细节数量.

与此同时,SwingWorker预期是子类.没有什么可以排除添加setProgress(int progress, in min, int max)方法和随之而来的属性更改支持,但很难看到任何优势 - 收件人只需要将其缩放以进行显示.

  • setProgress是_not_一种用于覆盖的方法(通常,因为它是最终的:-),也没有绕过属性"进度"的合同 (3认同)