在JavaFX中添加第二个eventhandler后拖动动作奇怪

时间:2014-11-18 09:09:38

标签: java javafx

家伙!我在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 + ")");
                }
            }
        };

1 个答案:

答案 0 :(得分:1)

问题是你要覆盖你的鼠标听众:

  1. iv.setOnMousePressed(imageOnMousePressedEventHandler);
  2. iv.setOnMouseDragged(imageOnMouseDraggedEventHandler);
  3. iv.setOnMousePressed(new EventHandler(){});
  4. setOnXYZ是属性的setter,只保存一个侦听器,因此您可以在步骤1和3中有效地覆盖侦听器。

    使用Node.addEventHandler()为同一个EventType添加多个处理程序,或者在这种情况下我建议使用setOnContextMenuRequested来显示上下文菜单,因为它更方便且与系统无关。