在 javafx 中一起处理鼠标移动和单击
handle mouse move and click together in javafx
我正在尝试构建一个 javafx 应用程序,我需要在其中同时响应鼠标移动和点击,就像在反恐精英中射击时发生的情况一样。但问题是当我按下鼠标按钮时,它不会再响应鼠标移动,直到我释放鼠标按钮。我希望他们俩并行工作。我试图在单独的线程中设置我的听众,但它不是 work.This 是枪支指针的图像。
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());
});
那么我该如何处理这个问题,如何在不发生冲突的情况下同时响应鼠标点击和鼠标移动。
单击并按住鼠标时,使用具有相同方法签名的 onMouseDragged
而不是 onMouseMoved
。相信应该能满足你的要求。
至于异常,仅供参考,为了 运行 JavaFX 应用程序线程上的代码只需调用 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
我正在尝试构建一个 javafx 应用程序,我需要在其中同时响应鼠标移动和点击,就像在反恐精英中射击时发生的情况一样。但问题是当我按下鼠标按钮时,它不会再响应鼠标移动,直到我释放鼠标按钮。我希望他们俩并行工作。我试图在单独的线程中设置我的听众,但它不是 work.This 是枪支指针的图像。
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());
});
那么我该如何处理这个问题,如何在不发生冲突的情况下同时响应鼠标点击和鼠标移动。
单击并按住鼠标时,使用具有相同方法签名的 onMouseDragged
而不是 onMouseMoved
。相信应该能满足你的要求。
至于异常,仅供参考,为了 运行 JavaFX 应用程序线程上的代码只需调用 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