Как сделать синхронизацию прокрутки между двумя таблицами в vaadin 7?

У меня два стола в ваадине. Один из них как таблица 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). Я не могу продолжить из-за этого. Пожалуйста, любое тело, помогите мне, как это сделать.

1 ответ

Решение

Вы на правильном пути, но вы, кажется, путаете Widget с ComponentConnector, Вот рабочая версия, модифицированная из вашего кода:

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

...и это все. Нет необходимости изменять виджет; вместо этого мы напрямую используем VScrollTable. И ваш оригинальный тестовый интерфейс должен работать как есть, так как на стороне сервера ничего не изменилось.

Сейчас, ScrollTableConnector, быть ComponentConnector, является клиентским кодом и должен быть помещен в ваш клиентский пакет, то есть в исходный путь вашего виджета. Например, если ваш *.gwt.xml файл находится в упаковке com.example.foo, ScrollTableConnector следует перейти к пакету com.example.foo.client или один из его подпакетов. Таким образом, компилятор widgetset будет знать, где его искать.

И, наконец, не забудьте перекомпилировать ваш виджет. Если вы используете плагин Vaadin Eclipse, просто нажмите кнопку Compile Widgetset. Если вы используете Maven, запустите mvn vaadin:compile,

Другие вопросы по тегам