2016-06-02 3 views
0

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

Легкий пример кода:

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); 

ответ

2

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

@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) заблокировать пользовательский интерфейс, когда он доступны из не- запрос поток.

+0

Работает до сих пор. Но теперь я могу только добавить строку из UI-класса правильно? Моя таблица и данные фактически находятся в классе, который расширяет 'window' – JeffStrongman

+1

Когда вы запускаете свой таймер, вы можете получить ссылку на текущий пользовательский интерфейс с' UI.getCurrent() ' – Raffaele

3

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