textField

textField — поле ввода для редактирования текста или значений других поддерживаемых типов данных.

XML-элемент

textField

Java-класс

TypedTextField

Основы

В следующем примере определены стандартное текстовое поле и поле с ограничением максимальной длины ввода:

<textField id="textField" label="TextField"/>
<textField id="textLengthField" label="MaxLength = 10" maxLength="10"/>

Текстовые поля с разными типами данных

textField — типизированный компонент, поэтому он поддерживает значения разных типов. Тип определяется при привязке компонента к атрибуту сущности или задаётся явно атрибутом datatype.

<textField id="stringTextField" label="String"
           datatype="string"/>
<textField id="integerTextField" label="Integer"
           datatype="int"/>
<textField id="doubleTextField" label="Double"
           datatype="double"/>

Для работы с типизированными значениями также предназначены методы setTypedValue() и getTypedValue(). Они позволяют задать или получить значение конкретного типа, например Integer или Long.

При обработке изменений значений компонента рекомендуется использовать TypedValueChangeEvent вместо ComponentValueChangeEvent. Такой подход гарантирует корректность типа значения и исключает необходимость дополнительных преобразований или проверок.

textField связанный с данными

Чтобы связать textField с данными, используйте атрибуты dataContainer и property.

XML
<data>
    <instance id="customerDc"
              class="io.jmix.uisamples.entity.Customer"
              fetchPlan="_local"/>
</data>
<layout>
    <textField id="textField" label="Name"
               dataContainer="customerDc" property="name"/>
    <hbox>
        <span text="Value in the container:"/>
        <span id="spanValue"/>
    </hbox>
</layout>
Java
@ViewComponent
protected InstanceContainer<Customer> customerDc;
@ViewComponent
protected Span spanValue;

@Autowired
protected Metadata metadata;

@Subscribe
protected void onInit(InitEvent event) {
    Customer customer = metadata.create(Customer.class);
    customer.setName("John");
    customerDc.setItem(customer);
}

@Subscribe("textField")
protected void onTextFieldValueChange(TypedValueChangeEvent<TypedTextField<String>, String> changeEvent) {
    spanValue.setText(customerDc.getItem().getName());
}

В приведённом выше примере экран описывает контейнер данных departmentDc для сущности Department, которая содержит атрибут name. Компонент textField связан с контейнером через атрибут dataContainer; атрибут property содержит имя атрибута сущности, отображаемого в textField

Режимы изменения значений

Атрибут valueChangeMode определяет, когда введённые данные обновляют значение на стороне сервера. В примере обработчик изменения значения также обновляет вспомогательный текст по мере ввода.

XML
<details summaryText="Default value change" opened="true" width="AUTO">
    <textField id="textField" placeholder="Start typing"/>
</details>
<details summaryText="Custom value change" opened="true" width="50%">
    <vbox padding="false">
        <textField id="valueChangeModeTextField" maxLength="140" helperText="0/140"/>
        <radioButtonGroup id="valueChangeModeRadioButtonGroup" label="ValueChangeMode"/>
    </vbox>
</details>
Java
@ViewComponent
protected TypedTextField<String> valueChangeModeTextField;
@ViewComponent
protected JmixRadioButtonGroup<ValueChangeMode> valueChangeModeRadioButtonGroup;

@Autowired
protected Notifications notifications;

@Subscribe
protected void onInit(InitEvent event) {
    ComponentUtils.setItemsMap(valueChangeModeRadioButtonGroup, getValueChangeModeItemsMap());
    valueChangeModeRadioButtonGroup.setValue(ValueChangeMode.ON_CHANGE);
}

@Subscribe("valueChangeModeRadioButtonGroup")
protected void onValueChangeModeRadioButtonValueChange(
        ComponentValueChangeEvent<JmixRadioButtonGroup<ValueChangeMode>, ValueChangeMode> event) {
    valueChangeModeTextField.setValueChangeMode(event.getValue());
}

@Subscribe("textField")
protected void onTextFieldValueChange(TypedValueChangeEvent<TypedTextField<String>, String> event) {
    notifications.show("Text Changed: " + event.getValue());
}

@Subscribe("valueChangeModeTextField")
protected void onValueChangeModeTextFieldValueChange(TypedValueChangeEvent<TypedTextField<String>, String> event) {
    TypedTextField<String> sourceTextField = event.getSource();
    sourceTextField.setHelperText(Strings.nullToEmpty(event.getValue()).length() + "/" + sourceTextField.getMaxLength());
}

protected Map<ValueChangeMode, String> getValueChangeModeItemsMap() {
    return Arrays.stream(ValueChangeMode.values())
            .collect(Collectors.toMap(Function.identity(), mode -> mode.name().replace('_', ' ')));
}

Проверка

Добавьте вложенные валидаторы для проверки преобразованных значений поля. В примере стандартные валидаторы числового диапазона используются вместе с пользовательским валидатором — Spring-бином.

XML
<textField id="integerTextField" label="Positive TextField"
           helperText="Value must be positive"
           datatype="int">
    <validators>
        <custom bean="uisamples_PositiveIntegerValidator"/>
    </validators>
</textField>
<textField id="doubleTextField" label="Double range validator"
           helperText="Value must be between 1.0 and 100.0"
           datatype="double">
    <validators>
        <doubleMin value="1.0" inclusive="true"/>
        <doubleMax value="100.0" inclusive="true"/>
    </validators>
</textField>
Java
@Override
public void accept(Integer value) {
    if (value != null) {
        if (value <= 0) {
            fireValidationException(
                    messages.getMessage("validation.constraints.positive"),
                    ParamsMap.of("value", value)
            );
        }
    }
}

Варианты темы

Используйте атрибут themeNames, чтобы применить один или несколько вариантов темы.

Вариант Описание Поддерживается в

align-left

Выравнивает значение поля по левому краю.

Aura, Lumo

align-center

Выравнивает значение поля по центру.

Aura, Lumo

align-right

Выравнивает значение поля по правому краю.

Aura, Lumo

align-start

Выравнивает значение поля по начальной стороне с учетом текущего направления текста.

Aura

align-end

Выравнивает значение поля по конечной стороне с учетом текущего направления текста.

Aura

helper-above-field

Размещает вспомогательный текст над полем, под меткой.

Aura, Lumo

small

Уменьшает размер компонента.

Aura, Lumo

Атрибуты

textField имеет следующие уникальные атрибуты:

Имя Описание По умолчанию

autoselect

Установите значение true, чтобы значение поля всегда автоматически выбиралось, когда поле получает фокус, в противном случае false.

clearButtonVisible

Определяет, отображается ли в поле кнопка очистки.

false

trimEnabled

Если true, компонент обрезает пробелы в начале и конце введённой строки.

value

Задаёт значение компонента.

textField имеет следующие общие атрибуты:

Обработчики

textField имеет следующие уникальные обработчики:

Имя Описание

validator

Проверяет значение компонента.

textField имеет следующие общие обработчики:

Элементы

Компонент textField может содержать следующие вложенные элементы: tooltip, validator, prefix, и suffix.

Смотрите также