Fez*_*udo 1 javafx set tableview javafx-8
我已经开发了一些代码,我有一个Set的UserS:
public class ParkCentral{
private Set<User> users = new HashSet<>();
}
Run Code Online (Sandbox Code Playgroud)
然后,在另一个类中,我正在开发GUI和的TableView User。问题是我无法从中创建ObervableList一个Set。我希望所做的更改ParkCentral.users将反映在TableView上。
是否可以在不更改ParkCentral实现的情况下而不更改Setto List?
为什么TableView仅适用于ObservableList而不适用于ObservableSet或ObservableMap?
为什么TableView仅适用于ObservableList而不适用于ObservableSet或ObservableMap?
A TableView呈现有序的项目集合。既不Map
也不Set满足这些要求(除了一些实现)。
可以聆听中的更改,Set并在中进行适当的更改List。暂时不可能做到HashSet;根本没有办法观察这个收藏;进行更改后,您始终需要手动更新列表。
ObservableSet相反,使用a 允许您添加一个监听器,该监听器可以对列表进行更新。
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);
}
}
Run Code Online (Sandbox Code Playgroud)
用法示例:
public class ParkCentral{
private ObservableSet<User> users = FXCollections.observableSet(new HashSet<>());
}
Run Code Online (Sandbox Code Playgroud)
new SetContentBinding(parkCentral.getUsers(), tableView.getItems());
Run Code Online (Sandbox Code Playgroud)