【问题标题】:How to make synchronize scroll between two table in vaadin 7?如何在vaadin 7中的两个表之间进行同步滚动?
【发布时间】:2014-05-31 06:59:40
【问题描述】:

我在 vaadin 有两张桌子。一种是作为表主表。 另一个是ScrollTable freezeTable。 我需要两个表之间的同步滚动。如果我将垂直滚动 mainTable,则 freezeTable 应该滚动相同但在水平滚动的情况下我不想要任何同步滚动。 我从 vaadin 论坛得到了一些想法,如下所示。但由于某些已弃用的方法,我无法继续。

MyViewPage.java 我将这两个表添加为

addComponent(loadTables());
public HorizontalSplitPanel loadTables(){
    final HorizontalSplitPanel splitPanel = new HorizontalSplitPanel();
    Table mainTable = new Table();
    ScrollTable freezeTable=new ScrollTable();
    freezeTable.setDependentTable( mainTable );
    freezeTable.setWidth( "300px" );
    mainTable.setWidth( "800px" );
    freezeTable.setContainerDataSource(myContainer);
    freezeTable.setVisibleColumns(viscol);
    freezeTable.setColumnHeaders(vishead);
    freezeTable.setPageLength(15);
    mainTable.setContainerDataSource(myAnotherContainer);
    mainTable.setVisibleColumns(viscolmain);
    mainTable.setColumnHeaders(visheadmain);
    mainTable.setPageLength(15);
    splitPanel.setFirstComponent(freezeTable);
    splitPanel.setSecondComponent(mainTable);
    return splitPanel;
}

ScrollTable 类是这样的。

ScrollTable.java

package com.abhiram.app.myproject.freezetable;

import com.vaadin.data.Container;
import com.vaadin.server.PaintException;
import com.vaadin.server.PaintTarget;
import com.vaadin.shared.ui.Connect;

import com.vaadin.ui.Table;

@SuppressWarnings("serial")
public class ScrollTable extends Table{
private Table mainTable;

public ScrollTable()
 {
   super();
 }
public void setDependentTable( Table mainTable)
 {
   this.mainTable= mainTable;
 }

@Override
public void paintContent( PaintTarget target ) throws PaintException
  {

    target.addAttribute( "scrollPane", this );
    if ( table != null ) target.addAttribute( "dependentTable", mainTable);
    super.paintContent( target );
  }
}

我创建了另一个类 VMyScrollTable 并像这样扩展 VScrollTable。

VMyScrollTable.java

package com.abhiram.app.myproject.freezetable.client.ui;

import com.google.gwt.event.dom.client.ScrollEvent;
import com.google.gwt.event.dom.client.ScrollHandler;
import com.abhiram.app.myproject.freezetable.ScrollTable;
import com.vaadin.client.ApplicationConnection;
import com.vaadin.client.UIDL;
import com.vaadin.client.ui.FocusableScrollPanel;
import com.vaadin.client.ui.VScrollTable;
import com.vaadin.shared.ui.Connect;
@Connect(com.abhiram.app.myproject.freezetable.ScrollTable.class)
public class VMyScrollTable extends VScrollTable{
public VMyScrollTable()
 {
   super();
 }

@Override
public void updateFromUIDL( final UIDL uidl, final ApplicationConnection client )
 {
  super.updateFromUIDL(uidl,client );
  final String tableId = uidl.getStringAttribute( "dependentTable" );
  if ( tableId == null )
     return;
  String id = uidl.getStringAttribute( "scrollPane" );

  VScrollTable scrollPane = (VScrollTable) client.getPaintable(id);
  final FocusableScrollPanel scrollBody = (FocusableScrollPanel) scrollPane.getWidget(1);
  scrollBody.addScrollHandler( new ScrollHandler()
   {
     @Override
     public void onScroll( ScrollEvent event )
      {
        VMyScrollTable.this.onScroll( event );
        VScrollTable dependentPane = (VScrollTable)  client.getPaintable(tableId );
        FocusableScrollPanel scrollToBeBody = (FocusableScrollPanel) dependentPane.getWidget( 1 );
        scrollToBeBody.setScrollPosition( scrollBody.getScrollPosition() );
      }
     } );
   }
}

