複雑なオブジェクトを必要なデータで参照する複数のJavaFXペインとキャンバスがあり、オブジェクトが変更されたときに再描画するようにしたい。複雑なオブジェクトをObservableにする方法
これはオブジェクトがObservableであることを要求しますが、どのクラスを使用しますか? JavaFXにはほとんどがObservableValueサブクラスがあり、値をラップしてスワップアウトすることができます。複雑なオブジェクトを交換する必要はなく、変更が発生したときにリスナーに通知するだけです。私はaddListener
を実装することでそれを行うことができましたが、すでに私のためにそれを行うサブクラスがあると確信しています。
class ComplexObject /* extends SomeObservableClass */ {
public int getValue1 { complex calculations... };
public int getValue2 { ... };
public void setNewValue1(int newValue) { ... }
}
class ComplexRenderer extends Canvas implements InvalidationListener {
private ComplexObject complexObject;
public void setComplexObject(ComplexObject complexObject) {
this.complexObject = complexObject;
complexObject.addListener(this);
}
public void draw() { ... }
}
ComplexObjectを拡張するクラスはどれですか?リスナーのリストを保持し、fireValueChangedEvent()のようなものがあるので、すべてのリスナーに通知することができますか?
私がJavaFXで見るものは、ここでは正しい選択ではないようなプロパティに合わせているようです。
"スワップできません"とはどういう意味ですか。あなたが 'ComplexObject'全体、あるいはその中のいくつかの値を入れ替えることを意味するのかどうかはわかりません。 'getValue()'の計算は、呼び出されたときにのみ行う必要がありますか?または、それを計算する前に保存することができますか? – Jai
「Can not swap」は、同じ「ComplexObject」を保持し、その内部の値を変更したいということを意味します。 'ObjectPropertyBase'とその仲間はラッパーになるように設計されているので、' set() 'でオブジェクト全体を置き換えると、無効化リスナーが起動します。私は複雑な計算を保存して結果を個別のプロパティとして公開することができましたが、当初の目的は複雑なオブジェクトを持ち、必要に応じて計算を行うことでした。 – EboMike
これは私の答えがあなたが探しているものに近いべきであることを意味します。あなたは 'ComplexObject'リファレンスの変更を追跡しません。代わりに、内部値(プリミティブはボックス化されます)とオブジェクトの参照の変更を追跡します。個々のプロパティを追跡する必要がある場合は、個別のリスナーを追加する必要があります。それ以外の場合は、プロパティのいずれかの変更をリッスンできる 'BooleanProperty'を公開することができます。もちろん、内部的には、それらのプロパティを 'BooleanProperty'にバインドする必要があります。 – Jai