Как поменять строки в FlexTable (GWT)?
У меня есть FlexTable со многими строками
ID - Слово - Вниз - Вверх 1 - машина - вниз - 2 - кот - вниз - вверх... больше строк
FlexTable tb=new FlexTable();
tb.setText(0,0,"ID");
tb.setText(0,1,"Word");
tb.setText(0,2,"Down");
tb.setText(0,3,"Up");
tb.setText(1,0,"1");
tb.setText(1,1,"car");
tb.setText(2,0,"2");
tb.setText(2,1,"cat");
tb.setWidget(1,2,downButton);
tb.setWidget(2,3,upButton);
......
Теперь у меня есть кнопка MoveUp и кнопка MoveDown. Я хочу, чтобы, когда пользователь нажимает кнопку "Вверх" (при идентификаторе строки =2), FlexTable станет
ID - Слово - Вниз - Вверх 2 - кот - вниз - вверх 1 - машина - вниз... больше строк...
и затем, когда пользователь нажимает кнопку "Вниз" (при идентификаторе строки =2), FlexTable станет
ID - Слово - Вниз - Вверх 1 - машина - вниз - 2 - кот - вниз - вверх... больше строк
1 ответ
Для реализации этого типа лучше, если вы можете использовать Grid вместо FlexTable. Но так как вы хотите сделать это с помощью гибкого стола
Вот как я бы это сделал (это будет очень длинный ответ:-)). Сначала вам нужно создать объект, который содержит значения строк. Тогда было бы легко справиться с операцией. Поэтому сначала создайте объект со всеми атрибутами, которые вам нужно поместить для строки.
public class RowWidget
{
private String name;
private String id;
public RowWidget( String name, String id )
{
this.name = name;
this.id = id;
}
public String getName()
{
return name;
}
public void setName( String name )
{
this.name = name;
}
public String getId()
{
return id;
}
public void setId( String id )
{
this.id = id;
}
}
Затем вы можете создать список данных, который вы хотите добавить в таблицу
List<RowWidget> widgets = new ArrayList<RowWidget>();
RowWidget r1 = new RowWidget( "car", "1" );
widgets.add( r1 );
RowWidget r2 = new RowWidget( "cat", "2" );
widgets.add( r2 );
RowWidget r3 = new RowWidget( "dog", "3" );
widgets.add( r3 );
RowWidget r4 = new RowWidget( "mouse", "4" );
widgets.add( r4 );
Затем напишите метод для рисования содержимого в гибкой таблице.
private FlexTable drawTable( final List<RowWidget> widgets )
{
FlexTable tb = new FlexTable();
tb.setText( 0, 0, "ID" );
tb.setText( 0, 1, "Word" );
tb.setText( 0, 2, "Down" );
tb.setText( 0, 3, "Up" );
for ( int i = 1; i <= widgets.size(); i++ )
{
int j = i-1;
final RowWidget row = widgets.get( j );
tb.setText( i, 0, row.getId() );
tb.setText( i, 1, row.getName() );
if ( i != 1 )
{
Anchor upLink = new Anchor( "UP" );
upLink.addClickHandler( new ClickHandler()
{
@Override
public void onClick( ClickEvent event )
{
changePosition( false, row, widgets );
}
} );
tb.setWidget( i, 2, upLink );
}
Anchor down = new Anchor( "Down" );
down.addClickHandler( new ClickHandler()
{
@Override
public void onClick( ClickEvent event )
{
changePosition( true, row, widgets );
}
} );
tb.setWidget( i, 3, down );
}
return tb;
}
Для этого примера я рендерил этот FlexTable в FlowPanel.
FlowPanel container = new FlowPanel();
container.add( drawTable( widgets ) );
Этот метод выполняет изменение положения элементов строки.
private void changePosition( boolean isDown, RowWidget row, List<RowWidget> widgets )
{
int index = widgets.indexOf( row );
widgets.remove( index );
if ( isDown )
{
widgets.add( index + 1, row );
}
else
{
widgets.add( index - 1, row );
}
container.clear();
container.add( drawTable( widgets ) );
}