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"/>
Data Binding
Привязка данных означает связывание визуального компонента с контейнером данных. Изменения в визуальном компоненте или соответствующем контейнере данных могут вызывать обновления друг друга. Смотрите Использование компонентов данных для получения дополнительной информации.
Чтобы создать 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 для получения дополнительной информации.