ValuePicker
Компонент ValuePicker
отображает значение любого типа. Он состоит из текстового поля и набора кнопок, определяемых действиями.
ValuePicker
является базовым классом для ValuesPicker, EntityPicker и EntityComboBox.
XML-имя компонента: valuePicker
.
Основы
ValuePicker
может иметь заголовок и как настраиваемые, так и предопределенные действия:
Пример определения ValuePicker
с заголовком, полученным из локализованных сообщений, и двумя действиями:
<valuePicker id="valuePicker"
caption="msg://code">
<actions>
<action id="generate"
icon="REFRESH"
description="msg://description"/>
<action id="clear" type="value_clear"/>
</actions>
</valuePicker>
Что бы создать ValuePicker
, связанный с данными, используйте атрибуты dataContainer
и property
:
<data>
<instance id="userDc"
class="ui.ex1.entity.User">
<fetchPlan extends="_base"/>
<loader/>
</instance>
</data>
<layout spacing="true">
<vbox spacing="true" id="vBox">
<valuePicker id="loginValuePicker"
caption="msg://ui.ex1.entity/User.login"
dataContainer="userDc"
property="login">
<actions>
<action id="generate" icon="REFRESH"/>
</actions>
</valuePicker>
В приведенном выше примере экран определяет контейнер данных userDc
для сущности User
с атрибутом login
. В ValuePicker
атрибут dataContainer
содержит ссылку на контейнер данных userDc
, а атрибут property
включает имя атрибута сущности login
.
По умолчанию пользователь не может ввести значение вручную. Если вы установите для атрибута fieldEditable
значение true
, вы включите ручной ввод. Имейте в виду, что введенное значение не соответствует модели данных. Для обработки пользовательского ввода используйте слушатель FieldValueChangeEvent
.
Рассмотрим пример ниже. У нас есть сущность User
с атрибутом age
. Давайте определим ageValuePicker
в XML-дескрипторе с помощью fieldEditable="true"
:
<valuePicker id="ageValuePicker"
caption="msg://ui.ex1.entity/User.age"
dataContainer="userDc"
property="age"
fieldEditable="true">
<actions>
<action id="clear" type="value_clear"/>
</actions>
</valuePicker>
Теперь пользователь может ввести значение вручную. Чтобы обработать это значение, интерпретируемое как String, подпишитесь на FieldValueChangeEvent
в контроллере:
@Autowired
private ValuePicker<Integer> ageValuePicker;
@Subscribe("ageValuePicker")
public void onAgeValuePickerFieldValueChange(ValuePicker.FieldValueChangeEvent<Integer> event) {
String text = event.getText(); (1)
notifications.create()
.withCaption("Entered value: " + text)
.show();
if (!Strings.isNullOrEmpty(text)) {
ageValuePicker.setValue(Integer.parseInt(text)); (2)
}
}
1 | Получите значение пользовательского ввода в виде строки. |
2 | Установите проанализированное значение в ageValuePicker . |
Действия
Вы можете определить пользовательские и предопределенные действия для ValuePicker
, отображаемые в виде кнопок справа. Это можно сделать либо в XML-дескрипторе, используя вложенный элемент actions
, либо программно в контроллере, используя метод addAction()
.
Предопределенное действие
Фреймворком предоставляется только одно предопределенное действие – value_clear
:
<action id="clear" type="value_clear"/>
Используйте атрибуты type
и id
для объявления предопределенного действия в XML.
Используйте addAction()
, чтобы установить его программно:
@Autowired
protected ValuePicker<String> loginValuePicker;
@Autowired
protected Actions actions;
@Subscribe
protected void onInit(InitEvent event) {
loginValuePicker.addAction(actions.create(ValueClearAction.ID));
}
Пользовательские действия
Чтобы определить пользовательское действие в XML, используйте вложенный элемент actions
. Укажите атрибуты id
и icon
для action
:
<valuePicker id="loginValuePicker"
caption="msg://ui.ex1.entity/User.login"
dataContainer="userDc"
property="login">
<actions>
<action id="generate" icon="REFRESH"/>
</actions>
</valuePicker>
Затем реализуйте пользовательскую логику в контроллере экрана, подписавшись на Action.ActionPerformedEvent
:
@Subscribe("loginValuePicker.generate") (1)
protected void onLoginValuePickerGenerate(Action.ActionPerformedEvent event) {
loginValuePicker.setValue(RandomStringUtils.randomAlphabetic(5, 10));
}
1 | Аннотация @Subscribe содержит id компонента ValuePicker и id действия, разделенные точкой. |
Валидация
Для проверки введенных в компонент ValuePicker
значений можно использовать валидатор во вложенном элементе validators
.
Для ValuePicker
доступны следующие предопределенные валидаторы:
В приведенном ниже примере показано использование NotNullValidator
для countryValidField
:
<entityComboBox id="countryValidField"
caption="Select a country"
optionsContainer="countriesDc">
<validators>
<notNull/>
</validators>
</entityComboBox>
События и слушатели
Чтобы сгенерировать заглушку слушателя в Jmix Studio, выберите компонент в XML-дескрипторе экрана или на панели иерархии Jmix UI и используйте вкладку Handlers на панели инспектора Jmix UI. В качестве альтернативы вы можете воспользоваться кнопкой Generate Handler на верхней панели контроллера экрана. |
Formatter
См. Formatter.
Validator
Добавляет экземпляр validator к компоненту. Валидатор должен выбросить ValidationException
, если значение если значение недопустимо.
Если вас не устраивают предопределенные валидаторы, добавьте свой собственный экземпляр валидатора:
@Install(to = "iconComboBox", subject = "validator")
protected void iconComboBoxValidator(FontAwesome icon) {
if (icon != null)
if (icon == FontAwesome.FILE_PDF_O)
throw new ValidationException("The file type you selected " +
"is not currently supported");
}
ValueChangeEvent
См. ValueChangeEvent.
XML-атрибуты ValuePicker
Просматривать и редактировать атрибуты, применимые к компоненту, можно с помощью панели инспектора Jmix UI в конструкторе экранов Studio. |
align - caption - captionAsHtml - css - description - descriptionAsHtml - enable - box.expandRatio - fieldEditable - htmlSanitizerEnabled - icon - id - stylename - tabIndex - visible - width