我有一个Vaadin应用程序。其中一个组件是一张桌子。我需要有一个可能的用户想要添加尽可能多的列(好吧,现在说最多20个)到该表。一开始,有5个列,所以实际上用户可以添加第6-20列。 但是,在执行“layout.addComponent(...)”之后,此表格不再可编辑。
我尝试了两件事:
有一个存储当前行数的变量,每次点击“添加”按钮时,该变量增加1。每次点击,表格中都会添加1列。
另一个想法是将列号保存在变量中(如想法1)和集合中某些单元格的值(无论如何)。单击“添加”按钮后,将删除整个表,然后添加所有列(所有列都在那里+新的列)并将其添加到布局中。
然而,这些想法都不起作用。
有什么建议吗?
答案 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实现自动调用(检查源)。