Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
onDragOver不';不会发生(在JavaFX中)_Java_Javafx_Drag And Drop - Fatal编程技术网

onDragOver不';不会发生(在JavaFX中)

onDragOver不';不会发生(在JavaFX中),java,javafx,drag-and-drop,Java,Javafx,Drag And Drop,为什么在下面的示例中没有发生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; i

为什么在下面的示例中没有发生
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);
   }
}
导入javafx.application.application;
导入javafx.event.EventHandler;
导入javafx.geometry.*;
导入javafx.scene.scene;
导入javafx.scene.input.DragEvent;
导入javafx.scene.input.MouseEvent;
导入javafx.scene.layout.Background;
导入javafx.scene.layout.BackgroundFill;
导入javafx.scene.layout.CornerRadii;
导入javafx.scene.layout.Pane;
导入javafx.scene.paint.*;
导入javafx.stage.stage;
公共类绘图扩展应用程序{
私有点2D dragVector=null;
@凌驾
public void start(Stage primaryStage)引发异常{
窗格根=新窗格();
窗格节点=新建窗格();
setBackground(新背景(新背景填充(Color.BLUE,CornerRadii.EMPTY,javafx.geometry.Insets.EMPTY));
node.setPrefWidth(100);
节点高度(50);
node.setTranslateX(200);
node.setTranslateY(200);
检测到node.setOnDragDetected(新的EventHandler(){
@凌驾
公共无效句柄(MouseeEvent事件){
System.out.println(“odDragDetected”);
double x=event.getX();
双y=event.getY();
x-=node.getTranslateX();
y-=node.getTranslateY();
dragVector=新点2D(x,y);
node.startFullDrag();
}
});
node.setOnDragOver(新的EventHandler(){
@凌驾
公共无效句柄(DrageEvent事件){
System.out.println(“onDragOver”);
double x=event.getX();
双y=event.getY();
x+=dragVector.getX();
y+=dragVector.getY();
node.setTranslateX(x);
node.setTranslateY(y);
}
});
setOnDragDone(新的EventHandler(){
@凌驾
公共无效句柄(DrageEvent事件){
dragVector=null;
}
});
root.getChildren().add(节点);
场景=新场景(根,800600);
初级阶段。场景(场景);
初级阶段。设置标题(“绘图”);
primaryStage.show();
}
公共静态void main(字符串[]args){
绘图。启动(args);
}
}

首先,您需要调用
startDragAndDrop
,而不是
startFullDrag
。中介绍了不同的拖动模式。此外,拖放API中一个恼人的部分是,除非向dragboard中添加某些内容,否则不会激活拖动:

  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);
     }
  });
检测到node.setOnDragDetected(新的EventHandler(){ @凌驾 公共无效句柄(MouseeEvent事件){ System.out.println(“odDragDetected”); double x=event.getX(); 双y=event.getY(); x-=node.getTranslateX(); y-=node.getTranslateY(); dragVector=新点2D(x,y); Dragboard db=node.startDragAndDrop(传输模式.复制或移动); ClipboardContent cc=新的ClipboardContent(); cc.putString(“某物”); db.setContent(cc); } });
首先,您需要调用
startDragAndDrop
,而不是
startFullDrag
。中介绍了不同的拖动模式。此外,拖放API中一个恼人的部分是,除非向dragboard中添加某些内容,否则不会激活拖动:

  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);
     }
  });
检测到node.setOnDragDetected(新的EventHandler(){ @凌驾 公共无效句柄(MouseeEvent事件){ System.out.println(“odDragDetected”); double x=event.getX(); 双y=event.getY(); x-=node.getTranslateX(); y-=node.getTranslateY(); dragVector=新点2D(x,y); Dragboard db=node.startDragAndDrop(传输模式.复制或移动); ClipboardContent cc=新的ClipboardContent(); cc.putString(“某物”); db.setContent(cc); } });
onDragXYZ事件用于剪贴板拖动事件。对于其他类型的拖放功能,您需要改用
onMouseDragXYZ
事件。此外,如果要修改,最好不要使用
节点
自己的坐标系中的坐标

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

        double x = event.getX();
        double y = event.getY();
        dragVector = node.localToParent(x, y).subtract(node.getTranslateX(), node.getTranslateY());
        node.startFullDrag();
    }
});

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

        Point2D parentCoords = node.localToParent(event.getX(), event.getY());

        node.setTranslateX(parentCoords.getX() -dragVector.getX());
        node.setTranslateY(parentCoords.getY() -dragVector.getY());
    }
});

node.setOnMouseReleased(new EventHandler<MouseEvent>() {
    @Override
    public void handle(MouseEvent event) {
        dragVector = null;
    }
});
检测到node.setOnDragDetected(新的EventHandler(){ @凌驾 公共无效句柄(MouseeEvent事件){ System.out.println(“odDragDetected”); double x=event.getX(); 双y=event.getY(); dragVector=node.localToParent(x,y).subtract(node.getTranslateX(),node.getTranslateY()); node.startFullDrag(); } }); setOnMouseDragOver(新的EventHandler(){ @凌驾 公共无效句柄(MouseDragEvent事件){ System.out.println(“onDragOver”); Point2D parentCoords=node.localToParent(event.getX(),event.getY()); setTranslateX(parentCoords.getX()-dragVector.getX()); setTranslateY(parentCoords.getY()-dragVector.getY()); } }); setOnMouseReleased(新的EventHandler(){ @凌驾 公共无效句柄(MouseeEvent事件){ dragVector=null; } });
但是,由于手势中只涉及单个节点,因此不需要使用拖动事件。您可以简单地使用
onmousedpressed
而不是
onDragDetected
onmousedrag
而不是
onMouseDragOver

onDragXYZ
事件用于剪贴板拖动事件。对于其他类型的拖放功能,您需要改用
onMouseDragXYZ
事件。此外,如果要修改,最好不要使用
节点
自己的坐标系中的坐标

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

        double x = event.getX();
        double y = event.getY();
        dragVector = node.localToParent(x, y).subtract(node.getTranslateX(), node.getTranslateY());
        node.startFullDrag();
    }
});

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

        Point2D parentCoords = node.localToParent(event.getX(), event.getY());

        node.setTranslateX(parentCoords.getX() -dragVector.getX());
        node.setTranslateY(parentCoords.getY() -dragVector.getY());
    }
});

node.setOnMouseReleased(new EventHandler<MouseEvent>() {
    @Override
    public void handle(MouseEvent event) {
        dragVector = null;
    }
});
检测到node.setOnDragDetected(新的EventHandler(){ @凌驾 公共无效句柄(MouseeEvent事件){ System.out.println(“odDragDetected”); double x=event.getX(); 双y=event.getY(); dragVector=node.localToParent(x,y).subtr