在 JavaFX 的上下文中,属性在更改时“无效”在什么意义上?我不明白使用这个术语的原因。
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 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。
这都是关于惰性评估的。这段Devoxx 2011 会议的视频帮助我理解了这个概念。
对你来说有趣的东西从 5:00 开始。