select

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

XML-элемент

select

Java-класс

JmixSelect

Основы

select похож на comboBox.

Используйте select, когда:

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

  • Список должен быть компактным. Это может быть полезно, если список элементов слишком длинный для radioButtonGroup.

Простейший случай использования select - это выбор значения из перечисления:

<select itemsEnum="io.jmix.uisamples.entity.CustomerGrade"
        emptySelectionAllowed="true" emptySelectionCaption="Empty"/>

select связанный с данными

Используйте атрибуты dataContainer и property, чтобы связать select с атрибутом сущности. Контейнер данных предоставляет экземпляр сущности, а property указывает редактируемый атрибут.

По умолчанию Jmix Studio генерирует select при создании экрана деталей сущности с атрибутом типа перечисления. Например, сущность User имеет атрибут onboardingStatus типа OnboardingStatus, который является перечислением.

XML
<data>
    <instance id="customerDc"
              class="io.jmix.uisamples.entity.Customer"
              fetchPlan="_local"/>
</data>
<layout>
    <select id="select" label="Grade" dataContainer="customerDc" property="grade"/>
    <hbox>
        <span text="Value in the container:"/>
        <span id="spanValue"/>
    </hbox>
</layout>
Java
@ViewComponent
protected InstanceContainer<Customer> customerDc;
@ViewComponent
protected Span spanValue;

@Autowired
protected Metadata metadata;

@Subscribe
protected void onInit(InitEvent event) {
    Customer customer = metadata.create(Customer.class);
    customer.setGrade(CustomerGrade.PREMIUM);
    customerDc.setItem(customer);
}

@Subscribe("select")
protected void onSelectValueChange(
        ComponentValueChangeEvent<JmixSelect<CustomerGrade>, CustomerGrade> changeEvent) {
    spanValue.setText(customerDc.getItem().getGrade().name());
}

В следующем примере показано, как использовать компонент select для выбора отдела, к которому принадлежит пользователь:

<data>
    <instance class="com.company.onboarding.entity.User"
              id="userDc"> (1)
        <fetchPlan extends="_base"> (2)
            <property name="department" fetchPlan="_base"/>
        </fetchPlan>
        <loader id="userDl"/>
    </instance>
    <collection class="com.company.onboarding.entity.Department"
                id="departmentsDc"> (3)
        <fetchPlan extends="_base"/>
        <loader id="departmentsDl">
            <query>
                <![CDATA[select e from Department e]]>
            </query>
        </loader>
    </collection>
</data>
<facets>
    <dataLoadCoordinator auto="true"/> (4)
</facets>
<layout>
    <select dataContainer="userDc"
            property="department"
            itemsContainer="departmentsDc"/> (5)
</layout>
1 Контейнер данных для хранения экземпляра User, который в данный момент редактируется.
2 Фетч-план расширен для получения коллекции экземпляров Department, которые будут доступны для выбора.
3 Контейнер данных для хранения коллекции всех существующих экземпляров Department.
4 Координатор загрузки данных для автоматического предоставления компоненту экземпляров для выбора.
5 Привязка компонента к контейнеру данных и свойству. Указание коллекции экземпляров для выбора с использованием атрибута itemsContainer.

Формирование списка опций

Для установки списка элементов select используйте следующие методы:

Список элементов

<select id="selectItems" datatype="int"/>

Метод setItems() позволяет вам программно задать элементы компонента.

@ViewComponent
private JmixSelect<Integer> selectItems;

@Subscribe
public void onInit(final InitEvent event) {
    selectItems.setItems(1, 2, 3, 4, 5);
}

Список элементов с описаниями

<select id="selectMaps" datatype="int"/>

ComponentUtils.setItemsMap() позволяет вам явно указать строковое описание для каждого значения элемента.

@ViewComponent
private JmixSelect<Integer> selectMaps;

