在Vaadin中,当您向下或向上滚动表格( com.vaadin.ui.Table )时,没有任何事件会被触发告诉您用户现在正在滚动。
让我们首先看一下这个Vaadin的例子(Dashboard Demo),在你打开链接后点击登录,你将被自动重定向到交易页面,这个页面显示了一个金融交易表,这些事务会在您滚动时显示一个又一个批次,实际发生的是数据是在UI启动时加载的(所有事务)。
现在,让我们假设我们有数千或数百万的交易。在UI启动时将它们全部加载到一起是否合乎逻辑?在等待加载所有事务时,一点一点地加载它们以防止降低UI是不明智的。
这个问题的最佳解决方案是获得第一个(比如100个事务),然后在向下滚动时获得更多事务,但此解决方案只有一个问题,即Vaadin不支持 com.vaadin.ui.Table !!中的滚动事件处理
答案 0 :(得分:2)
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的表相同,但它有以下不同之处:
changeVariables()
,然后我们调用了fireSrollEvent()
方法。changeVariables()
方法调用,并将在此表添加的每个已注册侦听器上调用方法doTableScroll()
通过调用方法addScrollListener().
现在要使用我们添加的新内容,我们将更改上述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 49和53以使用新的继承类(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();
}
}
}