【问题标题】:Adding mouse event handler to menu in javafx将鼠标事件处理程序添加到 javafx 中的菜单
【发布时间】:2016-07-25 13:12:50
【问题描述】:

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

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

这里menu 是我要添加此行为的那个。

【问题讨论】:

  • 你在哪里添加了这段代码?在 fxml 控制器或应用程序类中?
  • 添加到与menubar fxml关联的控制器中
  • 实际上你不能像这样在菜单中添加鼠标处理程序。如果您不想进行悬停操作,请尝试使用简单的菜单和菜单项。

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


【解决方案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 
             }
            });

所以这里发生的情况是,鼠标事件类型在单击菜单时被初始化为MouseEvent.MOUSE_PRESSED,然后立即调用 setOnShown,默认操作显示包含菜单项的contextMenu。现在可以相应地给出不同的逻辑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多