我知道将提取器作为参数的工厂方法:
FXCollections.observableList(List<E> list, Callback<E, Observable[]> extractor)
ObservableSet
是否有等效的?
如果不是,当我使用ObservableSet
而不是ObservableList
时,我该如何实现相同/相似的功能?
没有。实际上,其中ListChangeListener.Change
具有wasUpdated()
方法,该方法在创建更改时返回true
,因为提取器中指定的属性之一已更改,SetChangeListener.Change
没有这样的方法。
如果您的集合包含具有Property<T>
类型的属性的类型S
的元素,则称其为someProperty()
,您有兴趣,您可以做
ChangeListener<T> listener = (obs, oldValue, newValue) -> { /* some code */ };
ObservableSet<S> set = FXCollections.observableSet();
set.addListener((Change<? extends S> c) -> {
if (c.wasAdded()) {
c.getElementAdded().someProperty().addListener(listener);
}
if (c.wasRemoved()) {
c.getElementRemoved().someProperty().removeListener(listener);
}
});
因此,您无法使用 您需要定义自己的界面才能实现此行为。 请注意,修改SetChangeListener.Change
缺少 update 更改类型(只有添加 add / remove 更改)。P>ObservableSet
实现这种行为,仅仅是因为它不是ObservableSet
接口的一部分。Set
元素通常是一个坏主意,因为它会弄乱数据的存储方式。如果修改,例如更改hashCode,如果您修改了HashSet