【问题标题】:JavaFx: Listener and/or binding handlingJavaFx:监听器和/或绑定处理
【发布时间】:2018-05-07 09:01:09
【问题描述】:

我只是想知道 JavaFx 如何处理 ObservableValue 的侦听器。 总的来说,我对 Listeners 有一些不清楚的地方:

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

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

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

【问题讨论】:

    标签: java javafx binding javafx-8 listener


    【解决方案1】:

    javaFx 如何处理同一个值的多个监听器?我所知 我可以将多个侦听器添加到同一个obsValue,那么什么是 触发命令?喜欢在fifo中?

    如果我将相同的侦听器(相同的实例)两次添加到 同一个对象,是否会被添加两次?如果是,那么它会触发 两次?或者我不确定它是如何工作的。

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

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

    添加一个 ChangeListener,只要值 ObservableValue 发生变化。

    如果多次添加同一个监听器,则 通知不止一次。也就是说,不进行检查以确保 独特性。

    请注意,相同的实际 ChangeListener 实例可能是安全的 注册不同的 ObservableValues。

    上面语句的粗体部分告诉我们所有我们需要知道的,添加相同的ChangeListenerntimes 将导致它被解雇ntimes。

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

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

    就执行的顺序而言,ObservableValue 接口本身并没有指定顺序。

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

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


    我知道在某些情况下我可以用绑定替换侦听器,并且 反之亦然,但哪个更有效?更好地绑定,或者更好地 添加监听器?

    绑定通常用于将Property&lt;T&gt; 对象绑定在一起,例如,如果将propertyB 绑定到propertyA(即propertyA.bind(propertyB)),那么当propertyB 更改时,propertyA 也会改变。绑定也可以是双向的。

    因此,如果您希望更改以影响另一个Property,则使用绑定是有意义的。但请注意,属性仅通过绑定引用单个其他属性。要绑定多个属性,您可以像链接列表(通过它们的绑定)或使用促进多个绑定的类(例如DoubleBinding)以菊花链形式链接它们

    如果不是上述情况,请添加Listener

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

    【讨论】:

    • 感谢详细的回答,对于第一点,还有一个问题:无法确保如果我向ObservableValue 添加了一次侦听器,则不会再次添加相同的侦听器.我的意思是同一个例子。我真的不知道 关于安全注册的注意事项 在 javadoc 中是什么意思。
    • @Sunflame 关于通知顺序:未指定的内容不存在;)所以要么你找到这样的规范(在我的脑海里,我以为我已经看到了,但找不到现在),或者你不能依赖任何假设的(阅读:实现的)顺序。不明白您在评论中的意思:是您在代码中添加侦听器,因此您知道是否添加了两次..
    • 是的,但是在某些情况下,例如触发了一个向属性添加侦听器的事件,然后我想听该属性的更改,但我想确定该事件是否再次触发,我已经将侦听器添加到我的属性中,不要再这样做了。
    • @Sunflame 保留对侦听器的引用并在添加之前将其删除
    • @Sunflame 编辑了关于第一点的答案。本质上,这样做的唯一方法是保留对侦听器的引用并在添加之前将其删除。注释请注意,可以为不同的 ObservableValues 安全地注册相同的实际 ChangeListener 实例。 仅表示您可以与其他 ObservableValue 对象共享 ChangeListener
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 2019-11-25
    • 2020-10-10
    相关资源
    最近更新 更多