【问题标题】:How To Implement Scroll Listener In Vaadin 7 Tables如何在 Vaadin 7 表中实现滚动侦听器
【发布时间】:2014-02-16 00:12:35
【问题描述】:

在 Vaadin 中,当您在表格 (com.vaadin.ui.Table) 中向下或向上滚动时,不会触发任何事件来告诉您用户正在滚动。

为什么我们需要在表格中滚动事件?

让我们先看看这个 Vaadin (Dashboard Demo) 的例子,打开链接后点击登录,你会被自动重定向到交易页面,这个页面显示了一个金融交易表,这些当您滚动时,事务将一个接一个地显示,实际发生的是数据是在 UI 启动时加载的(所有事务)。

现在,假设我们有数千或数百万笔交易。启动 UI 时将它们全部加载在一起是否符合逻辑?一点一点地加载它们以防止在等待所有事务加载时降低 UI 速度不是明智之举吗?。

这个问题的最佳解决方案是获取第一个(比如 100 个事务)然后在向下滚动时获取更多事务,但是这个解决方案只有一个问题,即 Vaadin 不支持 com.vaadin.ui.Table 中的>滚动事件处理

【问题讨论】:

    标签: vaadin


    【解决方案1】:

    根据您的问题,您正在寻找延迟加载。

    如果您将表与支持延迟加载的容器连接,您的项目将从其数据源延迟加载。这意味着当您滚动并离开缓冲项目时,表格“要求”容器提供更多项目。容器然后从它的数据源加载更多的项目。

    例如,来自 Vaadin 的 JPAContainer 支持该功能。此容器使用 JPA 连接到数据源。更多信息here

    【讨论】:

    • 我喜欢这个,但我在这里谈论的是滚动事件:)
    • @X-Ware 我知道你在谈论滚动监听器,但根据 [...] 这个问题的最佳解决方案是获取第一个(比如 100 个事务)然后在滚动时获取更多事务down [...] 我想提一下,还有一个延迟加载功能。
    • @nexus 并且这个“功能”被破坏了,例如,SQLContainer,所以用户想要自己实现它是有道理的......
    【解决方案2】:

    Vaadin Table 的滚动事件

    Dashboard Demo(GitHub repo) 项目实际上依赖于 Vaadin 表,正如您在 this 文件中的代码中看到的那样,53我们我们要做的就是扩展com.vaadin.ui.Table并实现我们自己的行为,从现在开始支持滚动 Vaadin 表格。

    首先,让我们创建一个新的简单接口ScrollingTableScrollListener这个接口将负责实现滚动事件,其代码如下所示:

    包 com.vaadin.demo.dashboard.scrolling;
    
    公共接口 ScrollingTableScrollListener {
         公共无效doTableScroll();
    }

    只要您的视图中有一个table,并且您想为其添加一个scroll事件处理程序,就应该实现这个接口。但是等一下,这不适用于任何类型的表,这只适用于我们自己的表。

    现在,让我们创建表,表的名称是 (ScrollingTable),它扩展了 (com.vaadin.ui.Table) 这个类代码是:

    包 com.vaadin.demo.dashboard.scrolling;
    
    导入 java.util.ArrayList;
    导入 java.util.List;
    导入 java.util.Map;
    
    导入 com.vaadin.ui.Table;
    
    公共类 ScrollingTable 扩展表 {
    
        私有静态最终长序列版本UID = 5007124121625961567L;
        列出侦听器 = new ArrayList();
    
        私人无效fireSrollEvent(){
            for (ScrollingTableScrollListener listener : listeners) {
                listener.doTableScroll();
            }
        }
    
        公共无效 addScrollListener(ScrollingTableScrollListener 监听器){
            listeners.add(listener);
        }
    
        @覆盖
        public void changeVariables(Object source, Map variables) {
            super.changeVariables(源,变量);
            fireSrollEvent();
        }
    }

    其实这张表和 Vaadin 的表是一样的,但是有以下区别:

    1. 它重写了超类(Vaadin Table : com.vaadin.ui.Table)的方法changeVariables(),实际上这里奠定了我们的核心业务,将启动滚动行为。我们这里做的是调用超类的changeVariables(),然后调用fireSrollEvent()方法。
    2. 另一个区别是它多了两个成员:
      1. public void addScrollListener(ScrollingTableScrollListener listener)此方法将负责为表格的滚动事件添加新的侦听器。
      2. private void fireSrollEvent()此方法将由changeVariables() 方法调用,并将在此表通过调用addScrollListener(). 方法添加的每个已注册侦听器上调用doTableScroll() 方法

    现在为了利用我们添加的新内容,我们将更改上述 Dashboard 演示的原始代码(特别是文件TransactionsView.java)。在这个文件中,只有几行需要添加和修改。

    首先,我们将修改line 49,添加该类将实现的新接口,即我们的新接口(ScrollingTableScrollListener),并通过在该类末尾添加以下行来实现其单一方法:

    @Override
    公共无效doTableScroll(){
        // TODO 自动生成的方法存根
        Notification.show("你正在滚动!\n你可以在这里添加你自己的行为!");
    }

    然后,我们将更改 5366 这两行以使用新继承的类 (ScrollingTable) 而不是超类 (Table):

    //原类中的第53行
    药片;
    //我们班的第55行
    滚动表 t;
    ……
    ……
    ……
    //原始类中的第66行
    t = 新表() {
    //我们班的第68行
    t = new ScrollingTable() {

    最后,我们应该将监听器添加到我们的 ScrollingTable 的滚动条中:),这是通过在定义表(我们的新类的line 89)之后在表 (t) 上调用方法 addScrollListener 来完成的:

    t.addScrollListener(this);

    这一行表示这个类(TransactionView)正在监听 ScrollingTable (t) 的滚动事件,每当用户向下/向上滚动 ScrollingTable (t) 时,它都会调用方法 doTableScroll。

    在这里,您现在有一个表格,它会在用户滚动时告诉您,您现在的任务是在表格触发滚动事件时执行您想要的操作,并将您的内容放在大括号 {} 的我们在第一步中定义的方法:

    @Override
    公共无效doTableScroll(){
          // 把你自己的代码放在这里...
    }

    这是 GitHub 上新仪表板的link

    答案在我的blog

    【讨论】:

    • 我修改了答案:)
    • 正如其他人在博客 cmets 中也指出的那样,只要表上发生任何事件,您的实现就会触发 doTableScroll。我猜你需要过滤消息并且只在variables 包含滚动时触发doTableScroll
    • 我已经实现了你的 coud 但滚动事件没有被触发!唯一被触发的事件是当我点击表格的某个项目时,或者加载表格时...我可以检查什么?
    • @AhmadHajjar 如果一个子类是 Grid 而不是像这样的表,你会覆盖什么方法 --> stackoverflow.com/questions/39380115/…
    【解决方案3】:

    嗯,事件会在对表的每个操作(例如行选择等)上触发。更合适的解决方案是额外检查表状态中的变量变化。

    这里的例子:

    public class ScrollingTable extends Table {
    
    // ...
    
    @Override
    public void changeVariables(Object source, Map<String, Object> variables) {
        super.changeVariables(source, variables);
        handleScrollEvent(variables);
    }
    
    private void handleScrollEvent(Map<String, Object> variables) {
        if (variables.containsKey("firstvisible")) {
            for (TableScrollListener listener : listeners) {
                listener.doTableScroll();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-03
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      • 2018-08-26
      • 1970-01-01
      相关资源
      最近更新 更多