这里的问题是 VScrollTable 类没有像 updateFromUIDL(...) 这样的方法,而 ApplicationConnection 没有像 getPaintable(String) 这样的方法。 因此,我无法继续。请任何人帮助我如何做到这一点。

【问题讨论】:

    标签: java maven vaadin vaadin7 vaadin-touchkit


    【解决方案1】:

    您在正确的轨道上,但您似乎将WidgetComponentConnector 混淆了。这是根据您的代码修改的工作版本:

    ScrollTable.java - 和你的一样

    public class ScrollTable extends Table {
        private Table mainTable;
    
        public void setDependentTable(Table mainTable) {
            this.mainTable = mainTable;
        }
    
        @Override
        public void paintContent(PaintTarget target) throws PaintException {
    
            target.addAttribute("scrollPane", this);
            if (mainTable != null) {
                target.addAttribute("dependentTable", mainTable);
            }
            super.paintContent(target);
        }
    }
    

    ScrollTableConnector.java - 这是位于Widget 和服务器之间的客户端上的连接器类

    @Connect(ScrollTable.class)
    public class ScrollTableConnector extends TableConnector implements
            ScrollHandler {
    
        private VScrollTable dependentPane = null;
    
        @Override
        public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
            super.updateFromUIDL(uidl, client);
            String tableId = uidl.getStringAttribute("dependentTable");
            if (tableId == null) {
                return;
            }
            if (dependentPane == null) {
                FocusableScrollPanel scrollBody = (FocusableScrollPanel) getWidget()
                        .getWidget(1);
                scrollBody.addScrollHandler(this);
            }
            dependentPane = ((TableConnector) client.getConnector(tableId, 0))
                    .getWidget();
        }
    
        @Override
        public void onScroll(ScrollEvent event) {
            FocusableScrollPanel scrollBody = (FocusableScrollPanel) getWidget()
                    .getWidget(1);
            FocusableScrollPanel scrollToBeBody = (FocusableScrollPanel) dependentPane
                    .getWidget(1);
            scrollToBeBody.setScrollPosition(scrollBody.getScrollPosition());
        }
    }
    

    ...就是这样。无需修改Widget;相反,我们直接重用 VScrollTable。由于服务器端没有任何变化,因此您的原始测试 UI 应该可以正常工作。

    现在,ScrollTableConnector,作为ComponentConnector,是客户端代码,应该放在您的客户端包中,即您的小部件集的源路径。例如,如果您的*.gwt.xml 文件位于包com.example.foo 中,则ScrollTableConnector 应转到包com.example.foo.client 或其子包之一。这样,widgetset 编译器就会知道在哪里寻找它。

    最后,记得重新编译您的小部件集。如果您使用的是 Vaadin Eclipse 插件,只需单击 Compile Widgetset 按钮。如果您使用的是 Maven,请运行 mvn vaadin:compile

    【讨论】:

    • 您好 Jupenur,感谢您的回复。但它不起作用。我在这三个被覆盖的方法中给出了 sysout。页面加载时第一次执行 PaintContent 方法,不执行 updateFromUIDL() 和 onScroll() 方法。
    • 它是否仍然在客户端呈现两个表?您还记得重新编译小部件集吗?您的 ScrollTableConnector 在小部件集的源路径中吗?
    • 我没有创建任何小部件集。我正在使用这个项目。在 netbeans 中,我只构建我的项目并部署在 liferay jboss 服务器中。请检查以下链接。 https://www.dropbox.com/s/4qqjp81vgrjlaoh/myproject.zip@jupenur
    • 您应该将ScrollTableConnector 移动到com.abhiram.app.client 包,然后重新编译小部件集。我已经用如何做到这一点的信息更新了我的答案。
    • 我将ScrollTableConnector 移至com.abhiram.app.client 包。我使用vaadin:update-widgetset 更新了小部件集。它构建成功。但是当我使用vaadin:compile 编译时,它显示错误为`[ERROR] Errors in 'file:/E:/New%20folder/myproject-parent/myproject/target/classes/com/abhiram/app/client/ ScrollTableConnector.java` [ERROR] 第 19 行:com.abhiram.app.ScrollTable 无法解析为类型 [ERROR] 第 19 行:Class 无法解析为类型 [ERROR] 由于某些输入错误而中止编译文件`@jupenur
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多