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);
}