--- old/modules/javafx.controls/src/main/java/com/sun/javafx/scene/control/ContextMenuContent.java 2016-10-05 10:27:37.000000000 +1300 +++ new/modules/javafx.controls/src/main/java/com/sun/javafx/scene/control/ContextMenuContent.java 2016-10-05 10:27:36.000000000 +1300 @@ -463,6 +463,7 @@ private void initialize() { // RT-19624 calling requestFocus inside layout was casuing repeated layouts. contextMenu.addEventHandler(Menu.ON_SHOWN, event -> { + currentFocusedIndex = -1; for (Node child : itemsContainer.getChildren()) { if (child instanceof MenuItemContainer) { final MenuItem item = ((MenuItemContainer)child).item; --- old/modules/javafx.controls/src/test/java/com/sun/javafx/scene/control/ContextMenuContentShim.java 2016-10-05 10:27:38.000000000 +1300 +++ new/modules/javafx.controls/src/test/java/com/sun/javafx/scene/control/ContextMenuContentShim.java 2016-10-05 10:27:37.000000000 +1300 @@ -132,7 +132,7 @@ if (showingMenuContent.isPresent()) { ContextMenuContent content = showingMenuContent.get(); int currentFocusIndex = content.getCurrentFocusIndex(); - return showingMenuItems.get(currentFocusIndex); + return currentFocusIndex == -1 ? null : showingMenuItems.get(currentFocusIndex); } return null; --- old/modules/javafx.controls/src/test/java/test/javafx/scene/control/ContextMenuTest.java 2016-10-05 10:27:39.000000000 +1300 +++ new/modules/javafx.controls/src/test/java/test/javafx/scene/control/ContextMenuTest.java 2016-10-05 10:27:38.000000000 +1300 @@ -575,4 +575,49 @@ focusedItem = getCurrentFocusedItem(cm); assertEquals("Expected " + menuItem1.getText() + ", found " + focusedItem.getText(), menuItem1, focusedItem); } + + @Test public void test_jdk_8167132_issue_1() { + ContextMenu cm = createContextMenu(true); + + MenuItem item1, item2, item3, item4; + cm.getItems().setAll( + item1 = new MenuItem("Item 1"), + item2 = new MenuItem("Item 2"), + item3 = new MenuItem("Item 3"), + item4 = new MenuItem("Item 4")); + + assertEquals(-1, getCurrentFocusedIndex(cm)); + + // press down once to go to item1 + pressDownKey(cm); + MenuItem focusedItem = getCurrentFocusedItem(cm); + assertEquals(0, getCurrentFocusedIndex(cm)); + assertEquals("Expected " + item1.getText() + ", found " + focusedItem.getText(), + item1, focusedItem); + + // press down once to go to item2 + pressDownKey(cm); + focusedItem = getCurrentFocusedItem(cm); + assertEquals(1, getCurrentFocusedIndex(cm)); + assertEquals("Expected " + item2.getText() + ", found " + focusedItem.getText(), + item2, focusedItem); + + // hide context menu + cm.hide(); + + // show context menu again + cm.show(anchorBtn, Side.RIGHT, 0, 0); + + // assert that focus is now not anywhere to be seen + focusedItem = getCurrentFocusedItem(cm); + assertEquals(-1, getCurrentFocusedIndex(cm)); + assertNull(focusedItem); + + // press down once to go to item1 + pressDownKey(cm); + focusedItem = getCurrentFocusedItem(cm); + assertEquals(0, getCurrentFocusedIndex(cm)); + assertEquals("Expected " + item1.getText() + ", found " + focusedItem.getText(), + item1, focusedItem); + } }