Vaadin 如何使UI接收滚动事件

Vaadin 如何使UI接收滚动事件,vaadin,vaadin8,Vaadin,Vaadin8,在我的vaadin应用程序中,我需要实现一个固定的标题,它根据UI的滚动位置改变大小 虽然Vaadin 8中有滚动位置的geter,但似乎没有实现监听滚动事件的功能。因此,我尝试实现一个JavaScript连接器,它只通知服务器端UI用户已滚动,因此服务器端UI可以作为滚动侦听器通知标头 到目前为止,这是我的计划,但我只是不知道,如何实现我的连接器的方式,它 在客户端请求站点后处于活动状态 能够调用我的服务器端UI.onScrolleEvent()方法 有人知道如何实现所描述的行为吗 提前感谢您

在我的vaadin应用程序中,我需要实现一个固定的标题,它根据UI的滚动位置改变大小

虽然Vaadin 8中有滚动位置的geter,但似乎没有实现监听滚动事件的功能。因此,我尝试实现一个JavaScript连接器,它只通知服务器端UI用户已滚动,因此服务器端UI可以作为滚动侦听器通知标头

到目前为止,这是我的计划,但我只是不知道,如何实现我的连接器的方式,它

  • 在客户端请求站点后处于活动状态
  • 能够调用我的服务器端UI.onScrolleEvent()方法
  • 有人知道如何实现所描述的行为吗


    提前感谢您的帮助。

    几年前,我通过扩展布局组件完成了这项工作,该组件包装了我需要的UI部分。在GWT中有gwtproject.org/javadoc/latest/com/google/GWT/event/dom/client/…可以在dom处理程序中使用。是的,GWT提供了合适的客户端事件。然后,我使用RPC调用服务器端,在那里我触发了相应的服务器端事件,我可以在应用程序的其他部分中侦听该事件。代码不是公开的,但是有一个LazyLayout插件具有类似的实现类型,您可以将其作为实现的参考


    在实现自定义小部件时遇到一些问题后,我选择了另一种方法,使用vaadin意义上的扩展。下面是我所做的工作的截断代码

    (Vaadin要求本文后面显示的客户端连接器代码位于一个小部件包中。我不完全确定服务器端组件是否也必须位于一个小部件包中,但出于与通常的小部件框架一致的原因,我将其放入了一个小部件包中)

    因此,在小部件的包中:

    与往常一样,包文件夹中的.gwt.xml文件没有什么特别之处:

    最后是扩展的连接器:

    现在别忘了编译Widgetset,一切都很好,可以像其他所有vaadin扩展一样用于实际的UI:

    public class MyUI extends com.vaadin.ui.UI {
    
      @Override
      protected void init(VaadinRequest vaadinRequest) {
        ScrollUI scrollUI = new ScrollUI();
        scrollUI.extend(this);
    
        //everything else that needs to be done
        ...
      }
    
      //everything else that Needs to be done
      ...
    
    }
    

    我希望这对任何有类似问题的人都有帮助。

    非常感谢!提供的链接确实非常有助于理解RPC如何与vaadin一起工作。我将尝试用新的知识来完成实现,并在一切正常后尽快更新我所做的事情。以防万一,有类似问题的人在以后某个时候无意中发现了这篇文章。
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.5.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.5.1/distro-source/core/src/gwt-module.dtd">
    <module>
      <inherits name="com.vaadin.DefaultWidgetSet" />
    </module>
    
    package my.company.project.scrollUI.client.scrollUI;
    
    import com.vaadin.shared.communication.ServerRpc;
    
    public Interface ScrollUIServerRpc extends ServerRpc {
    
      public void onScroll();
    
    }
    
    package my.company.project.scrollUI.client.scrollUI;
    
    import com.google.gwt.event.dom.client.ScrollEvent;
    import com.google.gwt.event.dom.client.ScrollHandler;
    import com.google.gwt.user.client.ui.Widget;
    import com.vaadin.client.ComponentConnector;
    import com.vaadin.client.ServerConnector;
    import com.vaadin.client.communication.RpcProxy;
    import com.vaadin.client.extensions.AbstractExtensionConnector;
    import com.vaadin.shared.ui.Connect;
    
    @Connect(ScrollUI.class)
    public class ScrollUIConnector extends AbstractExtensionConnector {
    
      ScrollUIServerRpc rpc = RpcProxy.create(ScrollUIServerRpc.class, this);
    
      @Override
      protected void extend(ServerConnector target) {
        final Widget ui = ((ComponentConnector) target).getWidget();
    
        ui.addDomHandler(new ScrollHandler() {
    
          @Override
          public void onScroll(ScrollEvent event) {
            rpc.onScroll();
          }
    
        }, ScrollEvent.getType());
    
      }
    
    }
    
    public class MyUI extends com.vaadin.ui.UI {
    
      @Override
      protected void init(VaadinRequest vaadinRequest) {
        ScrollUI scrollUI = new ScrollUI();
        scrollUI.extend(this);
    
        //everything else that needs to be done
        ...
      }
    
      //everything else that Needs to be done
      ...
    
    }