您需要为此执行ChangeListener
。一旦该值变为无效,则仅执行InvalidationListener
。请参阅docs。
从ObervableValue的Java文档:
一种ObservableValue产生两种类型的事件:改变事件和无效 事件。更改事件表示该值已更改为 。如果当前值为 ,则生成无效事件。这种区别变得很重要,如果ObservableValue支持懒惰评估,因为对于一个懒惰的 评估值,人们不知道一个无效值是否真的有 被更改,直到它被重新计算。 由于这个原因,产生变化 事件需要急切的评估,而无效事件可能是 生成急切和懒惰的实现。
我添加了一个简单的例子
public static void main(String[] args) {
SimpleIntegerProperty one = new SimpleIntegerProperty(1);
SimpleIntegerProperty two = new SimpleIntegerProperty(0);
// the binding we are interested in
NumberBinding sum = one.add(two);
sum.addListener(observable -> System.out.println("invalidated"));
// if you add a value change listener, the value will NOT be evaluated lazy anymore
//sum.addListener((observable, oldValue, newValue) -> System.out.println("value changed from " + oldValue + " to " + newValue));
// is valid, since nothing changed so far
System.out.println("sum valid: " + sum.isValid());
// will invalidate the sum binding
two.set(1);
one.set(2); // invalidation event NOT fired here!
System.out.println("sum valid: " + sum.isValid());
// will validate the sum binding, since it is calculated lazy when getting the value
System.out.println("sum: " + sum.getValue());
System.out.println("sum valid: " + sum.isValid());
}
在使用InvalidationListener
的问题是,你不会更改通知如果值再次变得无效,因为它已经是无效的。您必须为此使用更改侦听器。
在属性上注册更改侦听器将禁用惰性评估,因此每次更改侦听器被触发时都会触发invalidation事件。
尝试一下我添加的示例。
此[说明](https://stackoverflow.com/a/33834626/230513)可能会有所帮助。 – trashgod
谢谢,我已经更新了这个问题。 – kerner1000