如何使用Set作为TableView的基础

Fez*_*udo 1 javafx set tableview javafx-8

我已经开发了一些代码,我有一个SetUserS:

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?

fab*_*ian 5

为什么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)