comboBox
comboBox позволяет пользователям выбрать одно значение из предопределенного списка элементов.
| XML-элемент | 
 | 
|---|---|
| Java-класс | 
 | 
| Атрибуты | id - alignSelf - allowCustomValue - ariaLabel - ariaLabelledBy - autoOpen - autofocus - classNames - clearButtonVisible - colspan - css - dataContainer - datatype - enabled - errorMessage - focusShortcut - height - helperText - itemsEnum - label - maxHeight - maxWidth - minHeight - minWidth - overlayClass - pageSize - pattern - placeholder - property - readOnly - required - requiredMessage - tabIndex - themeNames - title - visible - width | 
| Обработчики | AttachEvent - BlurEvent - ClientValidatedEvent - ComponentValueChangeEvent - CustomValueSetEvent - DetachEvent - FocusEvent - itemLabelGenerator - itemsFetchCallback - renderer - statusChangeHandler - validator | 
| Элементы | itemsQuery - prefix - tooltip - validator | 
Основы
comboBox предоставляет возможность фильтровать значения по мере ввода текста пользователем, а также реализовать постраничный вывод доступных значений.
Используйте comboBox, когда вам нужны:
- 
Динамическая фильтрация. Вам необходимо, чтобы пользователи могли фильтровать элементы в выпадающем списке по мере ввода текста. comboBoxпредоставляет встроенные возможности фильтрации.
- 
Большие наборы данных. Вы работаете с большим количеством элементов в выпадающем списке. comboBoxобрабатывает пагинацию, позволяя отображать только ограниченное количество вариантов за раз, что повышает производительность.
- 
Настройка отображения. Вы хотите настроить внешний вид элементов в выпадающем списке, возможно, с дополнительной информацией или стилями. comboBoxпредлагает большую гибкость для настройки отображения элементов.
Простейший случай использования comboBox - это выбор значения перечисления для атрибута сущности. Например, сущность User имеет атрибут onboardingStatus типа OnboardingStatus, который является перечислением.
 
<data>
    <instance class="com.company.onboarding.entity.User" id="userDc"> (1)
        <fetchPlan extends="_base"/> (2)
        <loader id="userDl"/>
    </instance>
</data>
<layout>
    <comboBox id="comboBox"
              label="Onboarding status"
              dataContainer="userDc"
              property="onboardingStatus"/> (3)
</layout>| 1 | InstanceContainerдля сущностиUser. | 
| 2 | Встроенный план выборки экземпляра сущности, находящегося в контейнере. | 
| 3 | Привязка компонента к контейнеру данных и свойству. Атрибут dataContainerсодержит ссылку на контейнер данныхuserDc, а атрибутpropertyссылается на атрибут сущностиonboardingStatus. | 
Пользовательские элементы
Список элементов
Вы можете задать список элементов comboBox с помощью метода setItems().
Сначала объявите компонент в XML-дескрипторе:
<data>
    <instance class="com.company.onboarding.entity.Step" id="stepDc">
        <fetchPlan extends="_base"/>
        <loader id="stepDl"/>
    </instance>
</data>
<layout>
    <comboBox id="durationComboBox"
              dataContainer="stepDc"
              property="duration"/>
</layout>Затем инжектируйте компонент в контроллер и задайте список элементов в методе onInit():
@ViewComponent
private JmixComboBox<Integer> durationComboBox;
@Subscribe
public void onInit(InitEvent event) {
    durationComboBox.setItems(1,2,3,4,5);
}В выпадающем списке компонента будут отображаться значения 1, 2, 3, 4 и 5. Выбранное значение будет помещено в атрибут duration сущности, находящейся в контейнере данных stepDc.
Список элементов с описаниями
Метод ComponentUtils.setItemsMap() позволяет явно задать строковые описания для каждого значения элемента.
@ViewComponent
private JmixComboBox<Integer> ratingComboBox;
@Subscribe
public void onInit(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(ratingComboBox, map);
}Список значений перечисления
Вы можете использовать декларативный или программный подход для установки значений перечисления как элементов comboBox.
Атрибут itemsEnum определяет класс перечисления для создания списка элементов. В выпадающем списке будут отображаться локализованные имена значений перечисления; значение компонента будет являться значением перечисления.
<comboBox label="Onboarding status"
          itemsEnum="com.company.onboarding.entity.OnboardingStatus"/>Пример ниже использует программный подход.
