MenuSelectionManager.defaultManager () действительно является хорошим решением, но оно не будет работать, если вы попытаетесь предварительно выбрать подменю вашего JPopupMenu (оно скроет родительское меню).
Кроме того, он портит другие способы навигации с помощью клавиатуры (вы не можете нажать левую кнопку, чтобы скрыть подменю и т. Д.)
К сожалению, в Swing нет хорошего решения этого вопроса ...
Мое решение уродливо, но, к сожалению, отлично справляется с работой:
public static void setMenuSelectedIndex(final JPopupMenu popupMenu, final int index) {
SwingUtilities.invokeLater(new Runnable(){public void run()
{
for (int i=0; i < index+1; i++) {
popupMenu.dispatchEvent(new KeyEvent(popupMenu, KeyEvent.KEY_PRESSED, 0, 0, KeyEvent.VK_DOWN, '\0'));
}
}});
}
Как вы видите, я в основном имитирую нажатия клавиш "Вниз" во всплывающем меню ...
Лучшим решением может быть не жестко имитировать VK_DOWN, а прочитать карту ввода Popup и определить, какой KeyCode означает «выбрать следующий пункт меню» - но я думаю, что большинство из нас справится с этим хаком ...
Возможно, вы также захотите взглянуть на этот метод, который выбирает пункт меню после его выбора.
Используется предыдущий метод
public static void setSelectedIndexWhenVisible(final JMenu menu, final int index) {
menu.getPopupMenu().addPopupMenuListener(new PopupMenuListener() {
@Override
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
PopupUtils.setMenuSelectedIndex(menu.getPopupMenu(), index);
menu.getPopupMenu().removePopupMenuListener(this);
}
@Override
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
}
@Override
public void popupMenuCanceled(PopupMenuEvent e) {
}
});
}