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
而不是onMouseDragOveronDragXYZ
事件用于剪贴板拖动事件。对于其他类型的拖放功能,您需要改用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