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

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

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

  • 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 - если блокировка не удалась из-за того, что сущность уже заблокирована другим пользователем.