RT-28393: Left / Right key navigation for Menu dropdowns don't work. diff -r 5e8a8d2136eb modules/controls/src/main/java/com/sun/javafx/scene/control/skin/ContextMenuContent.java --- a/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/ContextMenuContent.java Fri Nov 01 17:15:43 2013 -0700 +++ b/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/ContextMenuContent.java Tue Nov 05 14:17:26 2013 -0800 @@ -52,6 +52,7 @@ import javafx.geometry.Side; import javafx.geometry.VPos; import javafx.scene.Node; +import javafx.scene.Parent; import javafx.scene.control.CheckMenuItem; import javafx.scene.control.ContextMenu; import javafx.scene.control.Label; @@ -564,6 +565,26 @@ default: break; } + + if (!ke.isConsumed()) { + Node ownerNode = contextMenu.getOwnerNode(); + if (ownerNode instanceof MenuItemContainer) { + // Forward to parent menu + Parent parent = ownerNode.getParent(); + while (parent != null && !(parent instanceof ContextMenuContent)) { + parent = parent.getParent(); + } + if (parent instanceof ContextMenuContent) { + ((ContextMenuContent)parent).getOnKeyPressed().handle(ke); + } + } else if (ownerNode instanceof MenuBarSkin.MenuBarButton) { + // This is a top-level MenuBar Menu, so forward event to MenuBar + MenuBarSkin mbs = ((MenuBarSkin.MenuBarButton)ownerNode).getMenuBarSkin(); + if (mbs != null && mbs.getKeyEventHandler() != null) { + mbs.getKeyEventHandler().handle(ke); + } + } + } } }); diff -r 5e8a8d2136eb modules/controls/src/main/java/com/sun/javafx/scene/control/skin/MenuBarSkin.java --- a/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/MenuBarSkin.java Fri Nov 01 17:15:43 2013 -0700 +++ b/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/MenuBarSkin.java Tue Nov 05 14:17:26 2013 -0800 @@ -175,6 +175,10 @@ private EventHandler mouseEventHandler; private ChangeListener menuBarFocusedPropertyListener; + EventHandler getKeyEventHandler() { + return keyEventHandler; + } + /*************************************************************************** * * * Constructors * @@ -578,7 +582,7 @@ getSkinnable().focusedProperty().addListener(menuBarFocusedPropertyListener); for (final Menu menu : getSkinnable().getMenus()) { if (!menu.isVisible()) continue; - final MenuBarButton menuButton = new MenuBarButton(menu.getText(), menu.getGraphic()); + final MenuBarButton menuButton = new MenuBarButton(this, menu.getText(), menu.getGraphic()); menuButton.setFocusTraversable(false); menuButton.getStyleClass().add("menu"); menuButton.setStyle(menu.getStyle()); // copy style @@ -619,6 +623,7 @@ public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { if (menu.isShowing()) { menuButton.show(); + focusedMenuIndex = container.getChildren().indexOf(menuButton); } else { menuButton.hide(); } @@ -916,18 +921,16 @@ static class MenuBarButton extends MenuButton { private ChangeListener menuListener; + private MenuBarSkin menuBarSkin; private Menu menu; - public MenuBarButton() { - super(); + public MenuBarButton(MenuBarSkin menuBarSkin, String text, Node graphic) { + super(text, graphic); + this.menuBarSkin = menuBarSkin; } - public MenuBarButton(String text) { - super(text); - } - - public MenuBarButton(String text, Node graphic) { - super(text, graphic); + public MenuBarSkin getMenuBarSkin() { + return menuBarSkin; } private void clearHover() {