繁体   English   中英

EventHandlers互相覆盖? JavaFX

[英]EventHandlers overriding each other? 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
                        }
                    });
                }
            }
        });

现在,当我右键单击节点时,什么都没有发生。 有人可以解释原因,我的解决方案是什么?

有很多事情:

  1. 是的,在您的第一个版本中,处理程序相互覆盖。
  2. 直接转换为addEventHandler样式将使用事件类型MouseEvent.MOUSE_PRESSED ,而不是MOUSE_CLICKED ,因为MOUSE_CLICKED仅在释放鼠标按钮之后MOUSE_CLICKED发生,因此isSecondaryButtonDown()测试始终返回false这就是为什么什么也没发生的原因。
  3. 您可以侦听CONTEXT_MENU_REQUESTED事件,而不是检测鼠标按下情况:

     webView.setOnContextMenuRequested(new EventHandler<ContextMenuEvent>() { @Override public void handle(ContextMenuEvent e) { contextMenu.show(workspace, e.getScreenX(), e.getScreenY()); } } 
  4. 您应该在菜单项创建后立即对其进行设置,而不是在每次单击鼠标右键时进行设置:

     MenuItem delete = new MenuItem("Delete"); delete.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { //do stuff } }); 

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

您为什么要复制代码。 只需遵循您的第一种方法,并在同一EventHandler中完成这两项操作即可。 另一个注意事项:在webView处理程序之外为MenuItems定义ActionEvent。 现在要做的是每次单击menuItem都在重置ActionEvent。 从您的代码中,我只能看到您只需检测MouseEvent即可显示上下文菜单。 可以在一个webView.setOnMousePressed(...)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM