我有多個JavaFX窗格和畫布引用一個複雜對象與他們需要的數據,我希望它們在對象更改時重繪。如何製作一個複雜的對象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
「不能交換」意味着我想保持相同的'ComplexObject',只是改變其中的值。在我看來,'ObjectPropertyBase'及其朋友被設計成包裝器,所以你通過'set()'替換整個對象,然後它將觸發失效偵聽器。我可以存儲複雜的計算結果並將結果作爲單獨的屬性公開,但最初的目的是僅僅擁有複雜的對象並根據需要進行計算。 – EboMike
這意味着我的答案應該接近你正在尋找的東西。您不會跟蹤'ComplexObject'參考中的更改。而是跟蹤其內部值(基元將被裝箱)和對象的引用的更改。如果您需要跟蹤個人財產,則需要爲其添加個人監聽者。否則,您可以公開一個'BooleanProperty',您可以偵聽任何屬性中的任何更改。當然,在內部,您需要將這些屬性綁定到'BooleanProperty'。 – Jai