我正在寻找正确的方法来创建一个可以动态上传新行的表。作为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)。
答案 0 :(得分:0)
我找到了更好的解决方案 - 手动控制容器内容。使用IndexedContainer作为数据源而不是TableQuery并使用sql查询定期检查新数据。 Vaadin Push帮助我可视化新行。为防止滚动条跳转(这是调用refreshRowCache的结果),我使用以下参数调用私有方法Table.setCurrentPageFirstItemId(int,boolean):新行ID,false(不要调用refreshRowCache)。