@ViewComponent
private JmixComboBox<OnboardingStatus> enumComboBox;
@Subscribe
public void onInit(InitEvent event) {
    enumComboBox.setItems(OnboardingStatus.class);
}Пользовательская фильтрация
По умолчанию comboBox выполняет нечувствительное к регистру сопоставление подстрок для фильтрации. Это означает, что он будет показывать любые элементы, где введенный текст встречается где-либо в названии элемента, независимо от регистра.
Вы также можете настроить фильтрацию. Чтобы установить собственный фильтр для comboBox, используйте метод setItems().
@ViewComponent
private JmixComboBox<String> colorDropDown;
@Subscribe
public void onInit(InitEvent event) {
    List<String> itemsList = List.of("White", "Red", "Blue", "Grey");
    colorDropDown.setItems(getStartsWithFilter(), itemsList);
}
protected ComboBox.ItemFilter<String> getStartsWithFilter() {
    return (color, filterString) ->
            color.toLowerCase().startsWith(filterString.toLowerCase());
}Обработка пользовательского ввода
comboBox позволяет вам настроить его для принятия пользовательских значений, отсутствующих в списке элементов.
Когда атрибут allowCustomValue установлен в true, пользователи могут вводить произвольные строковые значения, не совпадающие с существующими элементами. Это приводит к событию CustomValueSetEvent.
| comboBoxавтоматически не обрабатывает строку с пользовательским значением. Используйте событиеCustomValueSetEvent, чтобы определить, как следует обработать введенное пользователем значение. | 
Этот пример демонстрирует возможность добавления новых значений в список элементов, делая их доступными для будущего выбора:
<comboBox id="colorComboBox"
          label="Select the color"
          allowCustomValue="true"/>@ViewComponent
