1

JPAContainer と Vaadin テーブル コンポーネントを使用して、Vaadin を使用して単一のデータベース テーブル用のシンプルなエディターを構築しています。アイテムの削除と編集は正常に機能しますが、アイテムの追加に問題があります。

Vaadin のチュートリアルでは、ポップアップ ウィンドウを使用して項目を追加する方法が説明されていますが、表の新しい空白行を使用して項目を追加したいと考えています。必要な機能は、ユーザーに既定のデータを含む行を提供し、ユーザーが新しい行のデータに満足した後にデータを保存できるようにすることです。

私が抱えている問題は、うまくいくと思うことをしようとすると UnsupportedOperation になることです。

私のテーブルは設定され、場所エンティティの JPAContainer にバインドされています。

private JPAContainer locations = JPAContainerFactory.make(Location.class,PERSISTENCE_UNIT);

ユーザーが保存ボタンをクリックするまでデータをデータベースに保存しないように、テーブルをバッファリングするように設定しました。

    locationTable = new Table(null,locations);
    locationTable.setVisibleColumns(new Object[]{ "id","x","y","z","createDate","lastModDate"  } );
    locationTable.setSelectable(true);
    locationTable.setSizeFull();
    locationTable.setImmediate(true);
    locationTable.setBuffered(true);
    locationTable.setVisible(true);
    locationTable.setEditable(true);

.. 保存ボタンはデータベースへの変更を保存します:

    Button saveButton = new Button("Save Changes");
    saveButton.addClickListener(new Button.ClickListener() {
        public void buttonClick(ClickEvent event) {
            locations.commit();
            statusLabel.setCaption("Changes Saved");
        }
    });

次に、新しいボタンを追加しようとするボタンをバインドします。

    Button addButton = new Button("Add An Item");
    addButton.addClickListener(new Button.ClickListener() {
        public void buttonClick(ClickEvent event) {

            Object newkey = locationTable.addItem(new Object[]{"NEWLOCATION","0","0","0","7/10/2013","7/10/2013"}, "NEWLOCATION");
            locationTable.select(newkey);
            statusLabel.setCaption("Item Added. Populate Data and click Save to make permanent.");
        }
    });

追加項目ボタンをクリックすると、UnSupportedOperationException がスローされます。

addItem の他のバリアントを呼び出してみましたが、何も動作しません。テーブルの新しい行を使用してテーブルに新しいアイテムを作成する方法を知っている人はいますか?

完全な init() ソース:

@Override
protected void init(VaadinRequest request) {

    final VerticalLayout layout = new VerticalLayout();
    layout.setMargin(true);
    setContent(layout);
    final Label statusLabel = new Label("");

    locationTable = new Table(null,locations);
    locationTable.setVisibleColumns(new Object[]{ "id","x","y","z","createDate","lastModDate"  } );
    locationTable.setSelectable(true);
    locationTable.setSizeFull();
    locationTable.setImmediate(true);
    locationTable.setBuffered(true);
    locationTable.setVisible(true);
    locationTable.setEditable(true);

    Button saveButton = new Button("Save Changes");
    saveButton.addClickListener(new Button.ClickListener() {
        public void buttonClick(ClickEvent event) {
            locations.commit();
            statusLabel.setCaption("Changes Saved");
        }
    });

    Button addButton = new Button("Add An Item");
    addButton.addClickListener(new Button.ClickListener() {
        public void buttonClick(ClickEvent event) {

            Object newkey = locationTable.addItem(new Object[]{"NEWLOCATION","0","0","0","7/10/2013","7/10/2013"}, "NEWLOCATION");
            locationTable.select(newkey);
            statusLabel.setCaption("Item Added. Populate Data and click Save to make permanent.");
        }
    });
    Button deleteButton = new Button("Delete Selected");
    deleteButton.addClickListener(new Button.ClickListener() {
        public void buttonClick(ClickEvent event) {
             locations.removeItem(locationTable.getValue());
             statusLabel.setCaption("Item Removed. Click Save to make permanent.");
        }
    });


    layout.addComponent(locationTable );
    layout.addComponent(saveButton);
    layout.addComponent(addButton);
    layout.addComponent(deleteButton);
    layout.addComponent(statusLabel);



}
4

1 に答える 1