Vaadin 7:动态地将新数据填入表中

时间:2014-05-28 09:46:15

标签: vaadin

我正在寻找正确的方法来创建一个可以动态上传新行的表。作为DataSource,我正在使用带有TableQuery的SQLContainer。可能有很多数据应该快速上传。

无论如何,我目前的意识如下:

Table messagesList = new Table();
...............................
messagesList.setCacheRate(0.1d);
messagesList.setContainerDataSource(messagesContainer);
messagesList.setSelectable(true);        
messagesList.setImmediate(true);
messagesList.setSizeFull();
new InitializerThread().start();
...............................

使用refreshRowCache方法和Vaadin Push tecknology在另一个帖子中上传数据:

class InitializerThread extends Thread {
        @Override
        public void run() {
            while (!Thread.interrupted()) {
                try {
                    Thread.sleep(refreshMessagesPeriod);
                } catch (InterruptedException e) {
                }
                access(new Runnable() {
                    @Override
                    public void run() {
                        if (messagesList != null && !messagesList.getItemIds().isEmpty()) {
                            messagesList.refreshRowCache();
                            messagesList.focus();
                        }
                    }
                });
            }
        }
}

这种方法有许多缺点: 1.如果表中有很多行,则每次刷新表中所有行的缓存是非常低效的方法。 2.当行的缓存刷新时,滚动条跳转到表格的页面顶部。我没有找到保存滚动位置的方法,并在刷新后设置上一个滚动位置。 3.如果我在表格的单元格中选择了一些文本,则在行的缓存刷新之后选择会消失。

我希望有一种轻量级,更好的技术可以动态地将新数据填充到表中。 我使用Vaadin 7.1.15,如果需要,可以更改Vaadin类型的表格(而不是com.vaadin.ui.Table)。

1 个答案:

答案 0 :(得分:0)

我找到了更好的解决方案 - 手动控制容器内容。使用IndexedContainer作为数据源而不是TableQuery并使用sql查询定期检查新数据。 Vaadin Push帮助我可视化新行。为防止滚动条跳转(这是调用refreshRowCache的结果),我使用以下参数调用私有方法Table.setCurrentPageFirstItemId(int,boolean):新行ID,false(不要调用refreshRowCache)。