private JmixComboBox<String> colorComboBox;
@Subscribe
public void onInit(InitEvent event) {
    colorComboBox.setItems("White", "Red", "Blue", "Grey");
}
@Subscribe("colorComboBox")
public void onColorComboBoxCustomValueSet(CustomValueSetEvent<ComboBox<String>> event) {
    colorComboBox.setValue(event.getDetail());
}Получение элементов списка
comboBox может загружать элементы по частям в ответ на действия пользователя.
Например, когда пользователь вводит foo, компонент загружает из базы данных не более 50 элементов, содержащих foo в названии, и показывает их в выпадающем списке. Когда пользователь прокручивает список вниз, компонент извлекает следующую группу из 50 элементов с тем же запросом и добавляет их в список.
Декларативная конфигурация
Для реализации этого поведения определите вложенный элемент itemsQuery.
Элемент itemsQuery должен содержать текст запроса JPQL во вложенном элементе query и несколько дополнительных атрибутов, определяющих, что и как загружать данные:
- 
escapeValueForLike- включает поиск значений, содержащих специальные символы:%,\, и так далее. Значение по умолчанию -false.
- 
searchStringFormat- строка Groovy. C её помощью вы можете использовать любые допустимые строковые выражения Groovy.
Пример itemsQuery в comboBox:
<comboBox id="userComboBox"
          label="User name"
          pageSize="30"> (1)
    <itemsQuery escapeValueForLike="true"
                searchStringFormat="(?i)%${inputString}%"> (2)
        <query>
            <![CDATA[select e.username from User e where e.username
            like :searchString escape '\' order by e.username asc]]>
        </query>
    </itemsQuery>
</comboBox>| 1 | Атрибут pageSizeопределяет размер пакета при загрузке данных из базы данных. По умолчанию он равен 50. | 
| 2 | Как вы можете видеть, itemsQueryвcomboBoxне требует атрибутовclassиfetchPlan, поскольку предполагается, что запрос возвращает список скалярных значений (обратите внимание наe.nameв результирующем наборе). Для работы с сущностями используйте компонент entityComboBox. | 
Программная конфигурация
Извлечение элементов также может быть определено программно с помощью обработчика itemsFetchCallback. Например:
@Autowired
protected DataManager dataManager;
protected Collection<User> users;
@Subscribe
public void onInit(InitEvent event) {
    users = dataManager.load(User.class).all().list();
}
@Install(to = "programmaticComboBox", subject = "itemsFetchCallback")
private Stream<User> programmaticComboBoxItemsFetchCallback(Query<User, String> query) {
    String enteredValue = query.getFilter()
            .orElse("");
    return users.stream()
            .filter(user -> user.getDisplayName() != null &&
                    user.getDisplayName().toLowerCase().contains(enteredValue.toLowerCase()))
            .skip(query.getOffset())
            .limit(query.getLimit());
}В этом примере данные извлекаются с помощью DataManager, но вы можете использовать этот подход для загрузки из собственного сервиса.
Настройка отображения элементов
itemLabelGenerator позволяет вам настроить отображение элементов в выпадающем списке. Это дает вам контроль над текстом, который видят пользователи, позволяя представлять информацию более удобным для пользователя или контекстно-специфичным образом.
@Install(to = "colorComboBox", subject = "itemLabelGenerator")
private String colorComboBoxItemLabelGenerator(String item) {
    return item.toUpperCase();
}Рендеринг элементов
Фреймворк предоставляет гибкость в настройке отображения элементов. Вы можете использовать либо метод setRenderer(), либо аннотацию @Supply, чтобы добиться этого.
<comboBox id="daysComboBox"
          itemsEnum="com.company.onboarding.entity.DayOfWeek"/>@Supply(to = "daysComboBox", subject = "renderer")
private Renderer<DayOfWeek> daysComboBoxRenderer() {
    return new ComponentRenderer<>(day -> {
        HorizontalLayout layout = uiComponents.create(HorizontalLayout.class);
        layout.setPadding(false);
        String dayValue = metadataTools.format(day);
        H4 label = new H4(dayValue);
        JmixButton button = uiComponents.create(JmixButton.class);
        button.addThemeVariants(ButtonVariant.LUMO_ICON, ButtonVariant.LUMO_TERTIARY_INLINE);
        Icon icon = switch (day) {
            case MONDAY -> VaadinIcon.BRIEFCASE.create();
            case TUESDAY -> VaadinIcon.LINE_CHART.create();
            case WEDNESDAY -> VaadinIcon.TROPHY.create();
            case THURSDAY -> VaadinIcon.GROUP.create();
            case FRIDAY -> VaadinIcon.CASH.create();
            case SATURDAY -> VaadinIcon.GLASS.create();
            case SUNDAY -> VaadinIcon.BED.create();
        };
        button.setIcon(icon);
        layout.add(button, label);
        return layout;
    });
}Оверлей
Оверлей - это полупрозрачный или непрозрачный слой, который используется для создания выпадающего списка элементов.
Атрибут overlayClass позволяет вам добавлять пользовательские CSS-классы к элементу оверлея.
<comboBox id="ratingComboBox"
          datatype="int"
          overlayClass="my-custom-overlay"/>Определите свой собственный стиль в вашем CSS-файле:
vaadin-combo-box-overlay.my-custom-overlay::part(overlay){
    background-color: #ecfcf9;
    border-radius: 5px;
}Варианты оформления
Используйте атрибут themeNames для настройки выравнивания текста, размещения подсказки и размера компонента.
Выравнивание
Выберите один из трёх вариантов выравнивания: align-left (по умолчанию), align-right (по правому краю), align-center (по центру).
 
XML code
<comboBox itemsEnum="com.company.onboarding.entity.OnboardingStatus"
          themeNames="align-left"
          helperText="The align-left alignment"/>
<comboBox itemsEnum="com.company.onboarding.entity.OnboardingStatus"
          themeNames="align-center"
          helperText="The align-center alignment"/>
<comboBox itemsEnum="com.company.onboarding.entity.OnboardingStatus"
          themeNames="align-right"
          helperText="The align-right alignment"/>Позиция подсказки
Установив helper-above-field, вы переместите подсказку с её стандартного положения под полем на позицию над ним.
 
XML code
<comboBox itemsEnum="com.company.onboarding.entity.OnboardingStatus"
          label="Onboarding status"
          helperText="Helper text with helper-above-field"
          themeNames="helper-above-field"/>
<comboBox itemsEnum="com.company.onboarding.entity.OnboardingStatus"
          label="Onboarding status"
          helperText="Helper text without helper-above-field"/>Размер
Доступны два варианта размера: размер по умолчанию и small.
 
XML code
<comboBox itemsEnum="com.company.onboarding.entity.OnboardingStatus"
          helperText="Default size"/>
<comboBox itemsEnum="com.company.onboarding.entity.OnboardingStatus"
          themeNames="small"
          helperText="Small size"/>Валидация
Чтобы проверить значения, введенные в компонент comboBox, вы можете использовать валидатор в элементе validators.
Доступны следующие предопределенные валидаторы для comboBox:
| XML-элемент | 
 | 
|---|---|
| Предопределенные валидаторы | custom - decimalMax - decimalMin - digits - doubleMax - doubleMin - email - max - min - negativeOrZero - negative - notBlank - notEmpty - notNull - positiveOrZero - positive - regexp - size | 
Атрибуты
В Jmix есть множество общих атрибутов, которые выполняют одну и ту же функцию для всех компонентов.
Ниже приведены атрибуты, специфичные для comboBox:
| Название | Описание | Значение по умолчанию | 
|---|---|---|
| Если атрибут  | 
 | |
| Если атрибут  | 
 | |
| Атрибут  | ||
| Определяет список CSS-классов, разделенных пробелами, для установки на элемент оверлея. Смотрите Оверлей. | ||
| Устанавливает максимальное количество элементов, отправляемых за один запрос, которое должно быть больше нуля. Смотрите Получение элементов списка. | 
 | 
Обработчики
В Jmix существует множество общих обработчиков, которые конфигурируются одинаково для всех компонентов.
Ниже приведены обработчики, специфичные для comboBox.
| Чтобы сгенерировать заглушку обработчика в Jmix Studio, используйте вкладку Handlers панели инспектора Jmix UI, или команду Generate Handler, доступную на верхней панели контроллера экрана и через меню Code → Generate (Alt+Insert / Cmd+N). | 
| Название | Описание | 
|---|---|
| Событие  | |
| 
 | |
| Этот обработчик извлекает данные только по мере необходимости. Смотрите Получение элементов списка. | |
| Устанавливает  | 
Смотрите также
Смотрите документацию Vaadin для получения дополнительной информации.