Как добавить и изменить bean-компонент в BeanItemContainer

Я разрабатываю приложение 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;        
}

Теперь мне нужно управлять взаимодействием с пользователем по-другому. Например, если пользователь изменяет значение внутри поля со списком, я должен добавить новый Бин в контейнер, а если пользователи изменяют значение поля fieldInizioVal, я должен обновить текущий Бин.

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

Но при добавлении нового элемента контейнер правильно добавляет новый элемент, но также изменяет выбранный старый элемент.

Как я могу сделать?


person Skizzo    schedule 30.12.2013    source источник
comment
как создается новый элемент?   -  person nexus    schedule 30.12.2013


Ответы (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();
}

Но я не знаю, правильный ли это путь.

person Skizzo    schedule 30.12.2013