Java getProgress() 和 getNewValue() 之间的区别

Java Difference between getProgress() and getNewValue()

我写了一个 gui 程序的代码。

在这个程序中有一个SwingWorker来找出质数直到一个固定的数。每个质数都被出版和印刷。 在计算进度更新期间,启动事件 PropertyChangeEvent。

ChangePropertyListener 必须使用 SwingWorker 的进度值更新 JProgressBar。

在 ChangePropertyListener 中,我不明白如何获取进度值:

有人可以告诉我区别并解释 getNewValue() 的作用吗(我还看过文档,但它的表现力不强)?

他们两个有不同的用途。调用 SwingWorker.getProgress returns the current progress of the SwingSorker instance as the name already tells. When sticking to the contract of SwingWorker.setProgress(int) 相应的 getter 总是 returns 一个介于 0 和 100 之间的值。您可以随时调用此方法,您将始终获得工作人员的最新状态。任何知道特定 SwingWorker 实例的客户端代码都可以随时调用该方法。

另一方面是PropertyChangeEvent.getNewValue() which returns the same value as getProgress does. In order to get this method called you have to first register a PropertyChangeListener by calling SwingWorker.addPropertyChangeListener(PropertyChangeListener)。一旦注册了这样的侦听器,它将收到有关工作人员进度的更新。现在有三个细微差别:

  1. 注册PropertyChangeListener后不需要 了解更多关于它正在收听的 SwingWorker 的信息。事实上它 永远不需要知道它正在监听的特定 SwingWorker 完全没有,给定另一个对象通过 SwingWorker.addPropertyChangeListener(PropertyChangeListener).
  2. 当调用 SwingWorker.setProgress(int) the SwingWorker may accumulate values before calling the the PropertyChangeListener.propertyChange(PropertyChangeEvent) method. That means if you call setProgress with 1, 2, and 3 consecutively the PropertyChangeListener instance may be called just one time and PropertyChangeEvent.getNewValue() 时将 return 3. 这意味着您在选择此方法时可能会错过某些中间值。
  3. PropertyChangeListener 将获知任何 worker 绑定属性的变化,即它的进度和它的 state.

总而言之,只要您想在拉动的基础上获得工人的进步,即主动请求价值,请使用 getProgress。每当您想了解进度变化时使用 PropertyChangeListener 方法,并且不了解进度的每个变化对您来说都是可以接受的。