EventHandlers互相压倒? JavaFX的

时间:2014-11-26 03:42:03

标签: java javafx

我有一个上下文菜单,右键单击我的JavaFX应用程序中的节点即可激活。最初我只有一个菜单项,但我决定添加另一个。当我添加另一个时,第二个菜单项工作但第一个菜单项停止工作。这是我的代码:

        final ContextMenu contextMenu = new ContextMenu();
        MenuItem delete = new MenuItem("Delete");
        MenuItem hyperlink = new MenuItem("Hyperlink...");
        contextMenu.getItems().addAll(delete, hyperlink);

        //handles deletion
        webView.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)
                        {
                            //do stuff
                        }
                    });
                }
            }
        });

        //handles hyperlink
        webView.setOnMousePressed(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent e){
                if (e.isSecondaryButtonDown()){
                    contextMenu.show(workspace, e.getScreenX(), e.getScreenY());
                    hyperlink.setOnAction(new EventHandler<ActionEvent>() {
                        @Override
                        public void handle(ActionEvent event)
                        {
                            //do stuff
                        }
                    });
                }
            }
        });

    }

我认为这是因为听众互相覆盖,因此我将其更改为添加事件处理程序。这是我改变代码的方式:

        final ContextMenu contextMenu = new ContextMenu();
        MenuItem delete = new MenuItem("Delete");
        MenuItem hyperlink = new MenuItem("Hyperlink...");
        contextMenu.getItems().addAll(delete, hyperlink);

        //handles deletion
        webView.addEventHandler(MouseEvent.MOUSE_CLICKED, 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)
                        {
                            //do stuff
                        }
                    });
                }
            }
        });

        //handles hyperlink
        webView.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent e){
                if (e.isSecondaryButtonDown()){
                    contextMenu.show(workspace, e.getScreenX(), e.getScreenY());
                    hyperlink.setOnAction(new EventHandler<ActionEvent>() {
                        @Override
                        public void handle(ActionEvent event)
                        {
                            //do stuff
                        }
                    });
                }
            }
        });

现在,当我右键单击节点时,会发生任何事情。有人可以解释为什么,以及我的解决方案可能是什么?

2 个答案:

答案 0 :(得分:0)

有很多事情:

  1. 是的,在您的第一个版本中,处理程序相互重叠。
  2. 直接翻译为addEventHandler样式将使用事件类型MouseEvent.MOUSE_PRESSED,而不是MOUSE_CLICKED,因为MOUSE_CLICKED仅在鼠标按钮释放后发生,因此{{1测试总是返回isSecondaryButtonDown() - 这就是为什么没有发生任何事情。
  3. 您可以收听false事件:

    ,而不是检测鼠标按下
    CONTEXT_MENU_REQUESTED
  4. 您应该在创建后立即设置菜单项的操作,而不是每次右键单击:

    webView.setOnContextMenuRequested(new EventHandler<ContextMenuEvent>() {
        @Override
        public void handle(ContextMenuEvent e) {
            contextMenu.show(workspace, e.getScreenX(), e.getScreenY());
        }
    }
    

    右键单击您需要做的唯一事情是显示上下文菜单,如上所示。

答案 1 :(得分:0)

为什么要复制代码?只需按照您的第一种方法,在同一个EventHandler中执行这两项操作。 还有一点需要注意:为webView处理程序之外的MenuItem定义ActionEvent。您现在正在做的是每次单击要重置ActionEvents的menuItem时。从您的代码中,我只能看到您需要检测MouseEvent才能显示上下文菜单。这可以在一个webView.setOnMousePressed(...)中完成。