public void processMouseEvent( JMenuItem item, MouseEvent e, MenuElement path[], MenuSelectionManager manager) { Point p = e.getPoint(); if (p.x >= 0 && p.x < item.getWidth() && p.y >= 0 && p.y < item.getHeight()) { if (e.getID() == MouseEvent.MOUSE_RELEASED) { manager.clearSelectedPath(); item.doClick(0); item.setArmed(false); } else manager.setSelectedPath(path); } else if (item.getModel().isArmed()) { MenuElement newPath[] = new MenuElement[path.length - 1]; int i, c; for (i = 0, c = path.length - 1; i < c; i++) newPath[i] = path[i]; manager.setSelectedPath(newPath); } }
/** * Handles the mnemonics for the menu items. Will also handle duplicate mnemonics. Perhaps this * should be moved into BasicPopupMenuUI. See 4670831 */ public void menuKeyPressed(MenuKeyEvent e) { // Handle the case for Escape or Enter... char keyChar = e.getKeyChar(); if (!Character.isLetterOrDigit(keyChar)) return; MenuSelectionManager manager = e.getMenuSelectionManager(); MenuElement selectedPath[] = manager.getSelectedPath(); for (int i = selectedPath.length - 1; i >= 0; i--) { if (selectedPath[i] == menuItem) { JPopupMenu popupMenu = ((JMenu) menuItem).getPopupMenu(); MenuElement items[] = popupMenu.getSubElements(); int index = -1; for (int j = 0; j < items.length; j++) { int key = ((JMenuItem) items[j]).getMnemonic(); if (Character.toLowerCase((char) key) == Character.toLowerCase(keyChar)) { index = j; break; } } if (index != -1) { // Invoke the menu action JMenuItem item = (JMenuItem) items[index]; if (!(item instanceof JMenu)) { // Let Submenus be handled by menuKeyTyped manager.clearSelectedPath(); item.doClick(); } } e.consume(); return; } } }