您需要为此实现一个
ChangeListener。
InvalidationListener仅当值变为无效时才执行A。请参阅文档。
从Observablevalue的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是, 如果该值再次变为无效 , 则不会通知您更改
,因为该值已经无效。您必须为此使用更改侦听器。
在属性上注册更改侦听器 将禁用延迟评估 ,因此,每次触发更改侦听器时都会触发无效事件。
在我添加的示例中尝试一下。



