당신이 당신의 예에서 여러 행으로 드래그 수 있도록 수정해야 할 일은 대신 데이터의 클립 보드에 데이터의 배열을 넣어하는 것입니다. 예에서 당신이 연결된 그래서, 당신이 대신 같이 할 것이다 :
그런 다음 당신은 단지
setOnDragDropped
방법으로 그 모든 인덱스를 처리해야
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();
}
});
: 물론
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, new ArrayList (getSelectionModel(). getSelectedIndices()));'그리고 나서' indexes = (리스트 ) db.getContent (...);'를리스트 할 필요가있다. –
좋은 지적 @James_D. 나는 나의 대답을 개정하고있다. 한쪽에서 –
이 직렬화되어 드래그 보드에 삽입됩니다. 문제는 드래그 보드에서 다시 가져올 때 발생합니다. ArrayList content = (ArrayList ) db.getContent (SERIALIZED_MIME_TYPE); 스레드에서 예외 "자바 FX 애플리케이션 스레드"java.lang.ClassCastException가 : 사실 인 java.util.ArrayList는 application.TableTreeViewApp.lambda $ 7시에 java.lang.Integer의 \t 캐스트 할 수없는 (TableTreeViewApp.java:254) –
Khanjee