Vaadin组合框具有不同的属性来显示和绑定

时间:2016-07-04 13:56:34

标签: java web-applications vaadin

我有两个域类

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}}?

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的一个例子,也可能对你有帮助。