Методы экранов
В этой секции описаны некоторые методы базовых классов экранов, которые можно вызывать или переопределять в коде приложения.
Методы всех экранов
-
close()- запрашивает закрытие экрана с переданным результатом - значением перечисленияStandardOutcomeили объектомCloseAction.@Subscribe("discardButton") public void onDiscardButtonClick(ClickEvent<Button> event) { close(StandardOutcome.DISCARD); }Значение параметра передается в события BeforeCloseEvent и AfterCloseEvent, поэтому информация о причине закрытия экрана может быть получена в слушателях.
-
closeWithDefaultAction()- запрашивает закрытие экрана с результатомStandardOutcome.CLOSE.
-
setPreventBrowserTabClosing()- устанавливает, должен ли этот экран предотвращать случайное закрытие вкладки браузера, если свойство jmix.ui.view.prevent-browser-tab-closing установлено вtrue(по умолчаниюfalse). Включено по умолчанию для экранов деталей. -
getViewData()- возвращает объектViewData, который служит реестром всех компонентов данных, определенных в XML-дескрипторе экрана. Вы можете использовать его методloadAll(), чтобы запустить все загрузчики данных экрана:@Subscribe public void onReady(final ReadyEvent event) { getViewData().loadAll(); } -
getViewAttributes()- возвращает объектViewAttributes, который служит хранилищем именованных значений. ИспользуетVaadinSessionдля хранения. Например, экран деталей используетViewAttributesдля хранения состояния только чтение и статуса блокировки и возвращения этих установок при обновлении экрана. -
getPageTitle()- возвращает заголовок экрана. По умолчанию возвращает локализованное значение, определенное в XML-дескрипторе экрана. Может быть переопределен для динамического предоставления заголовка, например:@Override public String getPageTitle() { User user = getEditedEntity(); return entityStates.isNew(user) ? messageBundle.getMessage("newUserTitle") : messageBundle.formatMessage("editUserTitle", metadataTools.getInstanceName(user)); } -
beforeLeave()- callback, который выполняется перед переходом на другой экран. Часть жизненного цикла навигации Vaadin.-
Событие позволяет отложить, отменить или изменить адрес перехода.
-
Не выполняется, когда экран открывается в диалоговом режиме.
-
Не должен быть переопределен без вызова метода
super(), т.к. базовая реализация выполняет код, связанный с фреймворком.
-
-
beforeEnter()- callback, который выполняется перед переходом на экран. Часть жизненного цикла навигации Vaadin.-
Может использоваться для получения объекта
Locationи изменения адреса для перехода на другой экран. -
Не выполняется, когда экран открывается в диалоговом режиме.
-
Не должен быть переопределен без вызова метода
super(), т.к. базовая реализация выполняет код, связанный с фреймворком.
-
-
afterNavigation()- callback, который выполняется после завершения навигации. Часть жизненного цикла навигации Vaadin.-
Может использоваться для получения объекта
Location. -
Не выполняется, когда экран открывается в диалоговом режиме.
-
Не должен быть переопределен без вызова метода
super(), т.к. базовая реализация выполняет код, связанный с фреймворком.
-
Методы StandardListView
-
closeWithDiscard()- запрашивает закрытие экрана с результатомStandardOutcome.DISCARD. -
getLookupComponent() / findLookupComponent()- возвращает компонент для получения значения из данного экрана списка. По умолчанию, возвращает компонент сid, указанным в аннотации @LookupComponent. -
setSelectionValidator()- устанавливает предикат, который проверяет, могут ли выбранные элементы быть обработаныSelectionHandler. -
setSelectionHandler()- устанавливает callback, который обрабатывает выбранные элементы. По умолчанию, добавляет элементы в collection container, если просмотр списка открыт для компонента dataGrid или устанавливает одиночное значение, если экран списка открыт для поля, например entityPicker.DialogWindow<View<?>> dialog = dialogWindows.lookup(ProjectDetailView.this, User.class) (1) .withSelectHandler(users -> { (2) for (User user : users) { ProjectParticipant projectParticipant = dataManager.create(ProjectParticipant.class); projectParticipant.setUser(user); projectParticipant.setProject(getEditedEntity()); projectParticipant.setRole(projectRole); participantsDc.getMutableItems().add(projectParticipant); } }) .build(); View<?> view = dialog.getView(); if (view instanceof MultiSelectLookupView multiSelectLookupView) { (3) multiSelectLookupView.setLookupComponentMultiSelect(true); } dialog.open();1 Создание билдера экрана списка, не связанного с каким-либо UI-компонентом. 2 Задание обработчика выбора для экрана списка. 3 Проверка, поддерживает ли данный экран списка множественный выбор.
Методы StandardDetailView
-
getEditedEntity()- когда экран открыт, возвращает экземпляр редактируемой сущности. Это экземпляр, который установлен в контейнер данных, указанный в аннотации @EditedEntityContainer.В слушателе InitEvent этот метод возвращает
null. В слушателе BeforeShowEvent этот метод возвращает экземпляр, переданный экрану для редактирования (позже в процессе открытия экрана сущность перезагружается и в контейнер данных устанавливается другой экземпляр).
Методы, которые можно использовать для закрытия экрана деталей:
-
closeWithSave()- проверяет и сохраняет изменения, затем закрывает экран с результатомStandardOutcome.SAVE. Вы можете вызвать этот метод из слушателя события (например, ClickEvent) или добавить в экран встроенное действиеdetail_saveClose. -
closeWithDiscard()- игнорирует любые несохраненные изменения и закрывает экран с результатомStandardOutcome.DISCARD. Вы можете вызвать этот метод из слушателя события (например, ClickEvent) или добавить в экран встроенное действиеdetail_discard.
Если экран закрывается с помощью close(StandardOutcome.CLOSE) или closeWithDefaultAction() и имеет несохраненные изменения в DataContext, то перед закрытием экрана будет отображен диалог с соответствующим сообщением. Тип уведомления можно настроить с помощью свойства приложения jmix.ui.view.use-save-confirmation. Если вы используете методы closeWithDiscard() или close(StandardOutcome.DISCARD), несохраненные изменения игнорируются без какого-либо сообщения.
-
hasUnsavedChanges()- возвращаетtrue, если в экране есть несохраненные изменения. Реализация по умолчанию проверяет, есть ли удаленные или измененные сущности вDataContext. Если только новые сущности были зарегистрированы как измененные вDataContext, проверяет, были ли они изменены с момента открытия экрана. Этот метод можно переопределить и провести дополнительные проверки, или пропустить проверку и просто вернутьfalse. -
save()- валидирует и сохраняет изменения без закрытия экрана. Вы можете вызвать этот метод из слушателя события (например, ClickEvent) или добавить в экран встроенное действиеdetail_save. Кроме того, методsave()можно переопределить для выполнения некоторых операций после сохранения данных, например:@Override public OperationResult save() { return super.save() (1) .then(() -> { // ... (2) }); }1 Вызов базового метода для выполнения стандартной логики. 2 Выполнение дополнительных действий после сохранения данных. -
setReloadSaved(boolean)- устанавливает, должен ли редактируемый экземпляр сущности быть перезагружен после вызова closeWithSave() метода. По умолчаниюfalse.Этот метод вызывается фреймворком со значением
true, когда экран открывается в диалоговом режиме, для возврата сохраненного экземпляра из открытого экрана. Если вам не нужно перезагружать сохраненный экземпляр в диалоговом режиме, вызовитеsetReloadSaved(false)в слушателе ReadyEvent. -
setShowSaveNotification(boolean)- устанавливает, должно ли быть показано уведомление при успешном сохранении. По умолчаниюtrue. -
setShowValidationErrors(boolean)- устанавливает, должны ли быть показаны ошибки после валидации компонентов с помощью метода showValidationErrors(). По умолчаниюtrue. -
setCrossFieldValidationEnabled(boolean)- устанавливает, должна ли выполняться кросс-проверка полей перед сохранением изменений. Использует группу ограниченийUiCrossFieldChecksдля проверки экземпляра сущности. По умолчаниюtrue. -
getLockStatus()- Возвращает статус пессимистической блокировки текущего редактируемого экземпляра сущности. Возможные варианты:-
LockStatus.NOT_SUPPORTED- если сущность не поддерживает пессимистическую блокировку. -
LockStatus.LOCKED- если экземпляр сущности успешно заблокирован. -
LockStatus.FAILED- если блокировка не удалась из-за того, что сущность уже заблокирована другим пользователем.
-