繁体   English   中英

JavaFx:侦听器和/或绑定处理

[英]JavaFx: Listener and/or binding handling

我只是想知道JavaFx如何处理ObservableValue的侦听器。 关于监听器,我总体上有一些不清楚的地方:

  • javaFx如何处理相同值的多个侦听器? 据我所知,我可以将多个侦听器添加到同一个obsValue中,那么触发顺序是什么? 喜欢在fifo吗?
  • 如果将相同的侦听器(相同的实例)两次添加到同一对象,会被添加两次,会发生什么? 如果是,那么它将触发两次? 或者我不确定它是如何工作的。
  • 我知道在某些情况下可以用绑定替换侦听器,反之亦然,但是哪个更有效? 更好地绑定,还是更好地添加侦听器?

我使用了一段时间的监听器和绑定,所以我知道如何使用它们(至少我想我知道:)),然后我对如何使用它们不感兴趣,因为我必须做一些更复杂的监听或绑定,我想像我写的那样澄清一些要点,以确保我有效地使用它们,并且我不会发生任何不必要的内存泄漏。

我会接受此领域的任何解释或任何好的文档,在这些方面我可以从中找到答案。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM