我正在尝试构建一个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());
});
所以我如何处理这个问题,我如何能够在没有冲突的情况下与鼠标移动同时响应鼠标点击。
答案 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