FXCollections,Callback<E, Observable[]> 集合提取器?

FXCollections, Callback<E, Observable[]> extractor for Sets?

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

FXCollections.observableList(List<E> list, Callback<E, Observable[]> extractor)

是否有 ObservableSet 的等价物?

如果不是,当我使用 ObservableSet 而不是 ObservableList 时如何实现相同/相似的功能?

SetChangeListener.Change 缺少 Update 更改类型(只有 Add / Remove 变化)。

因此,您无法通过 ObservableSet 实现这种行为,因为它不是 ObservableSet 接口的一部分。

您需要定义自己的接口才能实现此行为。

请注意,修改 Set 元素通常不是一个好主意,因为它会扰乱数据的存储方式。如果修改例如更改 hashCode,如果您修改 HashSet

的元素,您将不会得到正确的结果

没有。事实上,ListChangeListener.Change有一个wasUpdated() method, which returns true when the change is created because one of the properties specified in the extractor has changed, SetChangeListener.Change没有这样的方法。

如果您的集合包含 S 类型的元素,其中有一个 Property<T> 类型的 属性,将其命名为 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);
    }
});