2017-01-27 11 views
1

У меня есть BeanItemContainer, который я загрузить из базы данных через JDBC:Как связать BeanItemContainer с Combobox

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

и это, как я прикрепить его к комбобоксу:

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

До сих пор, так хорошо , Я получил то, что хочу, но на данный момент у меня проблема - Как получить фактический идентификатор, который был выбран? Это должно быть синхронизировано (идентификатор, выбранный в combobox, является фактической записью в базе данных).

Я понятия не имею, как решить эту проблему

Пожалуйста, помогите

PS MyBean класс

public class MyBean { 

    private Long id; 
    private String field1; 

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

ответ

2

enter image description here Вот код :

@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

Я тестировал ваш вариант, и он работал хорошо. Но есть проблема. Вы видите, что у меня есть приложение vaadin spring, и предположим, что этот beanItemContainer привязан к модальному окну. Поэтому мне нужно предварительно загружать бобы из базы данных, когда пользователь переходит в модальное окно. Я пытался использовать @PostConstruct, но ничего не делал (или я сделал что-то неправильно). Большое спасибо – Reborn

+0

Я не вижу никаких проблем в вашем подходе. Он должен работать. Возможно, вы можете поделиться некоторым кодом. –

+0

К сожалению, я не могу сделать код atm, но я сообщу вам, когда это будет сделано. Пожалуйста, не переключайтесь. – Reborn

1

Если я понял вопрос правильно combo.getValue() должен дать вам MyBean экземпляр относительно текущего выбора (или null, если ни один элемент не выбран)

+0

да, вы правильно поняли мою проблему. однако 'combo.getValue()' возвращает объект Object, который довольно сложно преобразовать в Long problematic. Но как только это закончится, у меня есть некоторые проблемы с постоянством данных - 1) он пишет в заголовке базы данных выбранного элемента или ... (я попытался преобразовать в Long с помощью tresspass as toString) целая строка (с идентификатором и другими связанными вещами) – Reborn