@Subscribe
public void onInit(final InitEvent event) {
    Map<Integer, String> map = new LinkedHashMap<>();
    map.put(2, "Poor");
    map.put(3, "Average");
    map.put(4, "Good");
    map.put(5, "Excellent");
    ComponentUtils.setItemsMap(selectMaps, map);
}

Список значений перечисления

Значения перечисления можно задать как элементы select декларативно или программно.

В следующем примере показан декларативный подход.

<select itemsEnum="io.jmix.uisamples.entity.CustomerGrade"
        emptySelectionAllowed="true" emptySelectionCaption="Empty"/>

Пример ниже использует программный подход.

@ViewComponent
private JmixSelect<DayOfWeek> selectEnum;

@Subscribe
public void onInit(final InitEvent event) {
    selectEnum.setItems(DayOfWeek.class);
}

Неактивные элементы списка

Элементы списка могут быть отключены, чтобы указать, что они недоступны для выбора, но могут быть выбраны при других условиях.

itemEnabledProvider позволяет динамически управлять состоянием включения отдельных элементов в зависимости от определённых условий. Отключенные элементы отображаются серым цветом и не могут быть выбраны пользователем. По умолчанию все элементы включены.

@Install(to = "select", subject = "itemEnabledProvider")
private boolean selectItemEnabledProvider(final Department department) {
    return department == null || department.getHrManager() != null;
}

Элемент пустого выбора

Компонент select может отображать пустой элемент выбора. Это удобно, если требуется значение по умолчанию или состояние «ничего не выбрано».

Атрибут emptySelectionAllowed устанавливает, разрешено ли пользователю ничего не выбирать. При установке значения true пользователю показывается специальный пустой элемент.

Элемент пустого выбора можно настроить с помощью атрибута emptySelectionCaption.

<select itemsEnum="io.jmix.uisamples.entity.CustomerGrade"
        emptySelectionAllowed="true" emptySelectionCaption="Empty"/>

Атрибут emptySelectionCaption задаёт подпись для пустого выбора, когда пустойSelectionAllowed = истина. Эта подпись отображается для элемента пустого выбора в выпадающем списке.

Когда выбран пустой элемент, select отображает подпись, которую itemLabelGenerator возвращает для значения null. Если генератор не задан, отображается строка из атрибута placeholder либо пустая строка.

@Install(to = "sizeSelect", subject = "itemLabelGenerator")
private String sizeSelectItemLabelGenerator(final String t) {
    return t != null ? t : sizeSelect.getEmptySelectionCaption();
}

Настройка отображения элементов

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

@Install(to = "customItemsSelect", subject = "itemLabelGenerator")
private String customItemsSelectItemLabelGenerator(final Department t) {
    return t.getHrManager() != null
            ? t.getName() + "[Manager: " + t.getHrManager().getFirstName() +
            " " + t.getHrManager().getLastName() + "]"
            : t.getName();
}

itemLabelGenerator управляет как метками для каждого элемента в выпадающем списке, так и текстом, отображаемым в поле ввода компонента select, когда выбран элемент.

textRenderer управляет метками, отображаемыми в выпадающем списке для каждого элемента.

@Install(to = "departmentSelect", subject = "textRenderer")
private String departmentSelectTextRenderer(final Department t) {
    return t.getName() + ", number #" + t.getNum();
}
textRenderer не влияет на текст, отображаемый в поле ввода компонента select после выбора элемента.

Рендеринг элементов

Можно настроить рендеринг элементов. Рендерер применяется к каждому элементу для создания компонента, который представляет этот элемент.

Для этого можно использовать метод setRenderer() или аннотацию @Supply.

@Autowired
private UiComponents uiComponents;

@Supply(to = "selectWithRenderer", subject = "renderer") (1)
private ComponentRenderer<Button, Department> selectWithRendererRenderer() {
    return new ComponentRenderer<>(item -> { (2)
        Button button = uiComponents.create(Button.class); (3)
        button.setText(item.getName());
        button.setIcon(VaadinIcon.DESKTOP.create());
        return button; (4)
    });
}
1 @Supply привязывает рендерер к selectWithRenderer.
2 Функция получает текущий элемент.
3 Экземпляр компонента создаётся и настраивается в этом же обработчике.
4 Функция возвращает компонент для текущего элемента.

