Vaadin 网格更新后保留滚动位置
Retain scroll position after Vaadin Grid update
我正在试验 Vaadin 7.5,使用 Grid 显示多行(几百行)并通过推送(自动)发送定期更新(完整数据集为 1 update/sec)。
更新工作正常,但滚动条出现问题。每次更新 table 都会滚动回第一行。
我想在不滚动的情况下进行这些刷新。对此有设置或至少有解决方法吗?
两种不同的数据更新方法:
1.
BeanItem<Instrument> item = container
.getItem(container.getIdByIndex(new Random().nextInt(container.size() - 1)));
item.getItemProperty(MARGIN).setValue(updated.getMargin());
item.getItemProperty(EXPOSURE).setValue(updated.getExposure());
grid.markAsDirty();
2.
if (update instanceof List) {
List<Instrument> updates = (LinkedList<Instrument>) update;
for (Instrument updated : updates) {
Instrument item = currentData.get(new Random().nextInt(currentData.size() - 1));
item.setMargin(updated.getMargin());
item.setExposure(updated.getExposure());
}
}
container.removeAllItems();
container.addAll(currentData);
这些解决方案的执行方式因更新记录的数量而异,但两者都显示了每次更新时滚动回列表顶部的不需要的功能。
这个 SSCCE 在 Vaadin 7.5.10 上对我有用:
@Override
protected void init(VaadinRequest request) {
BeanContainer<Long, DecemberBean> dataSource = new BeanContainer<Long, DecemberBean>(DecemberBean.class);
Grid grid = new Grid(dataSource);
Runnable r = () -> {
while (true) {
System.out.println("update");
try{Thread.sleep(2000);}catch(Exception e){e.printStackTrace();};
UI.getCurrent().access(() -> {
for (Long item : dataSource.getItemIds()) {
DecemberBean k = dataSource.getItem(item).getBean();
k.setNumber(k.getNumber() + 100);
}
grid.sort(grid.getContainerDataSource().getContainerPropertyIds().iterator().next());
});
}
};
dataSource.setBeanIdResolver(bean -> new Long(bean.getNumber()));
for (int i = 0; i < 100; i++) {
dataSource.addBean(new DecemberBean(i));
}
setContent(grid);
new Thread(r).start();
}
但是,我不得不使用 grid.sort()
而不是 markAsDirty
来刷新组件的状态。我根本没有注意到任何滚动。
我正在试验 Vaadin 7.5,使用 Grid 显示多行(几百行)并通过推送(自动)发送定期更新(完整数据集为 1 update/sec)。
更新工作正常,但滚动条出现问题。每次更新 table 都会滚动回第一行。
我想在不滚动的情况下进行这些刷新。对此有设置或至少有解决方法吗?
两种不同的数据更新方法:
1.
BeanItem<Instrument> item = container
.getItem(container.getIdByIndex(new Random().nextInt(container.size() - 1)));
item.getItemProperty(MARGIN).setValue(updated.getMargin());
item.getItemProperty(EXPOSURE).setValue(updated.getExposure());
grid.markAsDirty();
2.
if (update instanceof List) {
List<Instrument> updates = (LinkedList<Instrument>) update;
for (Instrument updated : updates) {
Instrument item = currentData.get(new Random().nextInt(currentData.size() - 1));
item.setMargin(updated.getMargin());
item.setExposure(updated.getExposure());
}
}
container.removeAllItems();
container.addAll(currentData);
这些解决方案的执行方式因更新记录的数量而异,但两者都显示了每次更新时滚动回列表顶部的不需要的功能。
这个 SSCCE 在 Vaadin 7.5.10 上对我有用:
@Override
protected void init(VaadinRequest request) {
BeanContainer<Long, DecemberBean> dataSource = new BeanContainer<Long, DecemberBean>(DecemberBean.class);
Grid grid = new Grid(dataSource);
Runnable r = () -> {
while (true) {
System.out.println("update");
try{Thread.sleep(2000);}catch(Exception e){e.printStackTrace();};
UI.getCurrent().access(() -> {
for (Long item : dataSource.getItemIds()) {
DecemberBean k = dataSource.getItem(item).getBean();
k.setNumber(k.getNumber() + 100);
}
grid.sort(grid.getContainerDataSource().getContainerPropertyIds().iterator().next());
});
}
};
dataSource.setBeanIdResolver(bean -> new Long(bean.getNumber()));
for (int i = 0; i < 100; i++) {
dataSource.addBean(new DecemberBean(i));
}
setContent(grid);
new Thread(r).start();
}
但是,我不得不使用 grid.sort()
而不是 markAsDirty
来刷新组件的状态。我根本没有注意到任何滚动。