将操作添加到vaadin中可编辑网格中的取消按钮

时间:2015-07-10 17:36:03

标签: grid vaadin cancel-button fieldeditor

我正在使用带有Vaadin 7的可编辑网格。当一行处于编辑模式时,它会显示两个按钮:保存和取消。

enter image description here

(以防万一,图片来自这里Book of Vaadin

使用:

grid.getEditorFieldGroup().addCommitHandler(new CommitHandler() {
    private static final long serialVersionUID = 1L;
    @SuppressWarnings("unchecked")
    @Override
    public void preCommit(CommitEvent commitEvent) throws CommitException{}
    @Override
    public void postCommit(CommitEvent commitEvent) throws CommitException{}
});

我可以在保存操作中执行某些操作。 但是,我可以通过取消操作做出类似的事情吗?

谢谢。

2 个答案:

答案 0 :(得分:3)

这是该组件的严重缺陷。根据论坛,他们正在研究它,但目前似乎最直接的方法是扩展Grid组件并覆盖doCancelEditor方法。这是一个片段:

public class MyGrid extends Grid {

protected Object newRow;

@Override
protected void doCancelEditor() {
    super.doCancelEditor();
    getContainerDataSource().removeItem(newRow);
    setEditorEnabled(false);

}

public void setNewRow(Object newRow) {
    this.newRow = newRow;

}

请注意,在创建行时必须告诉MyGrid对象。此外,请注意您正在扩展服务器端,因此您不必更改客户端(窗口小部件代码),但您需要在UI设计中引用新组件。

答案 1 :(得分:0)

实际上,还应该重写saveEditor(),因为似乎也会在执行保存操作时调用doCancelEditor()。我的代码:

    public class MyGrid extends Grid {

       private boolean addingMode = false;
       private JPAContainer<SomeEntity> container;
       private Object recentlyAddedItemID;

       public MyGrid(Indexed indexed) {
          container = indexed; 
       }

       @Override
       protected void doCancelEditor() {
          Object id = getEditedItemId();
          super.doCancelEditor();
          if (addingMode) {
             getContainerDataSource().removeItem(id);
             recentlyAddedItemID = null;
          }              
          addingMode = false;
       }

       @Override
       public void saveEditor() throws FieldGroup.CommitException {
          if (addingMode) recentlyAddedItemID = getEditedItemId();
          addingMode = false;              
          super.saveEditor();
       }

       public Object getRecentlyAddedItemID() {
          return recentlyAddedItemID;
       }

       public void addNewElement(SomeEntity entity) {
          addingMode = true;          
          editItem(container.addEntity(entity));
       }       
    }

    MyGrid grid = new MyGrid(JPAContainerFactory.make(SomeEntity.class, entityManager));    
    grid.addNewElement(new SomeEntity());
    /*
    if we want to know the new items's ID (actually the new primary key
    in case of JPAContainer), we can check it by:
    */
    Object id = grid.getRecentlyAddedItemID();
    /*
    returns null if editor was cancelled and finally nothing new was persisted
    */
相关问题