Обязательное поле со списком vaadin 8 - PullRequest
0 голосов
/ 28 марта 2019

Я пытаюсь преобразовать код vaadin 7 в код vaadin 8 Вместо того, чтобы использовать BeanFieldGroup, документ vaadin 8 использует Binder вместо того, чтобы связывать поля формы с классом. Это не похоже на работу со списком.

Я искал способ использовать конвертер, который, по-видимому, недоступен для комбинированного списка. Как используется в привязке данных к форме в документации vaadin здесь

Для одного поля работал конвертер:

binder.forField(age).withConverter(
                    new 
StringToIntegerConverter("Must enter a number")).bind(
                    Student::getAge, 
Student::setAge);

Но для поля со списком я не уверен, как это будет работать.

ComboBox<String> gender = new ComboBox<String>("Gender");

Binder binder = new Binder<Student>(Student.class);

binder.bind(gender, Student::getGender, Student::setGender);

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

Ответы [ 2 ]

1 голос
/ 28 марта 2019

Вы упомянули в комментарии, что поле gender в вашем Student объекте на самом деле является Enum, а не String.

Ваша ошибка состояла в том, что вы определили ComboBox с типом String вместо вашего перечисления Gender.

Если ваш класс перечисления пола называется Gender, это будет работать:

ComboBox<Gender> gender = new ComboBox<Gender>("Gender");
Binder binder = new Binder<Student>(Student.class);
binder.bind(gender, Student::getGender, Student::setGender);

Вы можете добавить ItemLabelGenerator в ComboBox, чтобы определить, как должно отображаться ваше гендерное перечисление.По умолчанию он будет использовать toString() класса.Но вы можете использовать его, например, для сборки Vaadin Components, если хотите.посмотрите, как это делается в документации ).

0 голосов
/ 28 марта 2019

Я обнаружил, что в vaadin 8 используется bindInstanceFields для привязки данных формы к классу.

Binder binder = new Binder<Student>(Student.class);

binder.bindInstanceFields(this);
binder.readBean(student);
...