onDragOver 不会发生(在 JavaFX 中)

Dim*_*ims 0 java drag-and-drop javafx

为什么onDragOver在下面的例子中没有发生事件?

如何实现最简单的拖动行为,即没有剪贴板的东西?

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.geometry.*;
import javafx.scene.Scene;
import javafx.scene.input.DragEvent;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.CornerRadii;
import javafx.scene.layout.Pane;
import javafx.scene.paint.*;
import javafx.stage.Stage;

public class DragTry extends Application {

   private Point2D dragVector = null;

   @Override
   public void start(Stage primaryStage) throws Exception {

      Pane root = new Pane();

      Pane node = new Pane();
      node.setBackground(new Background(new BackgroundFill(Color.BLUE, CornerRadii.EMPTY, javafx.geometry.Insets.EMPTY)));
      node.setPrefWidth(100);
      node.setPrefHeight(50);
      node.setTranslateX(200);
      node.setTranslateY(200);

      node.setOnDragDetected(new EventHandler<MouseEvent>() {
         @Override
         public void handle(MouseEvent event) {
            System.out.println("odDragDetected");

            double x = event.getX();
            double y = event.getY();
            x -= node.getTranslateX();
            y -= node.getTranslateY();
            dragVector = new Point2D(x, y);
            node.startFullDrag();
         }
      });

      node.setOnDragOver(new EventHandler<DragEvent>() {
         @Override
         public void handle(DragEvent event) {
            System.out.println("onDragOver");

            double x = event.getX();
            double y = event.getY();
            x += dragVector.getX();
            y += dragVector.getY();
            node.setTranslateX(x);
            node.setTranslateY(y);
         }
      });

      node.setOnDragDone(new EventHandler<DragEvent>() {
         @Override
         public void handle(DragEvent event) {
            dragVector = null;
         }
      });

      root.getChildren().add(node);

      Scene scene = new Scene(root, 800, 600);

      primaryStage.setScene(scene);
      primaryStage.setTitle("DragTry");
      primaryStage.show();
   }


   public static void main(String[] args) {
      DragTry.launch(args);
   }
}
Run Code Online (Sandbox Code Playgroud)

Jam*_*s_D 5

首先,您需要调用startDragAndDrop, 而不是startFullDrag。的文档MouseEvent中描述了不同的拖动模式。此外,拖放 API 的一个令人讨厌的部分是,除非您向拖动板添加某些内容,否则不会激活拖动:

  node.setOnDragDetected(new EventHandler<MouseEvent>() {
     @Override
     public void handle(MouseEvent event) {
        System.out.println("odDragDetected");

        double x = event.getX();
        double y = event.getY();
        x -= node.getTranslateX();
        y -= node.getTranslateY();
        dragVector = new Point2D(x, y);

        Dragboard db = node.startDragAndDrop(TransferMode.COPY_OR_MOVE);
        ClipboardContent cc = new ClipboardContent();
        cc.putString("Something");
        db.setContent(cc);
     }
  });
Run Code Online (Sandbox Code Playgroud)