gpt4 book ai didi

JavaFx:监听器和/或绑定(bind)处理

转载 作者:行者123 更新时间:2023-11-30 06:05:09 25 4
gpt4 key购买 nike

我只是想知道 JavaFx 如何处理 ObservableValue 的监听器。总的来说,我有一些关于听众的不清楚的事情:

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

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

我会接受这个领域的任何解释,或任何好的文档,在那里我至少可以找到这些要点的答案。

最佳答案

How do javaFx handles multiple listeners on the same value? As I know I can add multiple listeners to the same obsValue, then what is the trigger order? Like in fifo?

What happens if I add the same listener(the same instance) twice to the same object, does is gets added twice? if yes then it triggers twice? Or i'm not sure how it works.

让我们看一下答案的一部分的文档:

ObservableValue<T>.addListener(ChangeListener<? super T> listener);

Adds a ChangeListener which will be notified whenever the value of the ObservableValue changes.

If the same listener is added more than once, then it will be notified more than once. That is, no check is made to ensure uniqueness.

Note that the same actual ChangeListener instance may be safely registered for different ObservableValues.

上面声明的粗体部分告诉我们所有我们需要知道的,添加相同的 ChangeListener n时间会导致它被解雇n次。

ObservableValue接口(interface)没有指定任何操作来检查是否 ChangeListener已经存在。您可能很幸运,发现一个实现确实为您提供了这种机制,但实际上它并没有多大用处。为保证您不会添加重复的 ChangeListener您可以执行以下操作:

ChangeListener<...> myListener = ...;
someProperty.removeListener(myListener);
someProperty.addListener(myListener);

根据执行的顺序ObservableValue接口(interface)本身不指定顺序。

看标准Property JavaFX 库中包含的类,例如SimpleDoubleProperty ,它们按照添加的顺序被解雇。很难快速解释这是如何通过 SimpleDoubleProperty 等类使用的稍微复杂的机制实现的。 .看 ExpressionHelper 类以获取有关如何完成此操作的更多详细信息。

如果您要实现 ObservableValue自己接口(interface)(尽管 Javadoc 不建议这样做),您可以指定自己的执行顺序。


I know there are cases when I can replace listener with binding and vice versa, but which is more effective? Better to bind, or better to add a listener?

绑定(bind)一般用在要绑定(bind)Property<T>的时候对象在一起,例如,如果您绑定(bind) propertyBpropertyA (即 propertyA.bind(propertyB) )然后当 propertyB 时已更改,propertyA也会改变。绑定(bind)也可以是双向的。

所以,如果你想改变影响另一个Property使用绑定(bind)是有道理的。但请注意,属性仅通过绑定(bind)引用单个其他属性。要绑定(bind)多个属性,您可以将它们像链接列表一样菊花链(通过它们的绑定(bind))或使用促进多重绑定(bind)的类(例如 DoubleBinding )

如果不是上述情况,添加一个Listener .

另请参阅此资源:Using JavaFX Properties and Binding

关于JavaFx:监听器和/或绑定(bind)处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47454757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com