处理鼠标移动并在javafx中一起点击

时间:2015-06-27 16:37:53

标签: 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);

然后:

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

scene.setOnMousePressed(e -> Toolkit.getDefaultToolkit().beep());

我也尝试将它们放在单独的线程中,它也不起作用但如果确实存在另一个问题,我无法更改另一个线程中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();
    });

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

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

        scene.setOnMousePressed(event -> Toolkit.getDefaultToolkit().beep());
    });

所以我如何处理这个问题,我如何能够在没有冲突的情况下与鼠标移动同时响应鼠标点击。

1 个答案:

答案 0 :(得分:2)

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

至于异常,仅为了您的信息,为了在JavaFX Application Thread上运行代码,只需调用Platform.runLater(some Runnable code);所以在您的情况下

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

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