【问题标题】:How does boolean property work with createBooleanBinding布尔属性如何与 createBooleanBinding 一起使用
【发布时间】:2019-05-20 03:10:19
【问题描述】:

我有这个代码:

public class Test {
    public static void main(String [] args) {

        ObservableList<Integer> l = FXCollections.observableArrayList();
        l.add(1);
        l.add(2);
        l.add(3);
        BooleanProperty isPlayable = new SimpleBooleanProperty();
        isPlayable.bind(Bindings.createBooleanBinding(() -> 
        {
            System.out.println("List has changed");

            return l.contains(2);
        },l
        ));
l.remove(1);

我不明白为什么这段代码只会显示一次“列表已更改”?它应该两次,一次在绑定中,然后在删除中,因为列表是可观察的。为什么列表更改不会影响布尔属性?

(我在长代码中有一个更大的问题,但这种情况说明了我对布尔属性绑定的误解)

谢谢!

【问题讨论】:

    标签: java javafx binding observable


    【解决方案1】:

    来自ObservableValuedocumentationBindingProperty 都继承自):

    ObservableValue 的实现可能支持惰性求值,这意味着在更改后不会立即重新计算该值,而是在下次请求该值时进行惰性计算。此库中的所有绑定和属性都支持惰性求值。

    ObservableValue 生成两种类型的事件:更改事件和失效事件。更改事件指示值已更改。如果当前值不再有效,则会生成一个失效事件。如果ObservableValue 支持惰性求值,这种区别就变得很重要,因为对于惰性求值的值,在重新计算之前,不知道无效值是否真的发生了变化。出于这个原因,生成更改事件需要急切评估,而无效事件可以为急切和惰性实现生成。

    此类的实现应努力生成尽可能少的事件,以避免在事件处理程序中浪费太多时间。当第一个失效事件发生时,此库中的实现将自己标记为无效。在它们的值被重新计算并再次有效之前,它们不会再生成失效事件。

    ObservableValue 可以附加两种类型的侦听器:InvalidationListener 用于侦听失效事件,ChangeListener 用于侦听更改事件。

    重要提示:即使 ObservableValue 的实现支持惰性求值,附加 ChangeListener 也会强制执行急切计算。

    请注意,Property#bindBindings#createXXXBinding 在依赖项/依赖项上注册了 InvalidationListener,而不是 ChangeListener

    如您所见,核心 JavaFX 中的绑定和属性是惰性的。从 ObservableList 中删除元素后,您永远不会查询该值,因此永远不会重新计算该值。由于永远不会重新计算该值,因此不会第二次调用您的 Callable

    我真的很惊讶你看到"List has changed" 一次。您的代码都没有请求该值,因此我不希望计算该值。然而,从实现来看,注册InvalidationListener的行为会导致ObservableValue被验证(即,该值被查询)——而#bind添加了InvalidationListener .我不确定实现为什么会这样做,但确实如此。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-04
      • 1970-01-01
      • 2012-03-01
      • 2018-07-03
      • 1970-01-01
      • 2011-11-29
      • 2019-10-28
      相关资源
      最近更新 更多