2016-07-04 57 views
1

我有兩個領域類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

由於Bid是一種非人性化的領域,我想有一個組合框,即在A對象綁定到的屬性bId並提出本身的屬性Bname

我不明白這段代碼應該是什麼樣子。

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的領域,但我怎麼做呢,我可以顯示所有B s的名字在ComboBox,但是當commit發生時,它使用Bid

回答

3

我會建議使用ComboBox.setItemCaption(..)明確設置的項目標題:

for (final B b : allBs) { 
    bBox.setItemCaption(b.getId(), b.getName()); 
} 

然後您在組合框「屬性A的出價和組合框」集裝箱數據源綁定到B ID列表您設置你自己。

bBox.setContainerDataSource(new BeanItemContainer<>(
      String.class, allBIds)); 

或手動設置組合框的項目:

for (final B b : allBs) { 
    bBox.addItem(b.getId()); 
} 

Here與組合框,可以幫助你過一個例子。

+0

替代方法可能是'ComboBox'上的'Converter',當您在組合框中填充B對象時,可以從B對象中獲取ID,但到目前爲止我沒有嘗試過。 –

+0

似乎確實做到了。謝謝 –

相關問題