伙计们!我的 JavaFX 应用程序遇到问题。可以将图像拖动并放置在整个 Pane 上的任何位置。这工作得非常好,直到我添加了第二个事件处理程序。我添加了第二个事件处理程序来处理删除。右键单击图像会弹出一个菜单,其中包含删除选项。一旦我添加了这个,拖动就停止正常工作。虽然它仍然可以工作,但鼠标不再位于图像上。一旦你开始拖动,图像就会像 300 px 一样上下跳动?我仍然可以拖动,但我没有在图像顶部拖动。
我知道这个解释不清楚,如果有人想要的话,我可以轻松上传一张 gif 来说明会发生什么。代码如下:
@FXML
private void handleImageButton()
{
System.out.println("Image Clicked");
closeMenus(6);
//contains the image path or image URL
String picURL = imageURL.getText();
if (!picURL.equals(""))
{
Image image = new Image(new File(picURL).toURI().toString());
ImageView iv = new ImageView();
iv.setImage(image);
iv.setCursor(Cursor.MOVE);
iv.setOnMousePressed(imageOnMousePressedEventHandler);
iv.setOnMouseDragged(imageOnMouseDraggedEventHandler);
workspace.getChildren().add(iv);
final ContextMenu contextMenu = new ContextMenu();
MenuItem delete = new MenuItem("Delete");
contextMenu.getItems().addAll(delete);
iv.setOnMousePressed(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent e){
if (e.isSecondaryButtonDown()){
contextMenu.show(workspace, e.getScreenX(), e.getScreenY());
delete.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event){
workspace.getChildren().remove(iv);
}
});
} //end if
}
});
}
}
EventHandler<MouseEvent> imageOnMousePressedEventHandler =
new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent t) {
if (ImageTools.isVisible())
{
originalX = t.getSceneX();
originalY = t.getSceneY();
newX = ((ImageView)(t.getSource())).getTranslateX();
newY = ((ImageView)(t.getSource())).getTranslateY();
System.out.println("(" + newX + ", " + newY + ")");
}
}
};
EventHandler<MouseEvent> imageOnMouseDraggedEventHandler =
new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent t) {
if (ImageTools.isVisible())
{
double offsetX = t.getSceneX() - originalX;
double offsetY = t.getSceneY() - originalY;
double newTranslateX = newX + offsetX;
double newTranslateY = newY + offsetY;
((ImageView)(t.getSource())).setTranslateX(newTranslateX);
((ImageView)(t.getSource())).setTranslateY(newTranslateY);
System.out.println("(" + newTranslateX + ", " + newTranslateY + ")");
}
}
};
最佳答案
问题是您正在覆盖鼠标监听器:
- iv.setOnMousePressed(imageOnMousePressedEventHandler);
- iv.setOnMouseDragged(imageOnMouseDraggedEventHandler);
- iv.setOnMousePressed(new EventHandler() {});
setOnXYZ 是属性的 setter,仅包含一个监听器,因此您可以在步骤 1 和 3 中有效地覆盖监听器。
使用Node.addEventHandler()
为同一EventType添加多个处理程序,或者在这种情况下我建议使用setOnContextMenuRequested显示上下文菜单,因为它更方便且独立于系统。
关于java - 在 JavaFX 中添加第二个事件处理程序后,拖动表现很奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26990386/