【问题标题】:Java Difference between getProgress() and getNewValue()getProgress() 和 getNewValue() 之间的 Java 区别
【发布时间】:2017-12-23 22:27:47
【问题描述】:

我为一个 gui 程序编写了代码。

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

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

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

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

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

【问题讨论】:

    标签: java multithreading swing user-interface swingworker


    【解决方案1】:

    他们两个有不同的目的。调用SwingWorker.getProgress 将返回 SwingSorker 实例的当前进度,正如其名称所表明的那样。当遵守SwingWorker.setProgress(int) 的约定时,相应的getter 总是返回一个介于0 和100 之间的值。您可以随时调用此方法,您将始终获得worker 的最新状态。任何知道特定 SwingWorker 实例的客户端代码都可以随时调用该方法。

    另一方面,PropertyChangeEvent.getNewValue() 返回与 getProgress 相同的值。为了调用此方法,您必须首先通过调用SwingWorker.addPropertyChangeListener(PropertyChangeListener) 注册PropertyChangeListener。一旦注册了这样的侦听器,它将接收有关工作人员进度的更新。现在有三个细微的区别:

    1. 注册PropertyChangeListener后不需要 进一步了解它正在收听的 SwingWorker。事实上它 永远不需要知道它正在监听的特定 SwingWorker 完全没有,给定另一个对象,通过 SwingWorker.addPropertyChangeListener(PropertyChangeListener)
    2. 调用SwingWorker.setProgress(int) 时,SwingWorker 可能会在调用PropertyChangeListener.propertyChange(PropertyChangeEvent) 方法之前累积值。这意味着如果您使用 1、2 和 3 连续调用 setProgress,PropertyChangeListener 实例可能只被调用一次,PropertyChangeEvent.getNewValue() 将返回 3。这意味着您在选择此方法时可能会错过某些中间值。
    3. PropertyChangeListener 将获悉任何 Worker 绑定属性的更改,即其进度及其state

    总而言之,只要您想以拉取的方式获取工作人员的进度,即主动请求值,请使用 getProgress。每当您想了解进度更改并且不了解进度的每个更改时,您都可以使用 PropertyChangeListener 方法。

    【讨论】:

    • 顺便说一句,PropertyChangeEvent#getNewValuePropertyChangeEvent#getName 的值相关,当属性名称为state 时,尝试获取期望double 的值没有意义:P
    • 感谢您指出这一点!我编辑了我的答案,将其作为第三个区别。
    • 我会在代码中的哪个位置使用getProgress 来不断获取工人的进度?如果不在 propertyChangeListener 中,你能提供一个例子吗?
    • 一个可能的(完全虚构的)场景:你开始一个摇摆工人。然后使用计时器检查工作人员的进度是否已通过 getProgress() 方法达到某个点。如果进度低于例如50 你想给用户一些反馈并显示一个带有进度条的对话框。否则你只是让工人完成它的工作而不显示详细的进度信息。基本上 getProgress 非常有用,无论您想了解进度,而不依赖于实际进度变化。
    猜你喜欢
    • 2012-01-21
    • 2016-06-29
    • 2012-09-03
    • 2016-03-28
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多