Vaadin - 动态生成表

时间:2012-05-18 15:23:36

标签: java user-interface vaadin

我有一个Vaadin应用程序。其中一个组件是一张桌子。我需要有一个可能的用户想要添加尽可能多的列(好吧,现在说最多20个)到该表。一开始,有5个列,所以实际上用户可以添加第6-20列。 但是,在执行“layout.addComponent(...)”之后,此表格不再可编辑。

我尝试了两件事:

  1. 有一个存储当前行数的变量,每次点击“添加”按钮时,该变量增加1。每次点击,表格中都会添加1列。

  2. 另一个想法是将列号保存在变量中(如想法1)和集合中某些单元格的值(无论如何)。单击“添加”按钮后,将删除整个表,然后添加所有列(所有列都在那里+新的列)并将其添加到布局中。

  3. 然而,这些想法都不起作用。

    有什么建议吗?

2 个答案:

答案 0 :(得分:0)

我认为在与addContainerProperty关联的Container上调用Table就足够了。这样做会触发PropertySetChangeEvent表。

当然,除非您使用Table.setVisibleColumns限制了可见列。

如果这对您没有帮助,那么一段代码可以帮助解决问题。

答案 1 :(得分:0)

如果MyContainer扩展了IndexedContainer,你就拥有了充分的自由;作为一个示例,我有统计信息,这是简单的(动态)Map在ZooKeeper中序列化,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添加新的(键,值)对时,我们将自动获得新列,其中&#34; key&#34;是列标题,&#34;值&#34;是细胞价值。没有必要打电话&#34;火&#34 ;;它将由IndexedContainer实现自动调用(检查源)。