0

私は Vaadin の初心者で、すでに彼らの本を読んでいます。私の質問は、編集可能なテーブルと、変更されたときに値を取得する方法についてです。

つまり、基本的に私が持っているのは単純なテーブルで、これに HashMap を入力します。したがって、編集ボタンはフィールドを編集可能にし、行追加ボタンは行を追加します。実装は簡単です。しかし、私が管理しなかったのは更新ボタンです。行を追加したり、フィールドを編集したりするときに、変更されたすべてのキーと値をペアとしてハッシュマップに再度取得し、それを使用して sth を実行したいからです。

変更されたすべてのセルが得られることはわかっていProperty.ValueChangeListenerますが、必要なのは行全体に関する情報であり、単一のセルではありません。たとえば、val2が に変更された場合val22、それに応じてハッシュマップを更新したいとします。したがって、私も取得する必要がありkey2ます。簡単に言えば、何かが変更されたときに行全体を取得したいのです。それに関するアイデアはありますか?

私のUIは次のようになり、Vaadin 6を使用しています: ここに画像の説明を入力

4

1 に答える 1

3

そのようなことが必要な人のために、回避策を見つけました:

// I needed to fill the table with an IndexedContainer
final IndexedContainer container = new IndexedContainer();
// table headers
container.addContainerProperty("Metadata Key", String.class, null);
container.addContainerProperty("Metadata Value", String.class, null);

// Now fill the container with my hashmap (objectMetadatas) and at the end we will add the container to the table
int i = 0;
for (String k : objectMetadatas.keySet()) {
    Integer rowId = new Integer(i);
    container.addItem(rowId);
    container.getContainerProperty(rowId, "Metadata Key").setValue(k);
    container.getContainerProperty(rowId, "Metadata Value").setValue(objectMetadatas.get(k));
    i++;
}

// then added a ValueChangeListener to the container
container.addListener(new Property.ValueChangeListener() {
    public void valueChange(ValueChangeEvent event) {
         Property p = event.getProperty(); // not necessary
             System.out.println(p);        // not necessary
    }
});

// add the the button to update the table and get the changed values into your hashmap
buttonUpdate.addListener(new Button.ClickListener() {
    public void buttonClick(ClickEvent event) {
        Map<String, String> map = new HashMap<String,String>();
        Collection i = tableMetadata.getContainerDataSource().getItemIds();
        for (int x = 0; x < i.size(); x++) {
            // Items in Vaadin represent rows, since I have two columns
            // i have only two values in my row as following: "row1 row2"
            // if you have four columns on your table 
            // your item will look like this: "row1 row2 row3 row4"
            Item it=myTable.getContainerDataSource().getItem(x);
            // thats why I am splitting it
            String[] row= it.toString().split(" ");
            map.put(row[0], row[1]);
        }
        // Now all changed values are in your map! 
        // Do sth with that map
    }
});

// Finally do not forget to add that container to your table
tableMetadata.setContainerDataSource(container);

それで全部です!それが誰かに役立つことを願っています!そして、より良い方法を見つけたら、投稿してください。

于 2013-05-27T12:26:37.453 に答える