将鼠标事件处理程序添加到 javafx 中的菜单
Adding mouse event handler to menu in javafx
我是 javafx 的新手,目前正在处理菜单和菜单项。我希望覆盖显示 contextMenu 的默认事件,即使未按下菜单但鼠标悬停在显示相邻菜单的 contextMenu 时,当前也会显示该事件。这在每个应用程序中都会发生,因为它非常方便。但出于某种原因,我不需要它。我尝试捕获菜单上的鼠标事件,以便我可以相应地工作,但没有任何反应。
menu.addEventHandler(MouseEvent.ANY, event -> {
System.out.println("Mouse event occured");
});
这里 menu
是我要添加此行为的地方。
确实不能直接在 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
。现在可以给出相应的不同逻辑了。
我是 javafx 的新手,目前正在处理菜单和菜单项。我希望覆盖显示 contextMenu 的默认事件,即使未按下菜单但鼠标悬停在显示相邻菜单的 contextMenu 时,当前也会显示该事件。这在每个应用程序中都会发生,因为它非常方便。但出于某种原因,我不需要它。我尝试捕获菜单上的鼠标事件,以便我可以相应地工作,但没有任何反应。
menu.addEventHandler(MouseEvent.ANY, event -> {
System.out.println("Mouse event occured");
});
这里 menu
是我要添加此行为的地方。
确实不能直接在 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
。现在可以给出相应的不同逻辑了。