1

Vaadin 7 で編集可能なグリッドを使用しています。行が編集モードの場合、保存とキャンセルの 2 つのボタンが表示されます。

ここに画像の説明を入力

(念のため、画像はこちら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{}
});

保存アクションで何かを行うことができます。しかし、キャンセルアクションでそのようなことはできますか?

ありがとうございました。

4

2 に答える 2

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 デザインで新しいコンポーネントを参照する必要があることに注意してください。

于 2015-11-03T21:16:11.987 に答える
0

実際には、保存アクションでも doCancelEditor() が呼び出されるように見えるため、saveEditor() もオーバーライドする必要があります。私のコード:

    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
    */
于 2015-12-29T23:46:35.100 に答える