2016-12-22 20 views
0

我有一個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。

回答

2

沒有更多信息,最好的方法似乎是使用ListProperty。這是一個Property<ObservableList<ItemType>>,但也實現了ObservableList<ItemType>(內容是該屬性所包含的列表的內容)。

使用這個類可以讓你的聽衆添加到ListProperty,但仍保持代碼替換數據簡單:

private final ListProperty<DataClass> someData = new SimpleListProperty<>(); 

public void setSomeData(ObservableList<DataClass> someData) { 
    this.someData.set(someData); 
} 

... 

this.someData.addListener(someListener); 
+0

嗯,但不會有'this.someData.clear(); this.someData.addAll(someData)',複製每個元素? – LPrc

+1

@LPrc不完全。如果調用'clear'並調用'addAll',則觸發2次更改,使用'ListProperty.set'只觸發一次更改。這個改變可能是由'setAll'觸發的。但是請注意,你的選擇受到你所做的設計選擇的限制(其他類決定'ObservableList'的實現;偵聽器應該保留......),但是通過這種方法,你仍然有'ObservableList'作爲後備列表,而不是簡單的複製內容... – fabian

2

不要抹去的參考,只是刪除其內容

task.onSuccess(event -> someData.setAll(task.getValue())); 
相關問題