Экраны

Экран (view) — это базовый строительный блок пользовательского интерфейса приложения. Он является корнем иерархии визуальных компонентов, кроме того, он может содержать компоненты данных, действия и фасеты.

Экран определяется классом Java. Класс экрана обычно имеет соответствующий XML-файл, называемый дескриптором, который определяет содержимое экрана. Таким образом, существует четкое разделение между декларативной компоновкой элементов экрана, определенной в XML, и логикой программной инициализации и обработки событий, написанной на Java.

Классы экранов

Jmix предоставляет следующие базовые классы экранов:

views diagram

View

Класс View определяет состояние и поведение всех разновидностей экранов.

StandardMainView

StandardMainView - это корневой экран приложения, который открывается после входа пользователя в систему. Он содержит компонент AppLayout с главным меню.

main view 1

StandardView

StandardView является базовым классом для обычных экранов. Такие экраны могут отображаться либо внутри основного экрана с помощью навигации на URL экрана, либо во всплывающем диалоговом окне.

Ниже приведен стандартный экран, открытый с использованием URL /my-onboarding:

standard view 1

StandardListView

StandardListView - это базовый класс для экранов CRUD, отображающих список сущностей. Его также можно использовать в качестве экрана поиска для выбора экземпляров сущностей из списка и возврата их вызывающему объекту. В представлении списка обычно используются компоненты dataGrid или treeDataGrid.

Ниже представлен экран списка, открытый с использованием URL /departments:

list view 1

Этот же экран, открытый в диалоге для выбора сущностей:

list view 2

StandardDetailView

StandardDetailView - это базовый класс для экранов CRUD, отображающих один экземпляр сущности. Экран деталей обычно использует компонент formLayout.

Ниже приведен экран деталей, открытый с использованием идентификатора объекта в URL:

detail view 1

Тот же экран, открытый в диалоговом окне:

detail view 2

Аннотации экранов

Аннотации на классах экранов предоставляют информацию об экранах фреймворку. Некоторые аннотации применимы к любому типу экрана, некоторые из них можно использовать только в экранах списков или деталей сущностей.

Общие аннотации

@ViewController("MyOnboardingView")
@ViewDescriptor("my-onboarding-view.xml")
@Route(value = "my-onboarding", layout = MainView.class)
@DialogMode(width = "AUTO", height = "AUTO")
public class MyOnboardingView extends StandardView {
  • @ViewController указывает, что класс является экраном. Значением аннотации является идентификатор экрана, который можно использовать для ссылки на экран из главного меню или при программном открытии экрана.

  • @ViewDescriptor соединяет класс экрана с его XML-дескриптором. Значение аннотации указывает путь к файлу дескриптора. Если значение содержит только имя файла, предполагается, что файл находится в том же пакете, что и класс экрана.

  • @com.vaadin.flow.router.Route определяет URL-путь для перехода к этому экрану. Поскольку экран должен открываться внутри основного экрана, layout атрибут указывает класс основного экрана.

  • @DialogMode определяет параметры диалогового окна, когда экран открывается как диалог.

Аннотации экранов списка

// common annotations
@ViewController("Department.list")
@ViewDescriptor("department-list-view.xml")
@Route(value = "departments", layout = MainView.class)
@DialogMode(width = "50em", height = "37.5em")
// list view annotations
@LookupComponent("departmentsTable")
@PrimaryLookupView(Department.class)
public class DepartmentListView extends StandardListView<Department> {
  • @LookupComponent указывает идентификатор компонента UI, который будет использоваться для получения значения, возвращаемого в результате поиска.

  • @PrimaryLookupView указывает, что этот экран является экраном поиска по умолчанию для указанной сущности. Аннотация имеет больший приоритет, чем соглашение {entity_name}.lookup / {entity_name}.list.

Аннотации экранов деталей

// common annotations
@ViewController("Department.detail")
@ViewDescriptor("department-detail-view.xml")
@Route(value = "departments/:id", layout = MainView.class)
// detail view annotations
@EditedEntityContainer("departmentDc")
@PrimaryDetailView(Department.class)
public class DepartmentDetailView extends StandardDetailView<Department> {
  • @EditedEntityContainer указывает контейнер данных, содержащий редактируемую сущность.

  • @PrimaryDetailView указывает, что этот экран является экраном деталей по умолчанию для указанной сущности. Аннотация имеет больший приоритет, чем соглашение {entity_name}.edit.