Методы экранов
В этой секции описаны некоторые методы базовых классов экранов, которые можно вызывать или переопределять в коде приложения.
Методы всех экранов
-
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
- если блокировка не удалась из-за того, что сущность уже заблокирована другим пользователем.
-