javafxdrag-and-dropdroptarget

Get instance of drop target object


I need to have the instance of the object on which the user dragged something. I'm looking at event.getTarget(), but I'm still not able to get the actual object. Here is what I have now:

scrollPane.setOnDragOver(new EventHandler<DragEvent>() {

    private Node hoveredNode;

    @Override
    public void handle(DragEvent event) {
        double windowHeight = scrollPane.getHeight();
        if(!event.getTarget().getClass().getName().contains("FlowPane"))
            logger.severe(event.getTarget().getClass().getName() + "");
        double topBar = (20*windowHeight)/100;
        double bottomBar = windowHeight - topBar;
        event.acceptTransferModes(TransferMode.LINK);
        if(event.getY() > 0 && event.getY() < topBar && scrollPane.getVvalue() > 0) {
        scrollPane.setVvalue(scrollPane.getVvalue()-0.001);
        }
        else if(event.getY() < windowHeight && event.getY() > bottomBar && scrollPane.getVvalue() < 1){
            scrollPane.setVvalue(scrollPane.getVvalue()+0.001);
        }
    }
});

Now I'm just logging the target class name if it's not a FlowPane. I need to have the instance of the actual object, because I want to apply the hover effect on it.

Can you suggest me something to work on?


Solution

  • You want to use event.getTarget() or event.getSource(), as you already do, but you have to cast the object you retrieve to a specific class. Then you can modify it.

    For a reference, take a look at the following SSCCE.

    public class JavaFXTest extends Application {
    
        @Override
        public void start(Stage primaryStage) {
            StackPane root = new StackPane();     
    
            Text text = new Text("Test");
            text.setOnDragDetected((Event event) -> {
                ((Text)event.getSource()).setStyle("-fx-stroke: red;");
                event.consume();
            });
            root.getChildren().add(text);
    
            Scene scene = new Scene(root, 600, 250);
            primaryStage.setScene(scene);
            primaryStage.show();
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    Nothing fancy, once you start trying to drag the text it will turn red.