Java 绑定组合框vaadin 8

Java 绑定组合框vaadin 8,java,vaadin8,Java,Vaadin8,我正在尝试将vaadin 7代码转换为vaadin 8代码,而不是使用BeanFieldGroup vaadin 8文档使用Binder将表单字段绑定到类。这似乎不适用于组合框 我一直在寻找一种使用组合框似乎不可用的转换器的方法。用于将数据绑定到vaadin文档中的表单 对于一个字段,转换器工作: binder.forField(age).withConverter( new StringToIntegerConverter("Must enter a

我正在尝试将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);

我知道这是行不通的。有没有一种方法可以为组合框编写一个转换器,或者应该同时使用另一种方法。

我发现在vaadin 8中,使用bindInstanceFields将表单数据绑定到类

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

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

您在评论中提到,学生对象中的性别字段实际上是一个枚举,而不是字符串

您的错误是使用类型字符串而不是性别枚举定义了组合框

假设您的性别枚举类称为性别,这将起作用:

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

您可以将ItemLabelGenerator添加到组合框中,以定义性别枚举的显示方式。默认情况下,它将使用类的toString。但是,如果您愿意,您可以使用它来构建Vaadin组件。看看这是如何做到的

我知道这行不通——为什么不行?我觉得不错。您为组合框设置了项目吗?组合框上永远不需要转换器-您可以始终添加ItemLabelGenerator,在其中可以定义从原始类型到其显示方式的转换默认为toString,但您可以将其转换为Vaadin组件,例如。查看如何在I Get a错误消息中执行。类型绑定器中的方法bindHasValue、ValueProvider、Setter不适用于参数组合框Student::getGender、Student::setGender,但当我尝试复制错误时,没有出现错误。但是使用bindInstanceFields更容易。性别实际上是枚举还是学生对象中的字符串?使用bindInstanceFields可能更容易,但IIRC则只适用于非常基本的绑定—没有转换器、验证器、nullRepresentations或readOnly—不能设置任何setter,也不能绑定Student对象的嵌套字段。它基本上为视图中的每个HasValue组件应用binder.forFieldfield.bindpropertyName。它是字符串utils中的枚举,带有toString方法AHA!你应该定义你的ComboBox为ComboBox!