@StonedShaman
Шаман

JavaFX. Как сделать автоматическое обновление ListView, после операции изменения записи в нём?

Здравствуйте.
Пишу приложения на javafx. Столкнулся со следующей проблемой, и не могу понять что я делаю не так.

Для хранения данных использую
ObservableList<User> users = new FXCollections.observableArrayList();

Инициализирую в методе initialize() контроллера, отображение данных из класса User т.о.
// Controller
...
@FXML
private void initialize() {
    nameList.setCellFactory((ListView<User> userListView) -> new UsersFormatCell());
}
...


Класс UserFormatCell (по-чистому слизан из java-demo):
public class UsersFormatCell extends ListCell<User> {
    @Override
    public void updateItem(User user, boolean empty) {
        super.updateItem(user, empty);

        // format of the cell in list

        setText(user == null ? "" : user.getName());
    }
}


Класс User имеет поля StringProperty(в частности SimpleStringProperty), и соответствующий набор геттеров и сеттеров, т.е. может возвращать как String так и StringProperty значения, а установка значений проходит через StringProperty.

По идее использование, ObservableList дает возможность оповещать элементы GUI об изменениях, если поля класса модели используют интерфейс StringProperty. И это действительно так, если использовать TableView, то при любых операциях (добавления, изменения, удаления) с таблицей, обновление таблицы происходит автоматически. Однако, в случае ListView такого не происходит. Обновляется список в GUI, только после операции добавления и удаления, а при изменении ничего не происходит (т.е. само значение в ObservableList изменяется, но в GUI этого не видно, пока не добавиться новая запись или не удалиться старая).

Подскажите, пожалуйста, что же я упустил, или сделал не так.
  • Вопрос задан
  • 3179 просмотров
Пригласить эксперта
Ответы на вопрос 1
SibWol
@SibWol
Начинающий Java разработчик
Если я правильно понял Ваш вопрос, то Вам надо попробовать в том методе который вносит изменения в ListView повторно прописать nameList.setCellFactory(); аналогично как в initialize
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы