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

时间:2017-07-18 21:13:28

标签: java multithreading swing user-interface swingworker

我为gui程序编写了代码。

在这个程序中,有一个SwingWorker可以找到固定数字之前的素数。每个素数都会发布和打印。 在计算过程中更新,因此启动了一个事件PropertyChangeEvent。

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

在ChangePropertyListener中,我不明白如何获得进步的价值:

  • myChangePropertyEvent.getNewValue()
  • mySwingWorker.getProgress()

有人可以告诉我这些差异并解释getNewValue()是什么(我还看过Doc,但它不是那么富有表现力)?

1 个答案:

答案 0 :(得分:3)

他们俩有不同的目的。调用SwingWorker.getProgress会返回SwingSorker实例的当前进度,如名称所示。当坚持SwingWorker.setProgress(int)的约定时,相应的getter总是返回0到100之间的值。您可以随时调用此方法,并且您将始终获得工作人员的最新状态。任何知道特定SwingWorker实例的客户端代码都可以随时调用该方法。

另一方面,PropertyChangeEvent.getNewValue()返回与getProgress相同的值。要调用此方法,您必须先调用PropertyChangeListener来注册SwingWorker.addPropertyChangeListener(PropertyChangeListener)。一旦这样的倾听者注册,它将接收有关工人进度的更新。现在有三个微妙的差异:

  1. 注册PropertyChangeListener后不需要 了解它正在收听的SwingWorker。实际上它 永远不需要知道它正在监听的特定SwingWorker 至少,给另一个对象做了注册 SwingWorker.addPropertyChangeListener(PropertyChangeListener)
  2. 调用SwingWorker.setProgress(int)时,SwingWorker可能会在调用PropertyChangeListener.propertyChange(PropertyChangeEvent)方法之前累积值。这意味着如果连续调用setProgress 1,2和3,则可能只调用一次PropertyChangeListener实例,PropertyChangeEvent.getNewValue()将返回3.这意味着在选择此方法时可能会遗漏某些中间值。
  3. PropertyChangeListener将获知任何工人绑定属性的更改,即有关其进度及其state的信息。
  4. 总之,只要您想在拉动的基础上获得工作人员进度,即主动请求该值,就使用getProgress。每当您想要了解进度变化时,请使用PropertyChangeListener方法,并且无法获知有关进度的每个变化的信息。