java - 如何使用 JavaFX 检测 Canvas 上的鼠标拖动事件

标签 java javafx

这个JavaFX应用程序在窗口中间包含一个Canvas对象(黑色bkg),我正在尝试检测该 Canvas 上的鼠标输入。我在控制台操作中添加了一个简单的打印来响应每个鼠标事件,只是为了测试。以下作品:

cnv.setOnMouseClicked();

但以下方法不起作用:

cnv.setOnMouseDragOver();
cnv.setOnMouseDragEntered();
cnv.setOnMouseDragReleased();
cnv.setOnMouseDragExited();

无论我如何单击并拖动鼠标,都只会检测到鼠标单击(“mouseClicked”出现在控制台上)。

package javafxtest1;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.input.MouseDragEvent;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;

public class JavaFXTest1 extends Application {

    @Override
    public void start(Stage primaryStage) {

        StackPane root = new StackPane();
        Scene scene = new Scene(root, 800, 640);
        Canvas cnv = new Canvas(scene.getWidth()-200,scene.getHeight()-200);
        root.getChildren().add(cnv);

        //Fill the canvas with a black bkg so we can know where it is
        GraphicsContext gc = cnv.getGraphicsContext2D();
        gc.setFill(Color.BLACK);
        gc.fillRect(0, 0, cnv.getWidth(), cnv.getHeight());

        //set response to mouse events
        cnv.setOnMouseClicked((MouseEvent event) -> {
            System.out.println("mouseClicked");
        });
        cnv.setOnMouseDragOver((MouseDragEvent event) -> {
            System.out.println("mouseDragOver");
        });
        cnv.setOnMouseDragEntered((MouseDragEvent event) -> {
            System.out.println("mouseDragEntered");
        });
        cnv.setOnMouseDragReleased((MouseDragEvent event) -> {
            System.out.println("mouseDragReleased");
        });
        cnv.setOnMouseDragExited((MouseDragEvent event) -> {
            System.out.println("mouseDragExited");
        });


        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}

我的错误在哪里?

(我使用的是带有 NetBeans 8.2 的 Win 7 64)

最佳答案

这些事件处理程序用于平台支持的拖放处理,如果您在检测到拖动的事件中调用 startDragAndDrop() ,则会启动该处理程序。 (它们也仅在某些情况下才会被触发,例如当拖板不为空时。)

您应该只使用 setOnMouseDragged() 进行常规鼠标事件处理。

请参阅 MouseEvent documentation 的“拖动手势”部分有关不同鼠标拖动模式及其支持的事件的详细信息。

关于java - 如何使用 JavaFX 检测 Canvas 上的鼠标拖动事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48312996/

相关文章:

java - 奇怪的gradle错误android studio

JavaFX - 创建带有图像的自定义按钮

java - 内容更改时 SwingNode 的内容未被垃圾收集

java - 如何在没有 native 安装程序的情况下为使用 JavaFX 的应用程序制作可运行的 jar

java - 无法解析 : com. google.android.material.material :1. 0

java - log4j :ERROR Could not parse url [file://. ../mda/log4j.xml]

java - 在 while 循环中设置变量

java - 由注解界定的有界类型参数

java - 同一个生成的.JAR文件在不同的电脑上是不同的

java - 内部类与带指针的顶级类(多少行太多)?