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

时间:2016-07-25 13:12:51

标签: javafx java-8 javafx-2 javafx-8

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

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

此处menu是我想要添加此行为的那个。

1 个答案:

答案 0 :(得分:0)

确实无法直接在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,默认操作显示包含menuItems的contextMenu。现在可以给出不同的逻辑。