我写了一个 gui 程序的代码。
在这个程序中有一个 SwingWorker 来找出素数直到一个固定的数字。每个质数都被出版和打印。 在计算进度更新期间,启动事件 PropertyChangeEvent。
ChangePropertyListener 必须使用 SwingWorker 的进度值更新 JProgressBar。
在 ChangePropertyListener 中,我不明白如何获取进度值:
- myChangePropertyEvent.getNewValue()
- mySwingWorker.getProgress()
有人可以告诉我差异并解释 getNewValue() 的作用吗(我还看过文档,但它的表现力不强)?
最佳答案
他们两个服务于不同的目的。来电 SwingWorker.getProgress如名称所示,返回 SwingSorker 实例的当前进度。当遵守SwingWorker.setProgress(int)的契约(Contract)时相应的 getter 总是返回一个介于 0 和 100 之间的值。您可以随时调用此方法,您将始终获得工作人员的最新状态。任何知道特定 SwingWorker 实例的客户端代码都可以随时调用该方法。
另一方面有PropertyChangeEvent.getNewValue()它返回与 getProgress 相同的值。为了调用此方法,您必须先注册一个 PropertyChangeListener。调用SwingWorker.addPropertyChangeListener(PropertyChangeListener) .一旦注册了这样的监听器,它将收到有关工作人员进度的更新。现在存在三个细微差别:
- 注册 PropertyChangeListener 后不需要 了解更多关于它正在收听的 SwingWorker 的信息。事实上它 永远不需要知道它正在监听的特定 SwingWorker 完全没有,给定另一个对象通过 SwingWorker.addPropertyChangeListener(PropertyChangeListener) .
- 调用SwingWorker.setProgress(int)时SwingWorker 可能会在调用 PropertyChangeListener.propertyChange(PropertyChangeEvent) 之前累积值方法。这意味着如果您连续使用 1、2 和 3 调用 setProgress,PropertyChangeListener 实例可能只被调用一次并且 PropertyChangeEvent.getNewValue()将返回 3。这意味着您在选择此方法时可能会错过某些中间值。
- PropertyChangeListener 将获知任何 worker 的绑定(bind)属性的变化,即它的进度和它的 state。 .
总而言之,只要您想在拉动的基础上获得工作人员的进度,即主动请求值,请使用 getProgress。每当您想要了解进度变化时使用 PropertyChangeListener 方法,并且不了解进度的每个变化对您来说都是可以接受的。
关于getProgress() 和 getNewValue() 之间的 Java 区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45177188/