如何在Vaadin 7表中实现Scroll Listener

时间:2014-02-16 00:12:36

标签: vaadin

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

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

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

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

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

3 个答案:

答案 0 :(得分:2)

Vaadin Table的滚动事件

Dashboard Demo(GitHub repo)项目实际上取决于Vaadin表格,如{strong 3} 中<{3}}文件中的代码所示我们要做的是扩展 com.vaadin.ui.Table 并实现我们自己的行为,从现在开始支持滚动Vaadin表。

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

package com.vaadin.demo.dashboard.scrolling;

public interface ScrollingTableScrollListener {
     public void doTableScroll();
}

只要您在视图中有表格,并且想要为其添加滚动事件处理程序,就应该实施此界面。但是等一下,这不适用于任何类型的表,这仅适用于我们自己的表。

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

package com.vaadin.demo.dashboard.scrolling;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.vaadin.ui.Table;

public class ScrollingTable extends Table {

    private static final long serialVersionUID = 5007124121625961567L;
    List listeners = new ArrayList();

    private void fireSrollEvent() {
        for (ScrollingTableScrollListener listener : listeners) {
            listener.doTableScroll();
        }
    }

    public void addScrollListener(ScrollingTableScrollListener listener) {
        listeners.add(listener);
    }

    @Override
    public void changeVariables(Object source, Map variables) {
        super.changeVariables(source, variables);
        fireSrollEvent();
    }
}

实际上,这个表与Vaadin的表相同,但它有以下不同之处:

        
  1. 它覆盖了超类的方法changeVariables()(Vaadin表: com.vaadin.ui.Table ),实际上这里是我们的核心业务,它将启动滚动行为。我们在这里做的是我们调用了超类的changeVariables(),然后我们调用了fireSrollEvent()方法。
  2.     
  3. 另一个不同之处是它还有两个成员:
          
    1. public void addScrollListener(ScrollingTableScrollListener listener)此方法将负责为表的滚动事件添加新的侦听器。
    2.     
    3. private void fireSrollEvent()此方法将由changeVariables()方法调用,并将在此表添加的每个已注册侦听器上调用方法doTableScroll()通过调用方法addScrollListener().
    4. 现在要使用我们添加的新内容,我们将更改上述Dashboard演示的原始代码(特别是文件this)。在此文件中,只需添加和修改几行。

      首先,我们将通过添加此类将实现的新接口来修改TransactionsView.java,这是我们的新接口(ScrollingTableScrollListener)并通过在此类的末尾添加以下行来实现其单个方法: / p>

      @Override
      public void doTableScroll() {
          // TODO Auto-generated method stub
          Notification.show("You are scrolling!\nYou can add your own behavior here!");
      }

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

      //Line 53 in the original class
      Table t;
      //Line 55 in our class
      ScrollingTable t;
      ....
      ....
      ....
      //line 66 in the original class
      t = new Table() {
      //line 68 in our class
      t = new ScrollingTable() {

      最后,我们应该将侦听器添加到我们的ScrollingTable的卷轴:),这是通过在定义表(我们的新类的66)之后调用表(t)上的方法addScrollListener来完成的:

      t.addScrollListener(this);

      此行表示此类(TransactionView)正在侦听ScrollingTable(t)滚动事件,并且只要用户向下/向上滚动ScrollingTable(t),它就会调用方法doTableScroll。

      在这里,您现在有一个表格会告诉您每当用户滚动时,您现在的任务是在表格触发滚动事件时将您的内容放在大括号之间{}我们在第一步中定义的方法:

      @Override
      public void doTableScroll() {
            // Put your own code here ...
      }

      以下是GitHub上新Dashboard的line 89

      我的link

      上的答案

答案 1 :(得分:2)

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

如果您将表连接到支持延迟加载的容器,则您的项目会从其数据源延迟加载。这意味着当您滚动并退出缓冲的项目时,表格会“请求”容器以获取更多项目。然后容器从其数据源加载更多项目。

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

答案 2 :(得分:0)

Hm,事件触发与表的每个操作(例如行选择等)。更合适的解决方案是在表状态中更改检查变量。

这里的例子:

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