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

标签 java vaadin vaadin7

我正在尝试 Vaadin 7.5,使用网格显示多行(几百行)并通过推送(自动)发送定期更新(整个数据集为 1 次更新/秒)。

更新工作正常,但我在滚动条方面遇到问题。每次更新时,表格都会滚动回第一行。

我想在不进行任何滚动的情况下进行这些刷新。是否有设置或至少有解决方法?

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

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 来刷新组件的状态。我根本没有注意到任何滚动。

关于java - Vaadin 网格更新后保留滚动位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34245269/

相关文章:

vaadin - 如何在 vaadin 网格中显示复选框而不是 bool 值?

grails - grails:生产环境所需的scss编译器

java - 在 Vaadin 7 的 TabSheet 中延迟加载选项卡内容的策略

java - 基于属性(而不是角色)隐藏 portlet liferay

java - 进度对话框未出现

java - 在关闭对话框窗口中单击下载按钮时,有时找不到 StreamResource 资源

vaadin - BeanFieldGroup 与 FieldGroup 与 BeanItem 的比较?

java - Vaadin UI 大小和滚动条问题

java - Apache Commons Math3 数字百分位数

java - Springboot、Vaadin 和 RestController