Ответ 1
Является первым ComboBox в режиме "немедленного"?
Если нет, возможно, это должно быть: component.setImmediate(true).
См. https://vaadin.com/book/-/page/components.selection.html
У меня есть небольшое приложение Vaadin v8, которое имеет несколько полей ввода (комбинированные списки, группы выбора и т.д.). Содержание большинства из них определяется выбранным содержимым первого ComboBox. Однако, когда я выбираю что-то в нем, все остальные остаются пустыми, пока я не нажму один, и в этот момент все они обновляются. Это нежелательное поведение, но я предполагаю, что оно вызвано обновлением на стороне сервера, но не обновлением представления на стороне клиента. (Даже при добавлении requestRepaint() в мой первый Combobox ValueChangeListener)
Должен быть какой-то метод, чтобы заставить Vaadin получать данные, которые я хочу, чтобы они отображались, даже если другие компоненты не нажаты?
РЕДАКТИРОВАТЬ Мне не разрешено так скоро публиковать ответы на свой вопрос, поэтому я временно выкладываю его здесь:
Я обнаружил, что существует метод javascript, который синхронизирует клиента и сервера.
myComponent.getApplication().getMainWindow().executeJavaScript("javascript:vaadin.forceSync();");
Единственная проблема, с которой я столкнулся сейчас, заключается в том, что ValueChangeListener в одном из моих списков срабатывает, только когда я щелкаю другой список (или тот же самый дважды). Это самая странная вещь, потому что второй комбобокс при загрузке прекрасно запускает событие.
Является первым ComboBox в режиме "немедленного"?
Если нет, возможно, это должно быть: component.setImmediate(true).
См. https://vaadin.com/book/-/page/components.selection.html
Существует хак, который вы можете использовать, если вы установили источник данных для своих компонентов, который заставляет ваадин повторно отображать их. Я использую это для обновления таблиц с динамическими данными
yourcomponent.setContainerDataSource(yourcomponent.getContainerDataSource());
У меня была такая же проблема, смотрите ниже, как это можно сделать в версии 8.0.5 (с 2017 года):
@Push
public class WebUi extends UI {
public void fireComponentUpdated() {
getUI().push();
}
}
Вы запросилиRepaint на правильных компонентах?
Имейте в виду, что requestRepaint
помещает компонент как грязный, но не означает, что он будет перекрашен - клиент может быть обновлен только тогда, когда он делает запрос на сервер.
Смотрите эту тему https://vaadin.com/forum/-/message_boards/view_message/231271 для получения дополнительной информации о ваших вариантах (она касается обновления пользовательского интерфейса из-за обработки фоновых потоков).
В Vaadin 7 достаточно поставить эту строку в основной метод UI.init(VaadinRequest):
UI.getCurrent().setPollInterval( 1000 );
если вы хотите обновить свой интерфейс (в этом случае) каждую секунду. Таким образом вы инструктируете пользовательский интерфейс для опроса сервера для изменений в определенном интервале.
Остерегайтесь, чрезмерный трафик сервера может быть проблемой, если у вас много пользователей, которые используют ваше приложение одновременно.
В Vaadin 6 вам придется играть с ProgressIndicator (который может быть невидимым, если вы хотите) и попытаться сделать то же, что и UI.getCurrent(). setPollInterval (int) в Vaadin 7 делает.