我应该在JavaFX ObservableSet
集合的setter中使用什么方法来清除集合并将其初始化为给定的集合? ObservableList
的方法setAll(Collection)
用于通过首先清除列表来初始化列表。
我见过的最接近的是addAll(Collection)
,它不会事先清除该组。在我的项目中设置集合时,我希望它具有将ObservableSet
设置为新集的正常行为,但是根据javadoc:
如果指定集合中的所有元素尚未存在(可选操作),则将其添加到此集合中。如果指定的集合也是集合,则
addAll
操作会有效地修改此集合,以使其值为两个集合的并集。
我不能只使用=
设置值,因为setter中传递的参数是一个集合,而ObservableSet
是一个内部包装器,外部对此一无所知。我还想避免clear
然后addAll
。
答案 0 :(得分:2)
正如您在ObservableSet
的Javadoc中所看到的,没有这样的方法。
事实上,方法ObservableList::setAll
只是一个方便的“捷径”:
清除ObservableList并添加集合中的所有元素。
JavaFX中的常见实现ModifiableObservableListBase
执行clear
然后addAll
:
@Override
public boolean setAll(Collection<? extends E> col) {
beginChange();
try {
clear();
addAll(col);
} finally {
endChange();
}
return true;
}
拥有setAll
快捷方式的主要优点是只有一个“大”change event (ListChangeListener.Change
)被发送给听众。更好的表现。
事实上,您可能希望使用自己的com.sun.javafx.collections.ObservableSetWrapper
扩展setAll
,但由于事件SetChangeListener.Change
是基本更改,因此不会带来任何性能优势:m
删除了活动,并发送了n
个已添加的活动。
所以你别无选择:
set.clear();
set.addAll(otherSet);
或复制一个新集并指定:
set = FXCollections.observableSet(otherSet);