2017-01-27 1 views
1

Je BeanItemContainer, qui je charge la base de données via JDBC:Comment lier BeanItemContainer à Combobox

BeanItemContainer myBeans = new BeanItemContainer<>(MyBean.class, mybeanDao.findAll()); 

et voici comment je joins à combobox:

Combobox combo = new Combobox(); 
combobox.setContainerDataSource(myBeans); 

Jusqu'à présent, si bien . J'ai reçu ce que je veux, mais pour l'instant j'ai un problème - Comment puis-je obtenir l'ID réel qui a été sélectionné? Cela doit être synchronisé (id sélectionné dans combobox est l'entrée réelle dans la base de données).

Je ne sais pas, comment résoudre ce problème

S'il vous plaît aider

PS MyBean classe

public class MyBean { 

    private Long id; 
    private String field1; 

*** getters /setters *** 
    and toString() {} method 
} 

Répondre

2

enter image description here Voici la co de:

@Theme("mytheme") 
public class MyUI extends UI { 

@Override 
protected void init(VaadinRequest vaadinRequest) { 
    final VerticalLayout layout = new VerticalLayout(); 
    layout.setMargin(true); 
    layout.setSpacing(true); 
    setContent(layout); 

    BeanItemContainer myBeans = new BeanItemContainer<>(MyBean.class, getBeans()); 

    ComboBox combo = new ComboBox(); 
    combo.setContainerDataSource(myBeans); 
    combo.setItemCaptionMode(AbstractSelect.ItemCaptionMode.PROPERTY); 
    combo.setItemCaptionPropertyId("field"); 

    combo.addValueChangeListener(new Property.ValueChangeListener() { 
     @Override 
     public void valueChange(Property.ValueChangeEvent event) { 
      MyBean bean = (MyBean) combo.getValue(); 

      Notification notif = new Notification("Selected Bean Id: "+bean.getId(), Notification.Type.TRAY_NOTIFICATION); 
      notif.setPosition(Position.TOP_CENTER); 
      notif.show(Page.getCurrent()); 
     } 
    }); 

    layout.addComponent(combo); 
} 

@WebServlet(urlPatterns = "/*", name = "MyUIServlet", asyncSupported = true) 
@VaadinServletConfiguration(ui = MyUI.class, productionMode = false) 
public static class MyUIServlet extends VaadinServlet { 
} 

public class MyBean { 

    private Long id; 
    private String field; 

    public MyBean(Long id, String field) { 
     this.id = id; 
     this.field = field; 
    } 

    public Long getId() { 
     return id; 
    } 

    public String getField() { 
     return field; 
    } 

} 

public ArrayList<MyBean> getBeans() { 
    ArrayList<MyBean> beans = new ArrayList<>(); 

    MyBean bean = new MyBean(1l, "Vikrant"); 
    beans.add(bean); 

    bean = new MyBean(2l, "Rampal"); 
    beans.add(bean); 

    bean = new MyBean(3l, "viky"); 
    beans.add(bean); 


    return beans; 
} 

}

+0

J'ai testé votre option et cela a bien fonctionné. Mais il y a un problème. Vous voyez que j'ai l'application vaadin spring et ceci suppose d'attacher ce beanItemContainer à la fenêtre modale. J'ai donc besoin de précharger les beans de la base de données lorsque l'utilisateur accède à la fenêtre modale. J'ai essayé d'utiliser @PostConstruct mais cela n'a rien fait (ou je me suis trompé). Grand merci – Reborn

+0

Je ne vois aucun problème dans votre approche. Ça devrait marcher. Probablement, vous pouvez partager du code. –

+0

Malheureusement, je ne peux pas faire de code atm, mais je vous ferai savoir quand c'est fait. S'il vous plaît restez à l'écoute. – Reborn

1

Si je comprends bien la question combo.getValue() devrait vous donner le MyBean instance par rapport à la sélection en cours (ou null si aucun élément n'est sélectionné)

+0

oui, vous avez bien compris mon problème. Cependant, 'combo.getValue()' renvoie l'objet 'Object', qui est difficile à convertir en Long problématique. Mais une fois cela fait j'ai quelques problèmes avec une persistance des données - 1) il écrit à la légende de base de données de l'élément sélectionné ou ... (j'ai essayé de convertir en Long en utilisant tresspass asString) ligne entière (avec id et autres) – Reborn