java - 在 Vaadin 中绑定 TwinColSelect
问题描述
如何在 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>
。为了能够将它绑定到 type 的 bean 属性List<String>
,您需要提供一个在 and 之间转换的转换List
器Set
。
要设置转换器,您可以像这样进行绑定:
binder.forField(twinColSelect)
.<List<String>> withConverter(ArrayList::new, HashSet::new)
.bind(ExampleEntity::getSelectedStrings, ExampleEntity::setSelectedStrings);
请注意,在这种情况下,您需要为withConverter
方法定义泛型类型,否则编译器将要求定义 getter 以返回ArrayList<String>
而不是更通用的List<String>
.
推荐阅读
- sql-server - 用以前的记录值更新最新记录
- javascript - Switch 语句返回不正确的值
- go - 如何确认来自 Go 客户端的 gRPC 流量是 TLS 加密的
- python - 从谷歌驱动器获取 CSV,然后加载到熊猫
- excel - 如何阻止数据透视表过滤破坏我的 14 天滚动平均度量?
- javascript - 上传到 AWS S3 得到 403 Forbidden - 通过删除参数中的“ACL”解决
- go - Golang int to uint8 converison,未检测到溢出
- apache-camel - Qpid 客户端 Apache Artemis 2.14.0 高可用性不起作用
- java - 在 Spring Boot 中使用 Gradle 从环境变量设置 spring.profiles.active
- reactjs - React App 无法在 Microsoft Edge 浏览器上运行,但在 Chrome 和 Firefox 上运行良好