Vaadin Combobox - нет ошибки при неверном пользовательском вводе - PullRequest
2 голосов
/ 01 апреля 2020

Я использую Vaadin 14.1.21 и хочу, чтобы в раскрывающемся списке (Combobox) отображались целочисленные значения, а также разрешался пользовательский ввод.

У меня есть Integer в классе данных для поля в качестве типа, но тип поля пользовательского интерфейса - String, поскольку мне также необходимо включить пользовательский ввод. Я использую withConverter в сочетании с пользовательским конвертером, поскольку не хочу отображать разделитель тысяч (точка в моем случае) в пользовательском интерфейсе. Он работает, как и ожидалось, для всех поставляемых выпадающих элементов - и когда я выбираю предоставленный «недействительный» пункт выпадающего меню («Элемент сообщения об ошибке»), я получаю свою пользовательскую ошибку, отображаемую под списком.

проблема возникает при вводе неверного пользовательского значения, например "329hhh2" - При неправильном пользовательском вводе из моего пользовательского преобразователя не возникает ошибка !

У меня вообще нет ошибок и когда я хочу «сохранить» свой объект, (недопустимое) значение поля со списком просто исчезает в нирване, и я получаю Null в качестве значения поля.

Может кто-нибудь сказать мне, что я делаю неправильно?

Вот мой пример кода (я старался сделать его максимально коротким, не пропуская ничего):

public class RisikoForm extends Div {

    private ComboBox<String> number_string_combobox;

    public void instantiate_string_combobox() {
        number_string_combobox = new ComboBox<>();
        number_string_combobox.setItems("6583212", "114514", "879278", "Error Message Item");
        number_string_combobox.setLabel("Number");
        number_string_combobox.addCustomValueSetListener(event -> event.getDetail());
    }


    private static class Id_StringToInteger_Converter extends StringToIntegerConverter {

        public Id_StringToInteger_Converter() {
            super("Custom Error: Input cannot be converted to integer");
        }

        @Override
        protected NumberFormat getFormat(Locale locale) {
            final NumberFormat format = super.getFormat(locale);
            format.setGroupingUsed(false);
            return format;
        }
    }

    public Form(ViewLogic sampleCrudLogic) {
        this.instantiate_string_combobox();
        content.add(number_string_combobox);

        binder = new BeanValidationBinder<>(Data.class);
        binder.forField(number_string_combobox)
              .withNullRepresentation("")
              .withConverter(new Id_StringToInteger_Converter())
              .bind(Data::getIntegerNumber, Data::setIntegerNumber);
    }
}


public class Data implements Serializable {

   private Integer integerNumber;

    public Integer getIntegerNumber() {
        return integerNumber;
    }

    public void setIntegerNumber(Integer integerNumber) {
        this.integerNumber = integerNumber;
    }

}

1 Ответ

3 голосов
/ 01 апреля 2020

Ваш пользовательский прослушиватель с установленными значениями сейчас не работает. Вы должны отреагировать на событие. Например:

addCustomValueSetListener(event -> number_string_combobox.setValue(event.getDetail()))

См. Пример в разделе «Разрешить пользовательские значения» или «Сохранение пользовательских значений»

...