7

在 JavaFX 的上下文中,属性在更改时“无效”在什么意义上?我不明白使用这个术语的原因。

JavaFX 属性是一个可观察并包装字段值的对象。因此,当属性更新或变为无效时,它的侦听器/观察者会收到通知。这是什么意思?

4

2 回答 2

9

我在这里找到了很好的解释。

在此处输入图像描述

当调用 intProperty.set(7168) 时,它会向 otherProperty 触发一个失效事件。在接收到这个失效事件后,otherProperty 会简单地记下它的值不再有效的事实。它不会立即通过查询 intProperty 的值来重新计算其值。稍后在调用 otherProperty.get() 时执行重新计算。想象一下,如果不是像上面的代码那样只调用一次 intProperty.set(),而是多次调用 intProperty.set();otherProperty 仍然只重新计算一次它的值。

在测试后我发现了这个例子。

import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;

public class InvalidMean{
    public static void main(String[] args){
        IntegerProperty num1 = new SimpleIntegerProperty(15);
        IntegerProperty num2 = new SimpleIntegerProperty(10);
        // num2.bind(num1);
        // num1.set(56);
        System.out.println(num2);
    }
}

运行此代码您将获得以下输出:

IntegerProperty [value: 10]

现在从注释行中删除注释。你会得到这个输出。

IntegerProperty [bound, invalid]

num2的值变得无效,因为新值到达但尚未更新。正如JavaFX Doc描述的那样,仅仅是因为惰性评估。

JavaFX 绑定和属性实现都支持惰性求值,这意味着当发生更改时,不会立即重新计算值。如果随后请求该值,则稍后会重新计算。

如果您希望该值应该是有效的调用num2.getValue();num2.get();Before System.out.println(num2);you will see property will be valid 那么。

注意:在上面的示例中num2.bind(num1);num1.set(56);两者都会使 value 无效,num2因为 bind 已经改变了 valuenum2并且set()还在尝试改变 value。

于 2016-06-16T20:50:31.473 回答
0

这都是关于惰性评估的。这段Devoxx 2011 会议的视频帮助我理解了这个概念

对你来说有趣的东西从 5:00 开始。

于 2015-01-30T15:14:51.193 回答