家伙!我在JavaFX应用程序中遇到了问题。图像可以拖动并放置在整个窗格的任何位置。这非常有效,直到我添加了第二个事件处理程序。我添加了第二个事件处理程序来处理删除。右键单击图像会弹出一个菜单,其中包含删除选项。一旦我添加了这个,拖动就停止了正常工作。虽然它仍然有效,但鼠标不再出现在图像上。一旦开始拖动,图像会像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 + ")");
}
}
};
答案 0 :(得分:1)
问题是你要覆盖你的鼠标听众:
setOnXYZ是属性的setter,只保存一个侦听器,因此您可以在步骤1和3中有效地覆盖侦听器。
使用Node.addEventHandler()
为同一个EventType添加多个处理程序,或者在这种情况下我建议使用setOnContextMenuRequested来显示上下文菜单,因为它更方便且与系统无关。