在 Vaadin 中绑定 TwinColSelect
Binding TwinColSelect in Vaadin
如何在 Vaadin 中将实体绑定到 TwinColSelect?我可以对简单组件(TextField、ComboBox)执行此操作,但我不知道如何对 TwinColSelect 组件执行此操作。我在注释行收到一个编译问题。 ExampleEntity 中的 SelectedString 属性应包含所有从 TwinColSelect 中选择的元素。
import com.vaadin.data.Binder;
import com.vaadin.navigator.View;
import com.vaadin.spring.annotation.SpringView;
import com.vaadin.ui.TwinColSelect;
import com.vaadin.ui.VerticalLayout;
import java.util.ArrayList;
import java.util.List;
@SpringView(name = "example")
public class Example extends VerticalLayout implements View {
public Example() {
List<String> list = new ArrayList<>();
list.add("item1");
list.add("item2");
ExampleEntity entity = new ExampleEntity();
Binder<ExampleEntity> binder = new Binder<>(ExampleEntity.class);
TwinColSelect<String> twinColSelect = new TwinColSelect<>("strings");
twinColSelect.setItems(list);
twinColSelect.setRows(twinColSelect.getRows());
// binder.bind(twinColSelect, ExampleEntity::getSelectedStrings, ExampleEntity::setSelectedStrings); //TODO ?
binder.readBean(entity);
addComponent(twinColSelect);
}
private class ExampleEntity {
private List<String> selectedStrings;
public List<String> getSelectedStrings() {
return selectedStrings;
}
public void setSelectedStrings(List<String> selectedStrings) {
this.selectedStrings = selectedStrings;
}
}
}
与binder
的绑定总是基于目标组件的setValue
方法的类型。对于 TwinColSelect<String>
,值类型是 Set<String>
。为了能够将其绑定到 List<String>
类型的 bean 属性,您需要提供一个转换器,在 List
和 Set
.
之间进行转换
要设置转换器,您可以像这样进行绑定:
binder.forField(twinColSelect)
.<List<String>> withConverter(ArrayList::new, HashSet::new)
.bind(ExampleEntity::getSelectedStrings, ExampleEntity::setSelectedStrings);
请注意,在这种情况下,您需要为 withConverter
方法定义泛型类型,否则编译器会要求将 getter 定义为 return ArrayList<String>
而不是更通用的 List<String>
.
如何在 Vaadin 中将实体绑定到 TwinColSelect?我可以对简单组件(TextField、ComboBox)执行此操作,但我不知道如何对 TwinColSelect 组件执行此操作。我在注释行收到一个编译问题。 ExampleEntity 中的 SelectedString 属性应包含所有从 TwinColSelect 中选择的元素。
import com.vaadin.data.Binder;
import com.vaadin.navigator.View;
import com.vaadin.spring.annotation.SpringView;
import com.vaadin.ui.TwinColSelect;
import com.vaadin.ui.VerticalLayout;
import java.util.ArrayList;
import java.util.List;
@SpringView(name = "example")
public class Example extends VerticalLayout implements View {
public Example() {
List<String> list = new ArrayList<>();
list.add("item1");
list.add("item2");
ExampleEntity entity = new ExampleEntity();
Binder<ExampleEntity> binder = new Binder<>(ExampleEntity.class);
TwinColSelect<String> twinColSelect = new TwinColSelect<>("strings");
twinColSelect.setItems(list);
twinColSelect.setRows(twinColSelect.getRows());
// binder.bind(twinColSelect, ExampleEntity::getSelectedStrings, ExampleEntity::setSelectedStrings); //TODO ?
binder.readBean(entity);
addComponent(twinColSelect);
}
private class ExampleEntity {
private List<String> selectedStrings;
public List<String> getSelectedStrings() {
return selectedStrings;
}
public void setSelectedStrings(List<String> selectedStrings) {
this.selectedStrings = selectedStrings;
}
}
}
与binder
的绑定总是基于目标组件的setValue
方法的类型。对于 TwinColSelect<String>
,值类型是 Set<String>
。为了能够将其绑定到 List<String>
类型的 bean 属性,您需要提供一个转换器,在 List
和 Set
.
要设置转换器,您可以像这样进行绑定:
binder.forField(twinColSelect)
.<List<String>> withConverter(ArrayList::new, HashSet::new)
.bind(ExampleEntity::getSelectedStrings, ExampleEntity::setSelectedStrings);
请注意,在这种情况下,您需要为 withConverter
方法定义泛型类型,否则编译器会要求将 getter 定义为 return ArrayList<String>
而不是更通用的 List<String>
.