FXCollections, Callback<E, Observable[]> Sets的提取器?



我知道将提取器作为参数的工厂方法:

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

的元素,则将无法获得正确的结果。

最新更新