2017-07-18 45 views
1

我为一个gui程序编写了代码。Java getProgress()和getNewValue()的区别

在这个程序中有一个SwingWorker来找出素数直到一个固定的数字。每个素数都被发布和打印。 在计算过程中进行更新,因此启动了一个事件PropertyChangeEvent。

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

在ChangePropertyListener我不明白怎么弄的进步之间的值:

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

有人能告诉我差异和解释什么getNewValue()(我还没看过文档,但它不那么富有表现力)?

回答

3

他们两个有不同的用途。调用SwingWorker.getProgress将返回SwingSorker实例的当前进度,如名称已经告诉的那样。当坚持合同SwingWorker.setProgress(int)时,相应的getter总是返回一个介于0和100之间的值。您可以随时调用此方法,并且您将始终获得工作人员的最新状态。任何知道特定SwingWorker实例的客户端代码都可以随时调用该方法。

另一方面,PropertyChangeEvent.getNewValue()返回与getProgress相同的值。为了得到这种方法,你必须先通过调用SwingWorker.addPropertyChangeListener(PropertyChangeListener)来注册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)的更改情况。

总之,无论何时您希望获得工作进度(例如主动请求值),都可以使用getProgress。只要您想了解进度变更情况并且不知道进度的每一次变化都可以接受,就可以使用PropertyChangeListener方法。

+1

正如一个侧面说明,“PropertyChangeEvent#getNewValue”与“PropertyChangeEvent#getName”的值是上下文相关的,当属性名称为“state”时,没有任何一点试图获得希望得到'double'的值:P – MadProgrammer

+0

为了指出这一点!我编辑了我的答案,将其作为第三个区别加入。 –

+0

在代码中,我会使用'getProgress'来不断获得工作进度?如果不在propertyChangeListener中,你能提供一个例子吗? – briennakh