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);
}
});
我知道将提取器作为参数的工厂方法:
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);
}
});