我应该在JavaFX ObservableSet集合的设置器中使用哪种方法来清除集合并将其初始化为给定的集合? ObservableList具有setAll(Collection)方法,该方法用于通过首先清除列表来初始化列表.
我所看到的最接近的是addAll(Collection),它不会事先清除设置.在我的项目中设置集合时,我希望它具有将ObservableSet设置为新集合的正常行为,但是根据javadoc:
Adds all of the elements in the specified collection to this set if they’re not already present (optional operation). If the specified collection is also a set, the
addAll
operation effectively modifies this set so that its value is the union of the two sets.
我不能只使用=来设置值,因为在setter中传递的参数是一个set,而ObservableSet是一个内部包装程序,外界对此一无所知.我也想避免先清除然后再添加全部.
解决方法:
如您在ObservableSet
的Javadoc中所见,没有这种方法.
实际上,方法ObservableList::setAll
只是一个方便的“快捷方式”:
Clears the ObservableList and add all elements from the collection.
JavaFX中的通用实现ModifiableObservableListBase
先清除然后再添加allAll:
@Override
public boolean setAll(Collection<? extends E> col) {
beginChange();
try {
clear();
addAll(col);
} finally {
endChange();
}
return true;
}
使用setAll快捷方式的主要优点是,只有一个“大” change event (ListChangeListener.Change
)被发送到侦听器.更好的性能.
实际上,您可能想用自己的setAll扩展com.sun.javafx.collections.ObservableSetWrapper,但是由于事件SetChangeListener.Change
是一项基本更改,因此不会带来性能上的好处:m个已删除事件,n个已添加事件将被发送.
因此,您别无选择:
set.clear();
set.addAll(otherSet);
或复制一个新的集合并分配:
set = FXCollections.observableSet(otherSet);