SingleSelectList

SingleSelectList отображает предопределенные опции в виде списка с возможностью прокрутки по вертикали. SingleSelectList позволяет пользователям выбрать только один пункт из списка.

XML-имя компонента: singleSelectList.

Основы

Используйте SingleSelectList, если:

  • Пользователям нужно выбрать один вариант из списка.

  • Опций слишком много, чтобы использовать RadioButtonGroup.

  • Количество опций ограничено, и нет необходимости вводить пользовательские значения.

Простейший вариант использования SingleSelectList – выбор значения перечисления (enum) для атрибута сущности. Например, сущность Customer имеет атрибут level типа Level, который является перечислением.

single select list

Как видно из примера, в экране описывается контейнер данных customerDc для сущности Customer. В элементе singleSelectList в атрибуте dataContainer указывается ссылка на контейнер данных customerDc, а атрибут property ссылается на сущность level. В данном случае атрибут является перечислением, и в списке будут отображены локализованные названия всех значений этого перечисления.

<data>
    <instance id="customerDc"
              class="ui.ex1.entity.Customer"
              fetchPlan="_base"/>
</data>
<layout>
    <singleSelectList id="singleSelectList"
                      caption="Select a level:"
                      dataContainer="customerDc"
                      property="level"
                      nullOptionVisible="false"
                      height="100"/>
</layout>

По умолчанию в SingleSelectList отображается первая нулевая опция из списка. Установите для атрибута nullOptionVisible значение false, чтобы отключить это поведение.

Определение опций

Список опций можно указать либо в XML-дескрипторе, используя атрибуты optionsContainer, optionsEnum, либо программно в контроллере, используя методы setOptionsList(), setOptionsMap() и setOptionsEnum().

optionsContainer

Компонент может принимать список опций из контейнера данных. Для этого используется атрибут optionsContainer. Например:

<data>
    <collection id="customersDc"
                class="ui.ex1.entity.Customer"
                fetchPlan="_base">
        <loader id="customersDl">
            <query>
                <![CDATA[select e from uiex1_Customer e]]>
            </query>
        </loader>
    </collection>
</data>
<layout>
    <singleSelectList id="customerList"
                      optionsContainer="customersDc"
                      captionProperty="lastName"/>
</layout>

В данном примере использовался атрибут captionProperty, поэтому компонент customerList будет отображать атрибут lastName сущности Customer, расположенной в контейнере данных customersDc.

setOptionsList()

Метод setOptionsList() позволяет программно задать список опций компонента.

Для этого объявим компонент в XML-дескрипторе:

<singleSelectList id="rewardPointsList"
                  caption="Select reward points:"
                  height="200"/>

Затем инжектируем компонент в контроллер и в методе onInit() задаем ему список опций:

@Autowired
private SingleSelectList<Integer> rewardPointsList;
@Subscribe
public void onInit(InitEvent event) {
    List<Integer> list = new ArrayList<>();
    list.add(1000);
    list.add(2000);
    list.add(3000);
    list.add(4000);
    list.add(5000);
    list.add(6000);
    list.add(7000);
    rewardPointsList.setOptionsList(list);
}

Компонент будет выглядеть следующим образом:

single select list list

В зависимости от выбранной опции метод компонента getValue() будет возвращать значения Integer: 1000, 2000, 3000, 4000, 5000, 6000, 7000.

setOptionsMap()

Метод setOptionsMap() позволяет явно задать строковые названия для каждого значения опций.

Для этого объявим компонент в XML-дескрипторе:

<singleSelectList id="ratingList"
                  caption="Select a rating:"
                  height="150"/>

Затем инжектируем компонент в контроллер и в методе onInit() задаем ему список опций:

@Autowired
private SingleSelectList<Integer> ratingList;
@Subscribe
public void onInit(InitEvent event) {
    Map<String,Integer> map = new LinkedHashMap<>();
    map.put("Poor",2);
    map.put("Average",3);
    map.put("Good",4);
    map.put("Excellent",5);
    ratingList.setOptionsMap(map);
}

Компонент будет выглядеть следующим образом:

single select list map

В зависимости от выбранной опции метод компонента getValue() будет возвращать значения Integer: 2, 3, 4, 5, and not the strings that are displayed on the screen.

setOptionsEnum()

Метод setOptionsEnum() принимает в качестве параметра класс перечисления. Выпадающий список будет содержать локализованные названия значений перечисления, значением компонента будет являться выбранное значение перечисления.

Простейший способ задать параметры из enum класса – использовать атрибут optionsEnum в XML-дескрипторе:

<singleSelectList id="hobbyList"
                  caption="Select a hobby:"
                  optionsEnum="ui.ex1.entity.Hobby"/>

События и слушатели

Чтобы сгенерировать заглушку слушателя в Jmix Studio, выберите компонент в XML-дескрипторе экрана или на панели иерархии Jmix UI и используйте вкладку Handlers на панели инспектора Jmix UI.

В качестве альтернативы вы можете воспользоваться кнопкой Generate Handler на верхней панели контроллера экрана.

ContextHelpIconClickEvent

DoubleClickEvent

DoubleClickEvent отправляется, когда пользователь дважды щелкает мышью по опции списка.

Вы можете подписаться на это событие в контроллере экрана, например:

@Subscribe("hobbyList") (1)
public void onHobbyListDoubleClick(SelectList.DoubleClickEvent<Hobby> event) {
    notifications.create()
            .withCaption("Double clicked on the " + event.getItem() + " hobby") (2)
            .show();
}
1 Аннотация @Subscribe содержит идентификатор SingleSelectList.
2 При необходимости можно получить нажатый элемент из объекта события.

OptionCaptionProvider

Validator

См. Validator.

ValueChangeEvent

XML-атрибуты SingleSelectList

Просматривать и редактировать атрибуты, применимые к компоненту, можно с помощью панели инспектора Jmix UI в конструкторе экранов Studio.