Java 从ListView拖放到TreeView
我只想将一个项目从我的ListView拖放到我的TreeView中的特定位置。我知道怎么处理通风孔。但是我怎样才能得到树视图的下降位置呢?我的意思是在哪个树视图项目上丢弃的位置从这个树视图项目获取引用Java 从ListView拖放到TreeView,java,javafx,drag-and-drop,javafx-8,Java,Javafx,Drag And Drop,Javafx 8,我只想将一个项目从我的ListView拖放到我的TreeView中的特定位置。我知道怎么处理通风孔。但是我怎样才能得到树视图的下降位置呢?我的意思是在哪个树视图项目上丢弃的位置从这个树视图项目获取引用 package main; import javafx.application.Application; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javaf
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<String> list = new ListView<String>();
ObservableList<String> items = FXCollections.observableArrayList(
"Single", "Double", "Suite", "Family App");
list.setItems(items);
list.setOnDragDetected(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
System.out.println("Drag something from ListView");
}
});
//TreeView
TreeItem<String> rootItem = new TreeItem<String>("Inbox");
rootItem.setExpanded(true);
for (int i = 1; i < 6; i++) {
TreeItem<String> item = new TreeItem<String>("Message" + i);
rootItem.getChildren().add(item);
}
TreeView<String> treeView = new TreeView<String>(rootItem);
treeView.setEditable(true);
treeView.setCellFactory(new Callback<TreeView<String>, TreeCell<String>>() {
@Override
public TreeCell<String> call(TreeView<String> stringTreeView) {
TreeCell<String> treeCell = new TreeCell<String>() {
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (item != null) {
setText(item);
}
}
};
treeCell.setOnDragDetected(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent mouseEvent) {
System.out.println("Drag: " + treeCell.getItem());
}
});
treeCell.setOnDragDropped(new EventHandler<DragEvent>() {
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进行更改,请使用Double。
或者我想用单条更改消息1。
上面的代码只是一个更大项目的测试。您需要
startDragAndDrop on DRAG_检测到源事件
在目标事件上拖动时的acceptTransferModes
拖放目标事件上的event.getDragboard.getString
请参见以下完整示例:
@Override
public void start( Stage primaryStage ) throws Exception
{
HBox box = new HBox();
// ListView
ListView<String> list = new ListView<String>( FXCollections.observableArrayList( "Single", "Double", "Suite", "Family App" ) );
list.setCellFactory( new Callback<ListView<String>, ListCell<String>>()
{
@Override
public ListCell<String> call( ListView<String> param )
{
ListCell<String> listCell = new ListCell<String>()
{
@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<String> rootItem = new TreeItem<>( "Inbox" );
rootItem.setExpanded( true );
for ( int i = 1; i < 6; i++ )
{
TreeItem<String> item = new TreeItem<>( "Message " + i );
rootItem.getChildren().add( item );
}
TreeView<String> treeView = new TreeView<>( rootItem );
treeView.setEditable( true );
treeView.setCellFactory( new Callback<TreeView<String>, TreeCell<String>>()
{
@Override
public TreeCell<String> call( TreeView<String> stringTreeView )
{
TreeCell<String> treeCell = new TreeCell<String>()
{
@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();
}
你需要
startDragAndDrop on DRAG_检测到源事件
在目标事件上拖动时的acceptTransferModes
拖放目标事件上的event.getDragboard.getString
请参见以下完整示例:
@Override
public void start( Stage primaryStage ) throws Exception
{
HBox box = new HBox();
// ListView
ListView<String> list = new ListView<String>( FXCollections.observableArrayList( "Single", "Double", "Suite", "Family App" ) );
list.setCellFactory( new Callback<ListView<String>, ListCell<String>>()
{
@Override
public ListCell<String> call( ListView<String> param )
{
ListCell<String> listCell = new ListCell<String>()
{
@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<String> rootItem = new TreeItem<>( "Inbox" );
rootItem.setExpanded( true );
for ( int i = 1; i < 6; i++ )
{
TreeItem<String> item = new TreeItem<>( "Message " + i );
rootItem.getChildren().add( item );
}
TreeView<String> treeView = new TreeView<>( rootItem );
treeView.setEditable( true );
treeView.setCellFactory( new Callback<TreeView<String>, TreeCell<String>>()
{
@Override
public TreeCell<String> call( TreeView<String> stringTreeView )
{
TreeCell<String> treeCell = new TreeCell<String>()
{
@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();
}
到目前为止,您尝试了什么?为什么要导入java.awt.*如果您使用javafx?只是点击错误。。我把它拿走了。[问题未解决]好的,也许看看这篇文章。好的。。解决方案并不遥远。最后一个问题是treeCell.setOnDragDroppednew EventHandler。。上面的代码更新了,但它不起作用。到目前为止,您尝试了什么?为什么要导入java.awt.*如果您使用javafx?只是点击错误。。我把它拿走了。[问题未解决]好的,也许看看这篇文章。好的。。解决方案并不遥远。最后一个问题是treeCell.setOnDragDroppednew EventHandler。。上面的代码更新后它就不起作用了