Java Vaadin网格更新后保留滚动位置

Java Vaadin网格更新后保留滚动位置,java,vaadin,vaadin7,Java,Vaadin,Vaadin7,我正在试验Vaadin 7.5,使用网格显示多行(几百行),并通过push(自动)发送定期更新(完整数据集每秒更新1次) 更新工作正常,但我的滚动条有问题。每次更新时,表都会回滚到第一行 我想做这些刷新没有任何滚动。是否对此有设置或至少有解决方法 两种不同的数据更新方法: 一, BeanItem项目=容器 .getItem(container.getIdByIndex(new Random().nextInt(container.size()-1)); item.getItemProperty(

我正在试验Vaadin 7.5,使用网格显示多行(几百行),并通过push(自动)发送定期更新(完整数据集每秒更新1次)

更新工作正常,但我的滚动条有问题。每次更新时,表都会回滚到第一行

我想做这些刷新没有任何滚动。是否对此有设置或至少有解决方法

两种不同的数据更新方法:

一,

BeanItem项目=容器
.getItem(container.getIdByIndex(new Random().nextInt(container.size()-1));
item.getItemProperty(MARGIN).setValue(updated.getMargin());
item.getItemProperty(EXPOSURE).setValue(updated.getExposure());
grid.markAsDirty();
二,

if(更新instanceof列表){
列表更新=(LinkedList)更新;
用于(仪器更新:更新){
仪器项=currentData.get(new Random().nextInt(currentData.size()-1));
item.setMargin(更新的.getMargin());
item.setExposure(更新的.getExposure());
}
}
容器。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();
}
@覆盖
受保护的void init(VaadinRequest请求){
BeanContainer数据源=新的BeanContainer(DecemberBean.class);
网格=新网格(数据源);
可运行r=()->{
while(true){
System.out.println(“更新”);
尝试{Thread.sleep(2000);}catch(异常e){e.printStackTrace();};
UI.getCurrent().access(()->{
for(长项:dataSource.getItemId()){
Decemberbeank=dataSource.getItem(item).getBean();
k、 setNumber(k.getNumber()+100);
}
sort(grid.getContainerDataSource().getContainerPropertyIds().iterator().next());
});
}
};
setBeanIdResolver(bean->new Long(bean.getNumber());
对于(int i=0;i<100;i++){
addBean(新的DecemberBean(i));
}
设置内容(网格);
新线程(r.start();
}
但是,我必须使用
grid.sort()
而不是
markAsDirty
来刷新组件的状态。我根本没有注意到任何滚动

    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);
@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();
}