2015-12-23 3 views
4

У меня есть таблица с несколькими строками, содержащими пользовательские компоненты. И я хочу разрешить пользователю перетаскивать строки.Как разрешить пользователю перетаскивать строку в таблице vaadin?

Я попытался следующий код, но не в состоянии перетащить любую строку:

tblStructure = new Table(); 
tblStructure.setSizeFull(); 
tblStructure.setSelectable(false); 
tblStructure.setSortEnabled(false); 
tblStructure.setDragMode(Table.TableDragMode.ROW); 
tblStructure.setNullSelectionAllowed(true); 
tblStructure.setDropHandler(new DropHandler() { 

     /** 
     * 
     */ 
     private static final long serialVersionUID = 1L; 

     @Override 
     public AcceptCriterion getAcceptCriterion() { 
      return AcceptAll.get(); 
     } 

     @Override 
     public void drop(DragAndDropEvent event) { 
     } 
    }); 
+0

Посмотрите на эти ссылки: https://vaadin.com/book/-/page/advanced.dragndrop.html и https://vaadin.com/forum/#!/thread/222554/1191786 –

ответ

-1

добавить код, который содержит логику к падению (..) метод. Ниже кода из vaadin sampler перетащить н падение примеры:

table.setDragMode(TableDragMode.ROW); 
    table.setDropHandler(new DropHandler() { 
     @Override 
     public void drop(final DragAndDropEvent dropEvent) { 
      // criteria verify that this is safe 
      final DataBoundTransferable t = (DataBoundTransferable) dropEvent 
        .getTransferable(); 
      if (!(t.getSourceContainer() instanceof Container.Hierarchical)) { 
       return; 
      } 
      final Container.Hierarchical source = (Container.Hierarchical) t 
        .getSourceContainer(); 

      final Object sourceItemId = t.getItemId(); 

      // find and convert the item(s) to move 

      final Object parentItemId = source.getParent(sourceItemId); 
      // map from moved source item Id to the corresponding Hardware 
      final LinkedHashMap<Object, Hardware> hardwareMap = new LinkedHashMap<Object, Hardware>(); 
      if (parentItemId == null) { 
       // move the whole subtree 
       final String category = getTreeNodeName(source, 
         sourceItemId); 
       final Collection<?> children = source 
         .getChildren(sourceItemId); 
       if (children != null) { 
        for (final Object childId : children) { 
         final String name = getTreeNodeName(source, childId); 
         hardwareMap.put(childId, new Hardware(name, 
           category)); 
        } 
       } 
      } else { 
       // move a single hardware item 
       final String category = getTreeNodeName(source, 
         parentItemId); 
       final String name = getTreeNodeName(source, sourceItemId); 
       hardwareMap.put(sourceItemId, new Hardware(name, category)); 
      } 

      // move item(s) to the correct location in the table 

      final AbstractSelectTargetDetails dropData = ((AbstractSelectTargetDetails) dropEvent 
        .getTargetDetails()); 
      final Object targetItemId = dropData.getItemIdOver(); 

      for (final Object sourceId : hardwareMap.keySet()) { 
       final Hardware hardware = hardwareMap.get(sourceId); 
       if (targetItemId != null) { 
        switch (dropData.getDropLocation()) { 
        case BOTTOM: 
         tableContainer.addItemAfter(targetItemId, hardware); 
         break; 
        case MIDDLE: 
        case TOP: 
         final Object prevItemId = tableContainer 
           .prevItemId(targetItemId); 
         tableContainer.addItemAfter(prevItemId, hardware); 
         break; 
        } 
       } else { 
        tableContainer.addItem(hardware); 
       } 
       source.removeItem(sourceId); 
      } 
     } 

     @Override 
     public AcceptCriterion getAcceptCriterion() { 
      return new And(acceptCriterion, AcceptItem.ALL); 
     } 
    }); 
+0

вы сказали: «Здесь лучше включить основные части ответа и предоставить ссылку для справки», но я уже добавил ответ и поместил ссылку в качестве ссылки. Я не понимал, что вы имеете в виду. Не могли бы вы объяснить больше. – Nebras

+0

@ user1234 Вы нашли это полезным? – Nebras

0

Я знаю, что в ответ на старую тему. Я узнал, что это может быть довольно хлопот в Ваадине. Я отказался использовать 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, упомянутым Небрасом в предыдущем посте.

Надеюсь, я могу помочь кому-то с этим сообщением. Приветствую! :)

Смежные вопросы