[英]JavaFx: Listener and/or binding handling
我只是想知道JavaFx如何处理ObservableValue
的侦听器。 关于监听器,我总体上有一些不清楚的地方:
我使用了一段时间的监听器和绑定,所以我知道如何使用它们(至少我想我知道:)),然后我对如何使用它们不感兴趣,因为我必须做一些更复杂的监听或绑定,我想像我写的那样澄清一些要点,以确保我有效地使用它们,并且我不会发生任何不必要的内存泄漏。
我会接受此领域的任何解释或任何好的文档,在这些方面我可以从中找到答案。
javaFx如何处理相同值的多个侦听器? 据我所知,我可以将多个侦听器添加到同一个obsValue中,那么触发顺序是什么? 喜欢在fifo吗?
如果将相同的侦听器(相同的实例)两次添加到同一对象,会被添加两次,会发生什么? 如果是,那么它将触发两次? 或者我不确定它是如何工作的。
让我们看一下答案的一部分的文档:
ObservableValue<T>.addListener(ChangeListener<? super T> listener);
添加一个ChangeListener,每当
ObservableValue
的值更改时,它就会被通知。如果多次添加同一个侦听器,则将多次收到通知。 即,不进行检查以确保唯一性。
请注意,可以为不同的ObservableValues安全地注册相同的实际ChangeListener实例。
上面语句的粗体部分告诉我们我们需要知道的所有内容,如果将相同的ChangeListener
添加n
次,则将被触发n
次。
ObservableValue
接口未指定任何用于检查ChangeListener
已存在的操作。 您可能很幸运,发现实现确实为您提供了这种机制,但实际上并没有太大用处。 为了确保您没有添加重复的ChangeListener
,可以执行以下操作:
ChangeListener<...> myListener = ...;
someProperty.removeListener(myListener);
someProperty.addListener(myListener);
在执行顺序方面, ObservableValue
接口本身未指定顺序。
查看JavaFX库中包含的标准Property
类,例如SimpleDoubleProperty
,将按照添加的顺序触发它们。 很难快速解释如何通过诸如SimpleDoubleProperty
类的类所使用的稍微复杂的机制来实现这一点。 查看ExpressionHelper
类,以获取有关如何完成此操作的更多详细信息。
如果您自己实现ObservableValue
接口(尽管Javadoc不建议这样做),则可以指定自己的执行顺序。
我知道在某些情况下可以用绑定替换侦听器,反之亦然,但是哪个更有效? 更好地绑定,还是更好地添加侦听器?
当您想将Property<T>
对象绑定在一起时,通常使用绑定,因此,例如,如果将propertyB
绑定到propertyA
(即propertyA.bind(propertyB)
),则当propertyB
更改时, propertyA
也将更改。 绑定也可以是双向的。
因此,如果您希望更改使用绑定来影响另一个Property
,则是有意义的。 但请注意,这些属性仅通过绑定引用其他单个属性。 要绑定多个属性,您可以像链接列表一样(通过它们的绑定)或通过使用促进多个绑定的类(例如DoubleBinding
)来以菊花链方式链接它们。
如果不是上述情况,则添加Listener
。
另请参见此资源: 使用JavaFX属性和绑定
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.