2016-08-24 4 views
0

Я нашел пример перетаскивания перетаскивания для treetableview, но он работает только для одной строки. Я не смог найти помощь для перетаскивания нескольких строк в treetableview или tableview. Любая помощь будет оценена по достоинству.Как реализовать сокращение перетаскивания нескольких строк в TreeTableView/TableView?

Example of single row drag drop

ответ

1

Все, что вам нужно сделать, чтобы изменить разрешить перетаскивание нескольких строк в вашем примере, чтобы поместить массив данных в буфер обмена, а не только данные. Таким образом, в данном примере вы связаны между собой, вы могли бы сделать, как это вместо:

row.setOnDragDetected(event -> { 
    if (!row.isEmpty()) { 
     Dragboard db = row.startDragAndDrop(TransferMode.MOVE); 
     db.setDragView(row.snapshot(null, null)); 
     ClipboardContent cc = new ClipboardContent(); 

     // Here you provide the ClipboardContent instance with the selected indexes instead of just one index. 
     cc.put(SERIALIZED_MIME_TYPE, new ArrayList<Integer>(getSelectionModel().getSelectedIndices())); 
     db.setContent(cc); 
     event.consume(); 
    } 
}); 

Тогда вы просто должны обрабатывать все эти индексы в setOnDragDropped метода:

row.setOnDragDropped(event -> { 
    Dragboard db = event.getDragboard(); 
    if (acceptable(db, row)) { 
     // Get all indexes. 
     ArrayList<Integer> indexes = (ArrayList<Integer>) db.getContent(SERIALIZED_MIME_TYPE); 

     ObservableList<TreeItem> items = FXCollections.observableArrayList();  
     // Get the item on each index. 
     for (int index : indexes) { 
      items.add(tree.getTreeItem(index)); 
     } 

     // Modify the rest of the code commented out below to remove 
     // all items in your list and then add them your target. 
     // item.getParent().getChildren().remove(item); 
     // getTarget(row).getChildren().add(item); 
     // event.setDropCompleted(true); 
     // tree.getSelectionModel().select(item); 

     event.consume(); 
    }    
}); 

Конечно, вы будете иметь до разрешите несколько вариантов выбора в вашем столе. Это делается путем выполнения table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);.

+0

Просто примечание: Я считаю, что реализация 'ObservableList' не является сериализуемой, поэтому я думаю (но не проверял ее), что это приведет к сбою с исключением из среды выполнения. Вероятно, вам нужно сделать 'cc.put (SERIALIZED_MIME_TYPE, новый ArrayList (getSelectionModel(). GetSelectedIndices()) ;, а затем' List indexes = (Список ) db.getContent (...); '. –

+0

Хорошая точка @James_D. Я пересматриваю свой ответ. –

+0

с одной стороны он сериализуется и помещает его в планшет. проблема возникает, когда вы возвращаете ее обратно с экрана. ArrayList content = (ArrayList ) db.getContent (SERIALIZED_MIME_TYPE); Исключение в потоке "JavaFX Применение Нить" java.lang.ClassCastException: java.util.ArrayList не может быть приведен к java.lang.Integer \t в application.TableTreeViewApp.lambda $ 7 (TableTreeViewApp.java:254) – Khanjee