Адаптер JavaFx ObservableSet

У меня есть клиент JavaFx. Я использую в качестве модели bean-компонент с полем ObservableSet as. Я хочу отобразить эти данные в ListView и не могу изменить тип своего поля на ObservableList.

Я думаю, что мне следует написать своего рода адаптер, чтобы адаптировать мой ObservableSet к ObservableList (потому что этого требует ListView).

Используя ObservableList, код:

listView.setItems(myBean.getMyEntitiesList());

Мне нужно установить элементы таким же образом, потому что список данных поступает с сервера лениво, поэтому мне нужно, чтобы пользовательский интерфейс обновлялся при поступлении данных.

Кто-то может дать мне некоторое представление о том, как реализуется такой адаптер?


person drenda    schedule 21.01.2016    source источник


Ответы (1)


Вы можете добавить слушателя в набор и обновить список, когда он изменится:

ObservableList<T> items = FXCollections.observableArrayList(myBean.getMyEntitiesList());

myBean.getMyEntitiesList().addListener((Change<? extends T> change) -> {
    if (change.wasAdded()) {
        items.add(change.getElementAdded());
    }
    if (change.wasRemoved()) {
        items.remove(change.getElementRemoved());
    }
});

listView.setItems(items);

Очевидно, замените T любым фактическим типом элементов в вашем списке/наборе.

person James_D    schedule 21.01.2016
comment
Хороший совет, я попробовал, но строка выдает исключение: исключение в потоке JavaFX Application Thread java.lang.NullPointerException в com.sun.javafx.collections.ObservableSetWrapper$1.hasNext(ObservableSetWrapper.java:214) в java.util.AbstractCollection .addAll(AbstractCollection.java:343) в javafx.collections.ModifiableObservableListBase.addAll(ModifiableObservableListBase.java:99) в javafx.collections.FXCollections.observableArrayList(FXCollections.java:341) - person drenda; 22.01.2016
comment
Предположительно, вы знаете, как отлаживать исключение нулевого указателя. Очевидно, что никто не может отладить его из фрагмента трассировки стека, который вы показали. Если вы редактируете свой вопрос с помощью минимально воспроизводимый пример, я могу дать вам ответ в контексте. - person James_D; 22.01.2016
comment
Вы правы @James_D, к сожалению, количество символов для комментариев ограничено, и добавьте их в вопрос. Это не показалось хорошей идеей. - person drenda; 22.01.2016
comment
Таким образом, очевидным решением было бы создать минимально воспроизводимый пример :). - person James_D; 22.01.2016
comment
Вы снова правы. Я попытался упростить свой код и сделать пример MCV :-) - person drenda; 22.01.2016