gpt4 book ai didi

java - 如何在 vaadin 7 中的两个表之间同步滚动?

转载 作者:行者123 更新时间:2023-12-01 12:55:14 26 4
gpt4 key购买 nike

我在瓦丁有两张 table 。一种是作为表mainTable。另一个是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) 这样的方法。因此我无法继续。请任何人帮助我如何做到这一点。

最佳答案

您的方向是正确的,但您似乎将 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,是客户端代码,应该放置在您的客户端包中,即您的 widgetset 的源路径。例如,如果您的 *.gwt.xml 文件位于包 com.example.foo 中,则 ScrollTableConnector 应转到包 >com.example.foo.client 或其子包之一。这样小部件集编译器就会知道在哪里寻找它。

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

关于java - 如何在 vaadin 7 中的两个表之间同步滚动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23967353/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com