Я пытаюсь обновить сетку в Vaadin после внесения изменений в сетку из другого экземпляра пользовательского интерфейса.Как обновить сетку Ваадина после нажатия?
Чтобы разработать, у меня есть два разных экземпляра пользовательского интерфейса, UI1 и UI2 (вкладки из двух разных браузеров). Эти экземпляры пользовательского интерфейса содержат представление, содержащее сетку, состоящую из объектов Contact, которые имеют различные свойства, такие как имя, возраст, пол ...
Я добавляю контакт в сетку из UI1, и я хочу, чтобы UI2 увидел обновленную сетку мгновенно, без необходимости обновления.
Для этого я знаю, что мне нужно использовать Vaadin Push, который я уже настроил с использованием класса Broadcaster. У меня есть метод receiveBroadcast()
в моем классе пользовательского интерфейса, который будет обновлять пользовательский интерфейс, когда класс View отправляет широковещательную передачу в пользовательские интерфейсы с использованием метода broadcast()
. Часть моего класса пользовательского интерфейса выглядит следующим образом:
@Title("Contact Book")
@Theme("reindeer")
@Push
public class UserInterface extends UI implements BroadcastListener{
private Navigator navigator;
@Override
protected void init(VaadinRequest request){
navigator = new Navigator(this, this);
navigator.addView(ContactBookView.NAME, new ContactBookView());
Broadcaster.register(this);
}
@Override
public void detach(){
Broadcaster.unregister(this);
super.detach();
}
@Override
public void receiveBroadcast(Grid grid) {
access(()->{
// update grid here
Notification.show("Grid updated", Notification.Type.TRAY_NOTIFICATION);
});
}
}
И мой класс Broadcaster как то же самое в this link (я просто изменил методы немного, чтобы я мог пройти сетку в качестве параметра)
Тогда в мой класс ContactBookView я вызываю метод Broadcaster.broadcast(grid)
после добавления или изменения элемента, так что я могу как-то обновить сетку в моем классе UI 'access()
, но ничего, что я пытался, похоже, работает. Я знаю, что push работает, потому что я вижу сообщение «Grid updated» во всех экземплярах пользовательского интерфейса, когда принимается трансляция.
Я попытался удалить представление и повторно инициализировать
navigator.removeView(ContactBookView.NAME);
navigator.addView(ContactBookView.NAME, new ContactBookView());
Пробовал полностью опорожнить сетки и заправить
grid.removeAllColumns();
grid.setContainerDataSource(container);
Пытались заставить сетку обновить себя, используя этот уродливый обходной
grid.setContainerDataSource(grid.getContainerDataSource());
Пробовал выполнить запрос JavaScript, чтобы заставить пользовательские интерфейсы синхронизировать
JavaScript.getCurrent().execute("javascript:vaadin.forceSync();");
Но никто из них не работал. Может быть, я делаю что-то еще неправильно? FYI моя версия Vaadin - 7.5.0.
Я оценил бы любые отзывы или советы,
Спасибо.
Я вижу вашу точку зрения о методе «войти», но вещатель активируется нажатием кнопки, и я не использую метод «navigatoTo», пытаясь нажимать обновления между пользовательскими интерфейсами, поэтому я не могу понять, почему Мне нужно обновить сетку в методе «вводить», поскольку она вызывается только при вызове метода «navigateTo». – tk12