如何在TreeTableView / TableView中实现多行的拖放?

时间:2016-08-24 09:53:42

标签: java javafx tableview treetableview

我找到了treetableview的拖放示例,但它仅适用于一行。在treetableview或tableview中,我找不到任何拖拽多行的帮助。任何帮助将不胜感激。

Example of single row drag drop

1 个答案:

答案 0 :(得分:2)

修改允许拖动示例中的多行所需要做的就是将数据数组放入剪贴板而不仅仅是数据。所以在你链接的例子中,你会这样做:

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);完成的。