在javafx中处理鼠标移动和点击

sza*_*i20 5 java multithreading javafx mouseevent

我正在尝试构建一个javafx应用程序,在其中我需要响应鼠标移动和点击,就像射击时在反恐精英中发生的情况一样。但问题是,当我按下鼠标按钮时,它不会再响应鼠标移动,直到我释放鼠标按钮。我希望他们两个能够并行工作。我尝试在单独的线程中设置侦听器,但它不起作用。这是枪指针的图像。

Image image = new Image("/pointer.png");  // a 25*25 PNG icon
ImageView imageView = new ImageView(image);
scene.setCursor(Cursor.NONE);
Run Code Online (Sandbox Code Playgroud)

进而 :

scene.setOnMouseMoved(e -> {
        imageView.setX(e.getX());
        imageView.setY(e.getY());
    });

scene.setOnMousePressed(e -> Toolkit.getDefaultToolkit().beep());
Run Code Online (Sandbox Code Playgroud)

我还尝试将它们放在单独的线程中,它也不起作用,但如果它确实存在另一个问题,我无法更改另一个线程中 javafx 组件的坐标,并且我收到此错误 - 即使它不会导致出现错误,它将无法工作:

java.lang.IllegalStateException: Not on FX application thread

scene.setOnMouseMoved(e -> {
        Thread thread = new Thread() {
            @Override
            public void run() {
                imageView.setX(e.getX());  // here i cannot do stuff related
                imageView.setY(e.getY());  // to javafx components
            }
        };

        thread.start();
    });

    scene.setOnMousePressed(e -> {
        Thread thread = new Thread() {
            @Override
            public void run() {
                Toolkit.getDefaultToolkit().beep());
            }
        };

        thread.start();
    });
Run Code Online (Sandbox Code Playgroud)

我也尝试过这个,但它也不起作用

scene.setOnMouseMoved(e -> {
        imageView.setX(e.getX());
        imageView.setY(e.getY());

        scene.setOnMousePressed(event -> Toolkit.getDefaultToolkit().beep());
    });
Run Code Online (Sandbox Code Playgroud)

那么我如何处理这个问题,如何与鼠标移动并行响应鼠标点击而不发生冲突。

Alm*_*asB 3

当单击并按住鼠标时,而不是onMouseMoved使用onMouseDragged相同的方法签名。我相信应该可以满足您的要求。

至于例外情况,仅供您参考,为了在 JavaFX 应用程序线程上运行代码,只需Platform.runLater(some Runnable code);在您的情况下调用 So

Thread thread = new Thread() {
        @Override
        public void run() {
            Platform.runLater(() -> {
                imageView.setX(e.getX()); // this will now run fine
                imageView.setY(e.getY());
            });
        }
    };
Run Code Online (Sandbox Code Playgroud)

然而,绝对不需要额外的线程,因为事件的捕获将仅传播到 JavaFX 应用程序线程。有多种方法可以过滤或处理这些事件。有关活动的更多信息可以在这里找到