从ListView拖放到TreeView

我只想将项目从ListView拖放到TreeView的特定位置。 我知道如何处理DragEvent 。 但是如何才能获得treeView的删除位置? 使用“position”我的意思是“在哪个treeview-item上删除(从这个treeview-item获取引用)”。

 package main; import javafx.application.Application; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.event.Event; import javafx.event.EventHandler; import javafx.event.EventType; import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.control.*; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.input.DragEvent; import javafx.scene.input.MouseDragEvent; import javafx.scene.input.MouseEvent; import javafx.scene.layout.HBox; import javafx.stage.Stage; import javafx.util.Callback; public class Program extends Application { String buffer = ""; public static void main(String args[]) { launch(args); } @Override public void start(Stage primaryStage) throws Exception { primaryStage.setTitle("Tree View Sample"); HBox box = new HBox(); //ListView ListView list = new ListView(); ObservableList items = FXCollections.observableArrayList( "Single", "Double", "Suite", "Family App"); list.setItems(items); list.setOnDragDetected(new EventHandler() { @Override public void handle(MouseEvent event) { System.out.println("Drag something from ListView"); } }); //TreeView TreeItem rootItem = new TreeItem("Inbox"); rootItem.setExpanded(true); for (int i = 1; i < 6; i++) { TreeItem item = new TreeItem("Message" + i); rootItem.getChildren().add(item); } TreeView treeView = new TreeView(rootItem); treeView.setEditable(true); treeView.setCellFactory(new Callback<TreeView, TreeCell>() { @Override public TreeCell call(TreeView stringTreeView) { TreeCell treeCell = new TreeCell() { protected void updateItem(String item, boolean empty) { super.updateItem(item, empty); if (item != null) { setText(item); } } }; treeCell.setOnDragDetected(new EventHandler() { @Override public void handle(MouseEvent mouseEvent) { System.out.println("Drag: " + treeCell.getItem()); } }); treeCell.setOnDragDropped(new EventHandler() { public void handle(DragEvent event) { //THIS METHOD DOESN'T WORK (It doesn't called, when i drag something from listview to treeview) System.out.println("Dropped something"); event.setDropCompleted(true); event.consume(); } }); return treeCell; } }); box.getChildren().addAll(list,treeView); //Create Scene Scene scene = new Scene(box); //Add Scene to Stage.. primaryStage.setScene(scene); primaryStage.show(); } } 

除了setOnDragDetected处理程序之外什么都不起作用。 为什么?
我正在尝试的例子:
想要通过拖放消息2来更改“双”。
或者我想用“单一”更改消息1。
上面的代码只是对更大项目的测试。

你需要

  • DRAG_DETECTED源事件上的startDragAndDrop()
  • DRAG_OVER目标事件的acceptTransferModes()
  • DRAG_DROPPED目标事件上的event.getDragboard().getString()

看到这个完整的例子:

 @Override public void start( Stage primaryStage ) throws Exception { HBox box = new HBox(); // ListView ListView list = new ListView( FXCollections.observableArrayList( "Single", "Double", "Suite", "Family App" ) ); list.setCellFactory( new Callback, ListCell>() { @Override public ListCell call( ListView param ) { ListCell listCell = new ListCell() { @Override protected void updateItem( String item, boolean empty ) { super.updateItem( item, empty ); setText( item ); } }; listCell.setOnDragDetected( ( MouseEvent event ) -> { System.out.println( "listcell setOnDragDetected" ); Dragboard db = listCell.startDragAndDrop( TransferMode.COPY ); ClipboardContent content = new ClipboardContent(); content.putString( listCell.getItem() ); db.setContent( content ); event.consume(); } ); return listCell; } } ); //TreeView TreeItem rootItem = new TreeItem<>( "Inbox" ); rootItem.setExpanded( true ); for ( int i = 1; i < 6; i++ ) { TreeItem item = new TreeItem<>( "Message " + i ); rootItem.getChildren().add( item ); } TreeView treeView = new TreeView<>( rootItem ); treeView.setEditable( true ); treeView.setCellFactory( new Callback, TreeCell>() { @Override public TreeCell call( TreeView stringTreeView ) { TreeCell treeCell = new TreeCell() { @Override protected void updateItem( String item, boolean empty ) { super.updateItem( item, empty ); if ( item != null ) { setText( item ); } } }; treeCell.setOnDragEntered( ( DragEvent event ) -> { treeCell.setStyle( "-fx-background-color: aqua;" ); } ); treeCell.setOnDragExited( ( DragEvent event ) -> { treeCell.setStyle( "" ); } ); treeCell.setOnDragOver( ( DragEvent event ) -> { Dragboard db = event.getDragboard(); if ( db.hasString() ) { event.acceptTransferModes( TransferMode.COPY_OR_MOVE ); } event.consume(); } ); treeCell.setOnDragDropped( ( DragEvent event ) -> { System.out.println( "treeCell.setOnDragDropped" ); Dragboard db = event.getDragboard(); boolean success = false; if ( db.hasString() ) { System.out.println( "Dropped: " + db.getString() ); treeCell.getTreeItem().getChildren().add( new TreeItem<>( db.getString() ) ); treeCell.getTreeItem().setExpanded( true ); success = true; } event.setDropCompleted( success ); event.consume(); } ); return treeCell; } } ); box.getChildren().addAll( list, treeView ); primaryStage.setScene( new Scene( box ) ); primaryStage.show(); }