Я знаю, что в ответ на старую тему. Я узнал, что это может быть довольно хлопот в Ваадине. Я отказался использовать TreeTable или другой компонент для достижения этого результата. Я хотел бы поделиться своим решением с любым, кто ищет это, потому что я не мог найти прямой и простой ответ сам. Также я хотел бы сделать что-то в обмен на сообщество, потому что мы используем много программного обеспечения с открытым исходным кодом.
Создайте класс, например SortableTable, который расширяет обычную таблицу Vaadin.
public class SortableTable extends Table {
private static final long serialVersionUID = 1L;
public SortableTable() {
setDragMode(TableDragMode.ROW);
setSelectable(true);
setDropHandler(new DropHandler() {
private static final long serialVersionUID = 1L;
@Override
public AcceptCriterion getAcceptCriterion() {
return AcceptAll.get();
}
@Override
public void drop(DragAndDropEvent event) {
Transferable t = event.getTransferable();
Object sourceItemId = t.getData("itemId");
AbstractSelectTargetDetails dropData = (AbstractSelectTargetDetails)event.getTargetDetails();
Object targetItemId = dropData.getItemIdOver();
switch(dropData.getDropLocation()) {
case BOTTOM:
moveAfter(targetItemId, sourceItemId);
break;
case MIDDLE:
case TOP:
final Object prevItemId = prevItemId(targetItemId);
moveAfter(prevItemId, sourceItemId);
break;
}
}
});
}
...
Далее, создайте эту настраиваемую функцию для перемещения элемента таблицы.
@SuppressWarnings("unchecked")
/**
*
* @param targetItemId
* @param sourceItemId
* @return ItemId of the object the item moved to
*/
public Object moveAfter(Object targetItemId, Object sourceItemId) {
if(sourceItemId == null)
return null;
Item sourceItem = getItem(sourceItemId);
Object[] propertyIds = getContainerPropertyIds().toArray();
int size = propertyIds.length;
Object[][] properties = new Object[size][2];
// backup source item properties and values
for(int i = 0; i < size; i++) {
Object propertyId = propertyIds[i];
Object value = sourceItem.getItemProperty(propertyId).getValue();
properties[i][0] = propertyId;
properties[i][1] = value;
}
removeItem(sourceItemId);
Item item = addItemAfter(targetItemId, sourceItemId);
// restore source item properties and values
for(int i = 0; i < size; i++) {
Object propertyId = properties[i][0];
Object value = properties[i][1];
item.getItemProperty(propertyId).setValue(value);
}
return sourceItemId;
}
}
Давайте попробуем объяснить это. По какой-то очевидной причине элемент таблицы полностью удаляется и удаляется из таблицы при вызове метода removeItem. Невозможно вернуть один и тот же объект в таблицу, за исключением копирования его свойств и значений в новую строку. Это именно то, что пользовательский moveAfter делает. Другая часть кода вдохновлена примером «Tree to Table drag-n-drop» из Vaadin Sampler, упомянутым Небрасом в предыдущем посте.
Надеюсь, я могу помочь кому-то с этим сообщением. Приветствую! :)
Посмотрите на эти ссылки: https://vaadin.com/book/-/page/advanced.dragndrop.html и https://vaadin.com/forum/#!/thread/222554/1191786 –