multiSelectComboBox
multiSelectComboBox позволяет пользователям выбирать один или несколько элементов из выпадающего списка. Этот компонент похож на comboBox.
| XML-элемент | 
 | 
|---|---|
| Java-класс | 
 | 
| Атрибуты | id - alignSelf - allowCustomValue - allowedCharPattern - ariaLabel - ariaLabelledBy autoExpand - autoOpen - autofocus - classNames - clearButtonVisible - colspan - css - dataContainer - enabled - errorMessage - focusShortcut - height - helperText - itemsContainer itemsEnum - label - maxHeight - maxWidth - metaClass - minHeight - minWidth - opened - overlayClass - pageSize - placeholder - property - readOnly - required - requiredMessage - selectedItemsOnTop - tabIndex - themeNames - title - visible - width | 
| Обработчики | AttachEvent - BlurEvent - ClientValidatedEvent - ComponentValueChangeEvent - CustomValueSetEvent - DetachEvent - FocusEvent - TypedValueChangeEvent - itemLabelGenerator - itemsFetchCallback - renderer - validator | 
| Элементы | 
Основы
Выпадающий список открывается, когда пользователь щелкает по полю с помощью мыши. Использование клавиш Up и Down или ввод символа при фокусе на поле также открывает выпадающий список.
 
<multiSelectComboBox itemsEnum="com.company.onboarding.entity.DayOfWeek"
                     label="Day of week"/>Привязка данных
Привязка данных означает связывание визуального компонента с контейнером данных. Изменения в визуальном компоненте или соответствующем контейнере данных могут вызывать обновления друг друга. Смотрите Использование компонентов данных для получения дополнительной информации.
Чтобы создать multiSelectComboBox, связанный с данными, используйте атрибуты dataContainer и property. Атрибут itemsContainer используется для создания списка элементов. В следующем примере показан multiSelectComboBox, связанный с данными.
<data>
    <instance class="com.company.onboarding.entity.User" id="userDc"> (1)
        <fetchPlan extends="_base"> (2)
            <property name="hobbies" fetchPlan="_base"/>
        </fetchPlan>
        <loader id="userDl"/>
    </instance>
    <collection class="com.company.onboarding.entity.Hobby" id="hobbiesDc"> (3)
        <fetchPlan extends="_base"/>
        <loader id="hobbiesDl">
            <query>
                <![CDATA[select e from Hobby e]]>
            </query>
        </loader>
    </collection>
</data>
<layout>
    <multiSelectComboBox dataContainer="userDc"
                         property="hobbies"
                         label="Hobbies"
                         itemsContainer="hobbiesDc"/> (4)
</layout>| 1 | InstanceContainerдля сущностиUser. | 
| 2 | Встроенный план выборки экземпляра сущности, находящегося в контейнере. | 
| 3 | CollectionContainerдля сущностиHobby. | 
| 4 | multiSelectComboBoxполучаетhobbiesDcв качестве контейнера элементов, чтобы в выпадающем списке отображался список хобби. | 
Значение компонента возвращает список выбранных элементов.
MultiSelectComboBox c MetaClass
Вы можете использовать multiSelectComboBox без прямой ссылки на данные, то есть без указания атрибутов dataContainer и property. В этом случае используйте атрибут metaClass для указания типа сущности для multiSelectComboBox. Чтобы указать набор экземпляров для выбора, используйте атрибут itemsContainer.
Например, компонент может работать с сущностью Hobby, которая имеет имя класса метаданных Hobby.
<multiSelectComboBox metaClass="Hobby"
                     itemsContainer="hobbiesDc"/>Автоматическое расширение