В качестве альтернативы вы можете отображать элементы, используя вложенный элемент fragmentRenderer. Дополнительную информацию смотрите в разделе Рендерер фрагментов.

Оверлей

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

Атрибут overlayClass позволяет вам добавлять пользовательские CSS-классы к элементу оверлея.

<select itemsEnum="com.company.onboarding.entity.DayOfWeek"
        overlayClass="my-custom-overlay"/>

Определите свой собственный стиль в вашем CSS-файле:

vaadin-select-overlay.my-custom-overlay::part(overlay){
    background-color: #ecfcf9;
    border-radius: 5px;
}

Варианты темы

Используйте атрибут themeNames, чтобы применить один или несколько вариантов темы.

Вариант Описание Поддерживается в

align-left

Выравнивает значение поля по левому краю.

Aura, Lumo

align-center

Выравнивает значение поля по центру.

Aura, Lumo

align-right

Выравнивает значение поля по правому краю.

Aura, Lumo

align-start

Выравнивает значение поля по начальной стороне с учетом текущего направления текста.

Aura

align-end

Выравнивает значение поля по конечной стороне с учетом текущего направления текста.

Aura

helper-above-field

Размещает вспомогательный текст над полем, под меткой.

Aura, Lumo

small

Уменьшает размер компонента.

Aura, Lumo

Атрибуты

select имеет следующие уникальные атрибуты:

Имя Описание По умолчанию

emptySelectionAllowed

Устанавливает, разрешено ли пользователю ничего не выбирать. См. Пустой элемент выбора.

false

emptySelectionCaption

Устанавливает пустой заголовок выбора при emptySelectionAllowed = true. См. Пустой элемент выбора.

Пустая строка ""

itemsContainer

Определяет контейнер данных, содержащий список элементов. Компонент отображает имя экземпляра сущности. См. второй пример в Привязка данных.

itemsEnum

Определяет класс перечисления для создания списка элементов. См. Перечисление предметов.

noVerticalOverlap

При false наложение отображается поверх поля ввода. При true наложение не закрывает поле ввода. См. это в Vaadin documentation.

false

overlayClass

Определяет список имен классов CSS, разделенных пробелами, для установки в элементе наложения. См. Overlay.

overlayWidth

Определяет ширину наложения. Если этот параметр опущен (по умолчанию), наложение автоматически регулирует свою ширину в соответствии с самым широким параметром или, по крайней мере, с шириной поля ввода. См. это в Vaadin documentation.

select имеет следующие общие атрибуты:

Обработчики

select имеет следующие уникальные обработчики:

Имя Описание

InvalidChangeEvent

com.vaadin.flow.component.select.Select.InvalidChangeEvent отправляется при изменении состояния invalid.

OpenedChangeEvent

com.vaadin.flow.component.select.Select.OpenedChangeEvent отправляется при изменении состояния наложения opened.

itemEnabledProvider

itemEnabledProvider применяется к каждому элементу этого select, чтобы определить, должен ли этот элемент быть включен (true) или отключен (false). См. Отключенные элементы.

itemLabelGenerator

Позволяет настроить метки, отображаемые для каждого элемента. См. Настройка меток предметов.

renderer

Устанавливает средство визуализации элемента для этой выбранной группы. Средство визуализации применяется к каждому элементу для создания компонента, который представляет параметр элемента в раскрывающемся списке выбора. См. Рендеринг предметов.

textRenderer

Это средство визуализации для преобразования элемента в строку. См. Настройка меток предметов.

validator

Проверяет значение компонента.

select имеет следующие общие обработчики:

Элементы

Компонент select может содержать следующие вложенные элементы: fragmentRenderer, prefix, и tooltip.

Смотрите также