Обновление компонента из приемника событий Vaadin - PullRequest
3 голосов
/ 02 мая 2019

Мне интересно, как я могу обновить компонент в Vaadin при изменении данных из прослушивателя событий. Рассматриваемый код выглядит следующим образом:

Set<Long> identifiers = new LinkedHashSet<>();

Grid<Long> grid = new Grid<>(Long.class);
grid.addColumn((ValueProvider<Long, Long>) value -> value);
grid.setDataProvider(new ListDataProvider<>(identifiers));

TextField identifier = new TextField();
identifier.getElement().addEventListener("keyup", event -> {
  String value = event.getEventData().getString("element.value");
  if (value != null && value.length() > 0) {
    try {
      identifiers.add(Long.parseLong(value));
      identifier.clear();
    } catch (NumberFormatException e) {
      Notification.show("Not a valid identifier: " + value);
    }
  }
}).addEventData("element.value").setFilter("event.key == 'Enter'");

Событие отправляется так, как я ожидал, но сетка не отображается в пользовательском представлении. Как мне сообщить Ваадину, что сетка нуждается в повторной визуализации из обработчика событий?

1 Ответ

3 голосов
/ 02 мая 2019

Повторная визуализация сетки выполняется путем обновления DataProvider.Вы можете сделать это следующим образом:

grid.getDataProvider().refreshAll();

Редактировать: мое объяснение основано на неверных предположениях

ListDataProvider не копирует предоставленную коллекциюпоэтому изменение исходного набора элементов повлияет на поставщика данных.Но он не воспроизводится автоматически, вам все равно придется вызывать refreshAll().

refreshAll(), в основном повторять элементы поставщиков данных, перестраивать строки и повторно применять любые пользовательские определения столбцов (т. Е. StyleGenerators идругие государственные решения).Пока вы сохраняете оригинальную коллекцию в актуальном состоянии с тем, что вы хотите показать, вызов refreshAll() должен работать.

Если вы хотите полностью изменить показанный список элементов, вы можете удалить все элементы изисходную коллекцию (identifiers) и добавьте в нее новые элементы, затем обновите все, либо вы можете просто установить новый поставщик данных с новой коллекцией элементов.
(Эта строка также решит проблему OP, но должна бытьизбегать, если достаточно refreshAll.)

grid.setDataProvider(new ListDataProvider<>(otherIdentifiers));
...