如何在BeanItemContainer中添加和修改bean

时间:2013-12-30 14:46:50

标签: java vaadin vaadin7

我正在开发一个Vaadin应用程序。现在,我遇到了BeanItemContainer的问题。我的容器里面有几件物品。

private void populateTable() {
  tableContainer.removeAllItems();
  for(MyBean  myBean : beans){
  tableContainer.addItem(myBean);
  }
}

当我选择表格中的项目时,我将选中的项目与活页夹绑定,并自动填写表格

table.addItemClickListener(new ItemClickListener() {
  public void itemClick(ItemClickEvent event) {
    myBean = ((BeanItem<MyBean>) event.getItem()).getBean();                
    //BeanFieldGroup<MyBean>
    binder.setItemDataSource(myBean);
  }
}); 

private Component makeForm() {      
  formLayout = new FormLayout();
  binder.bind(comboBoxModPag,"modPagamento");
  binder.bind(fieldInizioVal,  "id.dInizioVal");
  formLayout.addComponent(comboBoxModPag);
  formLayout.addComponent(fieldInizioVal);
  formLayout.addComponent(binder.buildAndBind(getI18NMessage("dValidoAl"), "dValidoAl", DateField.class));
  return formLayout;        
}

现在,我必须以不同的方式管理用户交互。例如,如果用户修改了组合框内的值,我必须在容器中添加一个新的Bean,而如果用户修改了字段fieldInizioVal的值,我必须更新当前的Bean。

insertOrUpdateButton.addClickListener(new ClickListener() {
  @Override
  public void buttonClick(ClickEvent event) {
    tableContainer.addItem(myBean));
  }
});

但是,添加新项目时,容器会正确添加新项目,但也会修改所选的旧项目。

我该怎么办?

1 个答案:

答案 0 :(得分:1)

我以这种方式解决了

comboBoxModPag.addValueChangeListener(new ValueChangeListener() {

public void valueChange(ValueChangeEvent event) {
    MyBean oldValue = (MyBean) comboBoxModPag.getOldValue();
    MyBean newValue = (MyBean) comboBoxModPag.getValue();

        if( oldValue!=null &&  newValue!=null && !oldValue.equals(newValue) ){
            insertMode = true;
        }
        else{
            insertMode = false;
        }

    }

}
});

protected void saveOrUpdateModPagContrattoSito() {
if(insertMode){
    MyBean newMyBean = new MyBean(myBean);

    //Do somethings to restore myBean statuse 
    //....
    //....
    tableContainer.addBean(newMyBean);
}
else{
    tableContainer.addBean(myBean);
}
table.refreshRowCache();
}

但我不知道这是否正确。