Ваадин обновляет сетку после добавления строки

Моя сетка не обновляется автоматически после добавления строки. Я пробовал несколько решений из других вопросов, но они не сработали. Например. grid.clearSortOrder(); и grid.markAsDirty();. Моя цель - добавлять строки после периодов времени. Поэтому я использую таймер, и строки добавляются, но сетка не обновляется, пока я не щелкну по таблице.

Пример простого кода:

Grid grid = new Grid();

grid.addColumn("Name");
grid.addColumn("Age");

Timer timer = new Timer();
timer.schedule(new TimerTask(){
    public void run(){
        grid.addRow("Exmaple","99");    
    }
}, 1000, 1000);

person JeffStrongman    schedule 02.06.2016    source источник


Ответы (2)


Обратные вызовы Vaadin запускаются взаимодействиями пользователя, такими как нажатие мыши на кнопку, выбор параметра и т. Д. Если вам нужен пользовательский интерфейс, чтобы отразить изменение, которое не было вызвано мышью / клавиатурой, вам необходимо включить отправка сервера:

@Push
public class App extends UI {

  @Override
  public void init(VaadinRequest request) {
    timer.schedule(new TimerTask() {
      public void run() {
        access(() -> grid.addRow("Example", "99"));
      }
    }, 1000, 1000);
  }
}

Обратите внимание на использование UI.access(Runnable) для блокировки пользовательского интерфейса при обращении к нему из потока без запроса.

person Raffaele    schedule 02.06.2016
comment
Пока работает. Но теперь я могу добавить строку только из класса UI, верно? Моя таблица и данные на самом деле находятся в классе, который расширяет window - person JeffStrongman; 02.06.2016
comment
Когда вы запускаете таймер, вы можете получить ссылку на текущий пользовательский интерфейс с помощью UI.getCurrent() - person Raffaele; 02.06.2016

Для этого вам понадобится серверный толчок. См. Vaadin-Doc-Serverpush. Вы хотите изменить пользовательский интерфейс из другого потока (Timer.schedule () будет выполняться в другом потоке).

person Thomas Philipp    schedule 02.06.2016