Методы контроллеров

В данном разделе описаны некоторые методы базовых классов контроллеров экранов, которые можно вызывать или переопределять в коде приложения.

Методы всех экранов

  • 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.