1

Vaadin アプリケーションがあります。そのコンポーネントの 1 つがテーブルです。そのテーブルに、ユーザーが必要な数の列を追加する可能性が必要です (まあ、現時点では最大 20 としましょう)。最初は 5 つの列があるので、実際にはユーザーは列 6 から 20 を追加できます。ただし、「layout.addComponent(...)」を実行すると、このテーブルは編集できなくなります。

私は2つのことを試しました:

  1. 現在の行数を格納する変数があり、「追加」ボタンをクリックするたびに 1 ずつ増加します。クリックするたびに、1 列がテーブルに追加されます。

  2. 別のアイデアは、列番号を変数に保持し (アイデア 1 のように)、セルの値をコレクションのどこかに保持することでした (何でも)。「追加」ボタンをクリックすると、テーブル全体が削除され、すべての列が追加され (そこにあったすべての列と新しい列が追加されます)、レイアウトに追加されます。

ただし、これらのアイデアはどれも機能しません。

助言がありますか?

4

2 に答える 2

0

MyContainer が IndexedContainer を拡張する場合、完全な自由が得られます。サンプルとして、ZooKeeper でシリアル化された単純な (動的) Map である Statistics があり、MyContainer は ZooKeeper の変更をリッスンします。

public class MyContainer extends IndexedContainer {
    ...
    public void process(final ModelChangeEvent event) {
        ...
        for (Map.Entry<String, Long> entry : newTask.getCounters().entrySet()) {
            addContainerProperty(entry.getKey(), Long.class, 0L);
            Property property = getContainerProperty(taskName, entry.getKey());
            property.setValue(entry.getValue());
        }
        fireContainerPropertySetChange();
        ...
    }

新しい (キー、値) ペアを Map に追加すると、新しい列が自動的に取得されます。ここで、「キー」は列のタイトル、「値」はセルの値です。「火」と呼ぶ必要はありません。IndexedContainer 実装によって自動的に呼び出されます (ソースを確認してください)。

于 2012-10-19T13:36:18.423 に答える
0

あなたのにリンクされている でaddContainerProperty呼び出すだけで十分だと思います。それを行うと、テーブルにa が発生するはずです。ContainerTablePropertySetChangeEvent

もちろん、を使用して表示される列を制限している場合を除きますTable.setVisibleColumns

これで問題が解決しない場合は、コードの一部が問題の解決に役立つ可能性があります。

于 2012-05-18T22:54:06.767 に答える