Вы можете настроить multiSelectComboBox для автоматического увеличения ширины, чтобы вместить теги, представляющие выбранные элементы. Расширение работает только с неопределенным размером в нужном направлении (например, установка max-width ограничивает ширину компонента). Возможные значения:
- 
VERTICAL- поле расширяется вертикально, и теги переносятся на следующую строку.  
- 
HORIZONTAL- поле расширяется горизонтально, пока не достигнет максимальной ширины (max-width), затем сворачивается, чтобы отобразить переполняющий тег.  
- 
BOTH- поле расширяется горизонтально, пока не достигнет максимальной ширины (max-width), затем расширяется вертикально, и теги переносятся на следующую строку.  
- 
NONE- поле не расширяется и сворачивается, чтобы отобразить переполняющий тег.  
Отображение выбранных элементов
Атрибут selectedItemsOnTop управляет способом отображения выбранных элементов в выпадающем списке.
Как это работает:
- 
Если selectedItemsOnTopустановлен вtrue, выбранные элементы отображаются в верхней части выпадающего списка, а не выбранные остаются внизу. Такое расположение может быть визуально привлекательным и интуитивно понятным, особенно если пользователи часто выбирают подмножество элементов и нуждаются в быстром доступе к последним выбранным.
- 
Если selectedItemsOnTopустановлен вfalse(значение по умолчанию), выбранные элементы отображаются в том порядке, в котором они были выбраны, без перемещения в верхнюю часть выпадающего списка. Такое расположение сохраняет порядок выбора и может быть предпочтительным в сценариях, где порядок имеет решающее значение, или если важна визуальная согласованность с другими элементами интерфейса.
Получение элементов списка
multiSelectComboBox может загружать элементы по частям в ответ на действия пользователя.
Например, когда пользователь вводит foo, компонент загружает из базы данных не более 50 элементов, содержащих foo в названии, и показывает их в выпадающем списке. Когда пользователь прокручивает список вниз, компонент извлекает следующую группу из 50 элементов с тем же запросом и добавляет их в список.
Декларативная конфигурация
Для реализации этого поведения определите вложенный элемент itemsQuery.
Элемент itemsQuery должен содержать текст запроса JPQL во вложенном элементе query и несколько дополнительных атрибутов, определяющих, что и как загружать данные:
- 
escapeValueForLike- включает поиск значений, содержащих специальные символы:%,\, и так далее. Значение по умолчанию -false.
- 
searchStringFormat- строка Groovy. C её помощью вы можете использовать любые допустимые строковые выражения Groovy.
- 
class(необязательный) - указывает полное имя класса сущности, экземпляры которой будут получены.
- 
fetchPlan- необязательный атрибут, указывающий план выборки, который будет использоваться для загрузки запрошенной сущности.
Элемент itemsQuery содержит следующие вложенные элементы:
- 
query- элемент, содержащий запрос JPQL.
- 
fetchPlan- необязательный элемент, указывающий встроенный план выборки.
Пример использования itemsQuery в multiSelectComboBox:
<multiSelectComboBox metaClass="Hobby"
                     label="Hobby"
                     pageSize="30"> (1)
    <itemsQuery class="com.company.onboarding.entity.Hobby"
                escapeValueForLike="true"
                searchStringFormat="(?i)%${inputString}%">
        <fetchPlan extends="_base"/>
        <query>
            <![CDATA[select e from Hobby e where e.name
            like :searchString escape '\' order by e.name]]>
        </query>
    </itemsQuery>
</multiSelectComboBox>| 1 | Атрибут pageSizeопределяет размер пакета при загрузке данных из базы данных. По умолчанию он равен 50. | 
Программная конфигурация
Извлечение элементов также может быть определено программно с помощью обработчика itemsFetchCallback. Например:
@Autowired
protected DataManager dataManager;
protected Collection<Hobby> hobbies;
@Subscribe
public void onInit(final InitEvent event) {
    hobbies = dataManager.load(Hobby.class).all().list();
}
@Install(to = "hobbiesComboBox", subject = "itemsFetchCallback")
private Stream<Hobby> hobbiesComboBoxItemsFetchCallback(final Query<Hobby, String> query) {
    String enteredValue = query.getFilter()
            .orElse("");
    return hobbies.stream()
            .filter(hobby -> hobby.getName() != null &&
                    hobby.getName().toLowerCase().contains(enteredValue.toLowerCase()))
            .skip(query.getOffset())
            .limit(query.getLimit());
}В этом примере данные извлекаются с помощью DataManager, но вы можете использовать этот подход для загрузки из собственного сервиса.
Атрибуты
В Jmix есть множество общих атрибутов, которые выполняют одну и ту же функцию для всех компонентов.
Ниже приведены атрибуты, специфичные для multiSelectComboBox:
| Название | Описание | Значение по умолчанию | 
|---|---|---|
| Управляет поведением компонента, когда недостаточно места для отображения всех выбранных элементов в виде тегов в пределах текущей ширины поля. Смотрите Автоматическое расширение. | 
 | |
| Определяет класс сущности для  | ||
| Определяет, следует ли открывать выпадающий список или нет. | 
 | |
| Включает или отключает группировку выбранных элементов в верхней части выпадающего списка. Смотрите Отображение выбранных элементов. | 
 | 
Обработчики
В Jmix существует множество общих обработчиков, которые конфигурируются одинаково для всех компонентов.
Ниже приведены обработчики, специфичные для  multiSelectComboBox.
| Чтобы сгенерировать заглушку обработчика в Jmix Studio, используйте вкладку Handlers панели инспектора Jmix UI, или команду Generate Handler, доступную на верхней панели контроллера экрана и через меню Code → Generate (Alt+Insert / Cmd+N). | 
| Название | Описание | 
|---|---|
| 
 | |
| Этот обработчик извлекает данные только по мере необходимости. Смотрите Получение элементов списка. | |
| Устанавливает  | 
Смотрите также
Смотрите документацию Vaadin для получения дополнительной информации.