在JavaFX的上下文中,当属性发生变化时,何谓“无效”?我不理解为什么要使用这个术语。
JavaFX属性是一个可观察的对象,包装了一个字段值。所以当属性更新或者变成无效时,它的监听者/观察者会被通知。那么这是什么意思呢?
JavaFX属性是一个可观察的对象,包装了一个字段值。所以当属性更新或者变成无效时,它的监听者/观察者会被通知。那么这是什么意思呢?
我在这里找到了很好的解释。
当调用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文档所描述的那样,这仅是因为惰性求值。
JavaFX绑定和属性实现都支持惰性评估,这意味着当发生更改时,值不会立即重新计算。如果以后需要该值,则稍后重新计算。
如果您希望值有效,请在System.out.println(num2);
之前调用num2.getValue();
或num2.get();
,您将看到属性将变得有效。
注意:在上面的示例中,num2.bind(num1);
和num1.set(56);
都会使num2
的值无效,因为绑定已经更改了num2
的值,而set()
也试图更改该值。
这是关于惰性求值的。这个视频链接是从2011年Devoxx会议上的,对我帮助很大,让我理解了这个概念。
对你来说最有意思的部分是在5:00左右。