あなたはそのためのChangeListener
を実装する必要があります。 InvalidationListener
は、値が無効になると実行されます。 docsを参照してください。 ObervableValueのJavaのドキュメントから
:変更イベントと 無効化イベント:
アンObservableValueは、2種類のイベントを生成します。変更イベントは、値が に変更されたことを示します。現在の値が であれば、無効化イベントが生成されます。無効な値が本当に が変更された場合、それが再計算されるまで遅延し 評価値のための1がわからないため 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
を使用する際の問題点は、値が再び無効になった場合、それはすでに無効であるので、あなたは、変更の通知されませんということです。それには変更リスナーを使用する必要があります。
変更リスナーをプロパティに登録すると、遅延評価が無効になるため、変更リスナーが起動するたびに無効化イベントが発生します。
サンプルiで試してみてください。
この[説明](https://stackoverflow.com/a/33834626/230513)が役立ちます。 – trashgod
ありがとう、私は質問を更新しました。 – kerner1000