我有一個ObservableList<DataClass> someData
連接ChangeListener(通過addListener
)。該列表由後臺線程不時更新。其實不是列表本身被更新,但新的列表中,由線程返回,被保存在成員someData
:如何將所有附加的監聽器複製到JavaFX中的新節點?
...
task.onSuccess(event -> setSomeData(task.getValue());
...
// standard setter generated by IntelliJ
public void setSomeData(ObservableList<DataClass> someData) {
this.someData = someData;
}
現在,當我使用了標準的制定者,數據本身是在新的列表中設置someData
,好嗎,而且所有附在舊名單上的聽衆都不見了。我不想將整個列表複製到我的舊列表中,因爲它可能包含大量元素。
我知道我可以將Listeners保存爲成員變量並將它們重新分配給新列表,但是這會聚集代碼並需要在setter方法中進行一些硬編碼(因爲ObservableList
中沒有#getListeners
方法)。 [編輯:其實我不能這樣做,因爲聽衆是由另一個班級添加的,我不能/不想從這個班級訪問。]
如何設置保留聽衆的新列表並沒有複製每個元素?
我在最新版本的Java。
嗯,但不會有'this.someData.clear(); this.someData.addAll(someData)',複製每個元素? – LPrc
@LPrc不完全。如果調用'clear'並調用'addAll',則觸發2次更改,使用'ListProperty.set'只觸發一次更改。這個改變可能是由'setAll'觸發的。但是請注意,你的選擇受到你所做的設計選擇的限制(其他類決定'ObservableList'的實現;偵聽器應該保留......),但是通過這種方法,你仍然有'ObservableList'作爲後備列表,而不是簡單的複製內容... – fabian