2016-07-04 6 views
1

Ich habe zwei Domain-KlassenVaadin Combobox mit unterschiedlichen Eigenschaften anzuzeigen und zu binden

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 
} 

Die Idee ist, dass A keine vollständige b nicht speichern, sondern nur seine ID.

Jetzt möchte ich ein Formular in Vaadin (7.6.7) erstellen, um eine neue A zu erstellen. Es gibt eine begrenzte Anzahl von B Objekten, so dass ich gerne eine Combobox habe, wo der Benutzer eine B auswählen kann.

Als id von B ist ein nicht-benutzerfreundlichen Bereich, Ich mag eine Combobox haben, das auf die Eigenschaft bId im A Objekt gebunden ist und präsentiert sich mit der Eigenschaft name von B.

Ich kann nicht herausfinden, wie dieser Code aussehen soll.

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 

Ich weiß, das Problem ist, dass ich eine Combobox mit Typ B auf ein Feld des String Typs gebunden habe, aber wie kann ich es machen, dass ich all B s mit dem Namen in der Combobox zeigen kann, aber wenn die commit passiert, verwendet es die id von B?

Antwort

3

Ich würde empfehlen, die Artikel Bildunterschriften von ComboBox.setItemCaption(..) mit explizit zu setzen:

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

Dann binden Sie Ihre ComboBox ‚Eigenschaft auf A der BID und der Combobox‘ Container-Datenquelle auf eine Liste von B Ids Sie einrichten dich selber.

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

oder manuell an die ComboBox Artikel:

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

Here ist ein Beispiel mit Comboboxen, die auch Ihnen helfen könnten.

+0

Alternative Ansatz möglicherweise ein 'Converter' auf der' ComboBox', die die ID aus B-Objekten erhält, wenn Sie Ihre B-Objekte in der Kombinationsfeld füllen, aber ich habe es bisher nicht versucht. –

+0

das scheint den Trick zu tun. Vielen Dank –

Verwandte Themen