我有两个域类
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
个对象数量有限,所以我想要一个Combobox,用户可以选择B
。
由于id
的{{1}}是一个非用户友好的字段,我希望有一个Combobox,它绑定到B
中的属性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
类型的组合框绑定到B
类型的字段,但是如何创建它,我可以显示所有String
在Combobox中使用名称,但在B
发生时,它会使用commit
的{{1}}?
答案 0 :(得分:3)
我建议您使用ComboBox.setItemCaption(..)
:
for (final B b : allBs) {
bBox.setItemCaption(b.getId(), b.getName());
}
然后你绑定你的ComboBox&#39;属于A&#39&b;和ComboBox&#39;容器数据源到您自己设置的B ID列表。
bBox.setContainerDataSource(new BeanItemContainer<>(
String.class, allBIds));
或手动设置ComboBox项目:
for (final B b : allBs) {
bBox.addItem(b.getId());
}
Here是ComboBoxes的一个例子,也可能对你有帮助。