Все, что вам нужно сделать, чтобы изменить разрешить перетаскивание нескольких строк в вашем примере, чтобы поместить массив данных в буфер обмена, а не только данные. Таким образом, в данном примере вы связаны между собой, вы могли бы сделать, как это вместо:
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);
.
Просто примечание: Я считаю, что реализация 'ObservableList' не является сериализуемой, поэтому я думаю (но не проверял ее), что это приведет к сбою с исключением из среды выполнения. Вероятно, вам нужно сделать 'cc.put (SERIALIZED_MIME_TYPE, новый ArrayList (getSelectionModel(). GetSelectedIndices()) ;, а затем' List indexes = (Список ) db.getContent (...); '. –
Хорошая точка @James_D. Я пересматриваю свой ответ. –
с одной стороны он сериализуется и помещает его в планшет. проблема возникает, когда вы возвращаете ее обратно с экрана. 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