Почему TableView работает только с ObservableList, а не с ObservableSet или ObservableMap?
A TableView
представляет упорядоченную коллекцию предметов. Ни один Map
ни Set
не отвечают этим требованиям (за исключением некоторых реализаций).
Возможно прослушать изменения в Set
и внести соответствующие изменения в List
. Это невозможно только с HashSet
; просто нет возможности наблюдать за этой коллекцией; вам всегда нужно обновлять список вручную после внесения изменений.
Использование ObservableSet
позволяет вместо этого добавить прослушиватель, который обновляет список.
public class SetContentBinding<T> {
private final ObservableSet<T> source;
private final Collection<? super T> target;
private final SetChangeListener<T> listener;
public SetContentBinding(ObservableSet<T> source, Collection<? super T> target) {
if (source == null || target == null) {
throw new IllegalArgumentException();
}
this.source = source;
this.target = target;
target.clear();
target.addAll(source);
this.listener = c -> {
if (c.wasAdded()) {
target.add(c.getElementAdded());
} else {
target.remove(c.getElementRemoved());
}
};
source.addListener(this.listener);
}
/**
* dispose the binding
*/
public void unbind() {
source.removeListener(listener);
}
}
Пример использования:
public class ParkCentral{
private ObservableSet<User> users = FXCollections.observableSet(new HashSet<>());
}
new SetContentBinding(parkCentral.getUsers(), tableView.getItems());