如何将所有连接的监听器复制到JavaFX中的新节点?

时间:2016-12-22 13:44:09

标签: java javafx listener

我有ObservableList<DataClass> someData附加了ChangeListener(通过addListener)。该列表由后台线程不时更新。实际上并没有更新List本身,但是线程返回的新List保存在成员someData中:

...
task.onSuccess(event -> setSomeData(task.getValue());
...
// standard setter generated by IntelliJ
public void setSomeData(ObservableList<DataClass> someData) { 
   this.someData = someData;
}

现在,当我使用标准setter设置someData时,数据本身就在新的List中,好吧,但是附加到旧List的所有Listener也都消失了。我不想将整个列表复制到我的旧列表中,因为它可能有很多元素。

我知道我可以将Listeners保存为成员变量,并将它们重新分配给新的List但是这会产生代码并在setter方法中需要一些硬编码(因为#getListeners方法中没有ObservableList方法1}})。 [编辑:实际上我不能这样做,因为监听器是由另一个我不能/不想从这个类访问的类添加的。]

如何设置保留监听器的新列表而不复制每个元素?

我使用的是最新版本的Java。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:2)

请勿删除参考,只需删除其内容

task.onSuccess(event -> someData.setAll(task.getValue()));