2017-07-15 4 views
1

プロパティが変更されたかどうかは気になるだけですが、新しい値ではありません。JavaFX InvalidationListenerまたはChangeListener

され、代わりにChangeListenerInvalidationListenerを登録することが有利ですか?

私は、プロパティへの変更は、最初のプロパティを無効にし、すべての無効化リスナーに通知しないことを、仮定しました。変更リスナーが登録されている場合、または誰かがこのプロパティーを要求した場合にのみ、プロパティーは「検証済み」/再計算され、すべての変更リスナーが新しい値で更新されます。

私は実際の値では興味がないので、私はそれだけで無効化イベント(プロパティが変更されたが、再計算されなかった、中間状態のいくつかの種類)をリッスンするパフォーマンス上の利点であると仮定します。

+0

この[説明](https://stackoverflow.com/a/33834626/230513)が役立ちます。 – trashgod

+0

ありがとう、私は質問を更新しました。 – kerner1000

答えて

1

あなたはそのための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で試してみてください。

+0

しかし、値が変更されたときに必ず最初に無効になるわけではありませんか? – kerner1000

+0

はい、istは行いますが、(プロパティのゲッターを呼び出すことによって)再度検証されるまで、istは一度だけ行います。したがって、値を複数回設定すると、値の最初の変更についてのみ認識され、それ以降の変更ではイベントは発生しません。 –

+1

ありがとう、素敵な答えは、今完全にはっきりしています。 – kerner1000

関連する問題