Методы контроллеров
В данном разделе описаны некоторые методы базовых классов контроллеров экранов, которые можно вызывать или переопределять в коде приложения.
Методы всех экранов
-
show()
- отображает экран. Данный метод обычно вызывается после создания экрана, как описано в разделе Открытие экранов. -
close()
- закрывает экран с переданным enum значениемStandardOutcome
или объектомCloseAction
. Например:@Subscribe("closeBtn") public void onCloseBtnClick(Button.ClickEvent event) { close(StandardOutcome.CLOSE); }
Значение параметра доступно в BeforeCloseEvent и AfterCloseEvent, поэтому информация о причине закрытия экрана может быть получена в слушателях этих событий. Подробная информация об использовании этих слушателей приведена в разделе Выполнение кода после закрытия и возврат значений.
-
getScreenData()
- возвращает объектScreenData
, в котором зарегистрированы все компоненты данных, объявленные в XML-дескрипторе экрана. МетодloadAll()
этого объекта можно вызывать для срабатывания всех загрузчиков данных экрана:@Subscribe public void onBeforeShow(BeforeShowEvent event) { getScreenData().loadAll(); }
Методы StandardEditor
-
getEditedEntity()
- когда экран открыт, возвращает экземпляр редактируемой сущности. Это экземпляр, установленный в контейнере данных, указанном аннотацией @EditedEntityContainer.В слушателях InitEvent и AfterInitEvent данный метод возвращает
null
. В слушателе BeforeShowEvent данный метод возвращает экземпляр, переданный в экран для редактирования (позднее в процессе открытия экрана сущность перезагружается, и другой ее экземпляр устанавливается в контейнере данных).
Для закрытия экрана редактирования можно использовать следующие методы:
-
closeWithCommit()
- валидирует и сохраняет данные, затем закрывает экран сStandardOutcome.COMMIT
. -
closeWithDiscard()
- игнорирует несохраненные изменения и закрывает экран сStandardOutcome.DISCARD
.
Если в экране есть несохраненные изменения в DataContext, при закрытии экрана отображается соответствующее сообщение. Вид данного сообщения можно настроить с помощью свойства приложения jmix.ui.screen.use-save-confirmation. Если экран закрывается методом closeWithDiscard()
или close(StandardOutcome.DISCARD)
то несохраненные изменения игнорируются без каких-либо сообщений.
-
commitChanges()
- сохраняет изменения не закрывая экран. Данный метод можно вызвать из собственного слушателя события (например нажатия кнопки), или переопределить слушатель действияwindowCommit
, чтобы выполнить какие-либо операции после сохранения данных, например:@Override protected void commit(Action.ActionPerformedEvent event) { commitChanges().then(() -> { commitActionPerformed = true; (1) // ... (2) }); }
1 Этот флажок используется для возврата правильного результата при последующем закрытии экрана. 2 Вы можете выполнять действия после сохранения данных. -
validateAdditionalRules()
можно переопределить для выполнения дополнительной валидации перед сохранением данных. Данный метод должен сохранить информацию об ошибках валидации в переданном ему объектеValidationErrors
. Впоследствии эта информация будет отображена вместе с ошибками стандартной процедуры валидации. Например:private Pattern pattern = Pattern.compile("\\s"); @Override protected void validateAdditionalRules(ValidationErrors errors) { if (getEditedEntity().getNum() != null) { if (pattern.matcher(getEditedEntity().getNum()).find()) { errors.add("Number cannot contain whitespaces"); } } super.validateAdditionalRules(errors); }
-
preventUnsavedChanges()
вызывается при закрытии экрана для предотвращения потери несохраненных данных. Стандартная реализация вызывает либо методshowUnsavedChangesDialog()
, либоshowSaveConfirmationDialog()
бина ScreenValidation, в зависимости от значения свойства jmix.ui.screen.use-save-confirmation.
Методы MasterDetailScreen
-
getEditedEntity()
- когда экран находится в режиме редактирования, возвращает экземпляр редактируемой сущности. Это экземпляр, установленный в контейнере данных компонентаform
. Если экран не в режиме редактирования, данный метод выбрасываетIllegalStateException
. -
Метод
validateAdditionalRules()
можно переопределить для выполнения дополнительной валидации перед сохранением данных, как описано выше дляStandardEditor
.