1

我有一个 Vaadin 应用程序。它的一个组件是一张桌子。我需要一种可能性,可以根据用户的需要向该表添加任意数量的列(好吧,假设目前最多 20 个)。一开始有5列,所以实际上用户可以添加第6-20列。但是,在执行“layout.addComponent(...)”之后,这个表就不能再编辑了。

我尝试了两件事:

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

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

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

有什么建议么?

4

2 回答 2

0

如果 MyContainer 扩展了 IndexedContainer,你就拥有完全的自由;作为一个示例,我有统计信息,它只是在 ZooKeeper 中序列化的(动态)Map,并且 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 添加新的 (key, value) 对时,我们会自动获取新的列,其中“key”是列标题,“value”是单元格值。不用叫“火”;它将由 IndexedContainer 实现自动调用(检查源)。

于 2012-10-19T13:36:18.423 回答
0

我认为调用addContainerPropertyContainer您的Table. 这样做应该PropertySetChangeEvent会触发表。

当然,除非您使用Table.setVisibleColumns.

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

于 2012-05-18T22:54:06.767 回答