如何在TreeTableView/TableView中实现多行拖放?
How to implement drag drop of multiple rows in TreeTableView/TableView?
我找到了 treetableview 的拖放示例,但它只适用于一行。我找不到任何有关在 treetableview 或 tableview 中拖放多行的帮助。任何帮助将不胜感激。
要修改示例中允许拖动多行,您需要做的就是将一组数据放入剪贴板,而不仅仅是数据。所以在你链接的例子中,你会这样做:
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 中 启用多项选择 。这是通过 table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
.
完成的
我找到了 treetableview 的拖放示例,但它只适用于一行。我找不到任何有关在 treetableview 或 tableview 中拖放多行的帮助。任何帮助将不胜感激。
要修改示例中允许拖动多行,您需要做的就是将一组数据放入剪贴板,而不仅仅是数据。所以在你链接的例子中,你会这样做:
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 中 启用多项选择 。这是通过 table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
.