我有两个领域类
public class A {
private String nick;
private String bId;
// getters & setters
}
public class B {
private String id;
private String name;
// a lot of other fields
// getter and setters
}
想法是A
不保存完整的 b
, 但只有它的 id。
现在我喜欢在 Vaadin (7.6.7) 中创建一个表单来创建一个新的 A
.数量有限 B
对象可用,所以我喜欢有一个组合框,用户可以在其中选择 B
.
作为 id
的 B
是一个非用户友好的字段,我喜欢有一个组合框,它绑定(bind)到属性 bId
在A
对象并以属性 name
呈现自己的 B
.
我不知道这段代码应该是什么样子。
FormLayout layout = new FormLayout();
BeanFieldGroup<A> dataBinder = new BeanFieldGroup(A.class);
Field<?> nickField = dataBinder.buildAndBind("nick");
layout.addComponent(nickField);
Combobox bBox = new Combobox("B");
List<B> allBs = ... // get all Bs;
allBs.stream().forEach(bBox::addItem);
dataBinder.bind(bBox, "bId");
// this does not work really
我知道问题是我绑定(bind)了类型为 B
的组合框到 String
类型的字段, 但我该怎么做才能显示所有 B
s 在组合框中具有名称,但是当 commit
正在发生,它使用 id
的 B
?
最佳答案
我建议使用 ComboBox.setItemCaption(..)
显式设置项目标题:
for (final B b : allBs) {
bBox.setItemCaption(b.getId(), b.getName());
}
然后您将 ComboBox 的属性绑定(bind)到 A 的 bId,并将 ComboBox 的容器数据源绑定(bind)到您自己设置的 B ID 列表。
bBox.setContainerDataSource(new BeanItemContainer<>(
String.class, allBIds));
或手动设置 ComboBox 项目:
for (final B b : allBs) {
bBox.addItem(b.getId());
}
Here是组合框的示例,也可能对您有所帮助。
关于java - 具有不同属性以显示和绑定(bind)的 Vaadin 组合框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38186490/