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)
那么我如何处理这个问题,如何与鼠标移动并行响应鼠标点击而不发生冲突。
当单击并按住鼠标时,而不是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 应用程序线程。有多种方法可以过滤或处理这些事件。有关活动的更多信息可以在这里找到
| 归档时间: |
|
| 查看次数: |
6405 次 |
| 最近记录: |