将鼠标事件处理程序添加到javafx中的菜单

问题描述 投票:0回答:2

我是 javafx 新手,目前正在研究菜单、菜单项。我希望覆盖显示 contextMenu 的默认事件,即使未按下菜单但在显示相邻菜单的 contextMenu 时将鼠标悬停在其上,当前也会显示该事件。这在每个应用程序中都会发生,因为它非常方便。但由于某种原因我不需要它。我尝试捕获菜单上的鼠标事件,以便我可以相应地工作,但没有任何反应。

menu.addEventHandler(MouseEvent.ANY, event -> {
            System.out.println("Mouse event occured");
            });

这里

menu
是我想添加此行为的地方。

javafx java-8 javafx-2 javafx-8
2个回答
1
投票

确实无法直接将鼠标事件添加到 javafx 中的菜单中,但我设法找到了一种解决方法。现在的解决方法涉及menuBar(菜单放置在其上),它可以捕获鼠标事件。因此在 menuBar 上添加一个 eventFilter 用于鼠标事件,

    // variable to store the mouse-event-type 
       private MouseEvent mouseEventType

    // for registering mouse pressed event;
    // addEventFilter since it is called during the capturing phase
      mainMenu.addEventFilter(MouseEvent.ANY, mouseEvent -> {
      mouseEventType = mouseEvent;
    });

然后在 menu.setOnShown 中处理事件就可以了。

   // handle the mouse-event like this
      menu.setOnShown( event -> {
             if(mouseEventType.getEventType().equals(MouseEvent.MOUSE_PRESSED)){
                 //TODO something
             }else{
                 //TODO something 
             }
            });

所以这里发生的是,在单击菜单时,mouseEventType 被初始化为

MouseEvent.MOUSE_PRESSED
,并立即调用 setOnShown,默认操作显示包含菜单项的
contextMenu
。现在可以相应地给出不同的逻辑。


0
投票

您可以简单地将监听器添加到

styleableNode
(
MenuItem
) 的
getStyleableNode().addEventFilter(...

这个属性最初是

null
,在我的例子中,我只是在
show()
上添加监听器(自然地,只添加一次)。

© www.soinside.com 2019 - 2024. All rights reserved.