📄 basicpopupmenuui.java
字号:
if (p[0] instanceof JMenuBar) { lastGrabbedMenuBarChild = true; } else { lastGrabbedMenuBarChild = false; } Component ignore = null; if(c instanceof java.awt.Window) { ((java.awt.Window)c).addWindowListener(this); ((java.awt.Window)c).addWindowFocusListener(this); ((java.awt.Window)c).addComponentListener(this); grabbed.addElement(c); } else if (c instanceof JRootPane) { // Only add listeners to the glass pane if it listeners, // otherwise if the glass pane is visible no mouse move // events will come to us. ignore = ((JRootPane)c).getGlassPane(); if (ignore.getMouseListeners().length > 0 || ignore.getMouseMotionListeners().length > 0 || ignore.getMouseWheelListeners().length > 0) { ignore = null; } } synchronized(c.getTreeLock()) { int ncomponents = c.getComponentCount(); Component[] component = c.getComponents(); for (int i = 0 ; i < ncomponents ; i++) { Component comp = component[i]; if(!comp.isVisible()) continue; if (comp != ignore) { comp.addMouseListener(this); comp.addMouseMotionListener(this); comp.addMouseWheelListener(this); grabbed.addElement(comp); } if (comp instanceof Container) { Container cont = (Container) comp; grabContainer(cont, excluded); } } } } void ungrabContainers() { int i,c; Component cpn; for(i=0,c=grabbed.size();i<c;i++) { cpn = (Component)grabbed.elementAt(i); if(cpn instanceof java.awt.Window) { ((java.awt.Window)cpn).removeWindowListener(this); ((java.awt.Window)cpn).removeWindowFocusListener(this); ((java.awt.Window)cpn).removeComponentListener(this); } else { cpn.removeMouseListener(this); cpn.removeMouseMotionListener(this); cpn.removeMouseWheelListener(this); } } grabbed = new Vector(); lastGrabbed = null; lastGrabbedMenuBarChild = false; } public void mousePressed(MouseEvent e) { Component c = (Component)e.getSource(); MenuSelectionManager msm = MenuSelectionManager.defaultManager(); cancelPopupMenu(); /* if(msm.isComponentPartOfCurrentMenu(popupMenu) && msm.isComponentPartOfCurrentMenu(c)) { return; } else { cancelPopupMenu(); } */ } public void mouseReleased(MouseEvent e) { MenuSelectionManager.defaultManager().processMouseEvent(e); } public void mouseEntered(MouseEvent e) { // MenuSelectionManager.defaultManager().processMouseEvent(e); } public void mouseExited(MouseEvent e) { // MenuSelectionManager.defaultManager().processMouseEvent(e); } public void mouseMoved(MouseEvent e) { // MenuSelectionManager.defaultManager().processMouseEvent(e); } public void mouseDragged(MouseEvent e) { MenuSelectionManager.defaultManager().processMouseEvent(e); } public void mouseClicked(MouseEvent e) { } public void mouseWheelMoved(MouseWheelEvent e) { cancelPopupMenu(); } public void componentResized(ComponentEvent e) { cancelPopupMenu(); } public void componentMoved(ComponentEvent e) { cancelPopupMenu(); } public void componentShown(ComponentEvent e) { cancelPopupMenu(); } public void componentHidden(ComponentEvent e) { cancelPopupMenu(); } public void windowOpened(WindowEvent e) {} public void windowClosing(WindowEvent e) { cancelPopupMenu(); } public void windowClosed(WindowEvent e) { cancelPopupMenu(); } public void windowIconified(WindowEvent e) { cancelPopupMenu(); } public void windowDeiconified(WindowEvent e) {} public void windowActivated(WindowEvent e) { } public void windowDeactivated(WindowEvent e) { } public void windowLostFocus(WindowEvent e) { } public void windowGainedFocus(WindowEvent e) { } } public boolean isPopupTrigger(MouseEvent e) { return ((e.getID()==MouseEvent.MOUSE_RELEASED) && ((e.getModifiers() & MouseEvent.BUTTON3_MASK)!=0)); } // for auditory feedback private transient PopupMenuListener basicPopupMenuListener = null; // for auditory feedback private PopupMenuListener createPopupMenuListener() { return new BasicPopupMenuListener(); } /** * This Listener fires the Action that provides the correct auditory * feedback. * * @since 1.4 */ private class BasicPopupMenuListener implements PopupMenuListener { public void popupMenuCanceled(PopupMenuEvent e) { } public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { } public void popupMenuWillBecomeVisible(PopupMenuEvent e) { // Fire the Action that renders the auditory cue. JPopupMenu pm = (JPopupMenu)e.getSource(); ActionMap map = pm.getActionMap(); if (map != null) { Action audioAction = map.get("PopupMenu.popupSound"); if (audioAction != null) { // pass off firing the Action to a utility method BasicLookAndFeel lf = (BasicLookAndFeel) UIManager.getLookAndFeel(); lf.playSound(audioAction); } } } } private static class CancelAction extends AbstractAction { public void actionPerformed(ActionEvent e) { // 4234793: This action should call JPopupMenu.firePopupMenuCanceled but it's // a protected method. The real solution could be to make // firePopupMenuCanceled public and call it directly. JPopupMenu lastPopup = (JPopupMenu)getLastPopup(); if (lastPopup != null) { lastPopup.putClientProperty("JPopupMenu.firePopupMenuCanceled", Boolean.TRUE); } MenuElement path[] = MenuSelectionManager.defaultManager().getSelectedPath(); if(path.length > 4) { /* PENDING(arnaud) Change this to 2 when a mouse grabber is available for MenuBar */ MenuElement newPath[] = new MenuElement[path.length - 2]; System.arraycopy(path,0,newPath,0,path.length-2); MenuSelectionManager.defaultManager().setSelectedPath(newPath); } else MenuSelectionManager.defaultManager().clearSelectedPath(); } } private static class ReturnAction extends AbstractAction { public void actionPerformed(ActionEvent e) { KeyboardFocusManager fmgr = KeyboardFocusManager.getCurrentKeyboardFocusManager(); Component focusOwner = fmgr.getFocusOwner(); if(focusOwner != null && !(focusOwner instanceof JRootPane)) { return; } MenuSelectionManager msm = MenuSelectionManager.defaultManager(); MenuElement path[] = msm.getSelectedPath(); MenuElement lastElement; if(path.length > 0) { lastElement = path[path.length-1]; if(lastElement instanceof JMenu) { MenuElement newPath[] = new MenuElement[path.length+1]; System.arraycopy(path,0,newPath,0,path.length); newPath[path.length] = ((JMenu)lastElement).getPopupMenu(); msm.setSelectedPath(newPath); } else if(lastElement instanceof JMenuItem) { JMenuItem mi = (JMenuItem)lastElement; if (mi.getUI() instanceof BasicMenuItemUI) { ((BasicMenuItemUI)mi.getUI()).doClick(msm); } else { msm.clearSelectedPath(); mi.doClick(0); } } } } } private static MenuElement nextEnabledChild(MenuElement e[], int fromIndex, int toIndex) { for (int i=fromIndex; i<=toIndex; i++) { if (e[i] != null) { Component comp = e[i].getComponent(); if (comp != null && comp.isEnabled()) return e[i]; } } return null; } private static MenuElement previousEnabledChild(MenuElement e[], int fromIndex, int toIndex) { for (int i=fromIndex; i>=toIndex; i--) { if (e[i] != null) { Component comp = e[i].getComponent(); if (comp != null && comp.isEnabled()) return e[i]; } } return null; } private static MenuElement findEnabledChild(MenuElement e[], int fromIndex, boolean forward) { MenuElement result = null; if (forward) { result = nextEnabledChild(e, fromIndex+1, e.length-1); if (result == null) result = nextEnabledChild(e, 0, fromIndex-1); } else { result = previousEnabledChild(e, fromIndex-1, 0); if (result == null) result = previousEnabledChild(e, e.length-1, fromIndex+1); } return result; } private static MenuElement findEnabledChild(MenuElement e[], MenuElement elem, boolean forward) { for (int i=0; i<e.length; i++) { if (e[i] == elem) { return findEnabledChild(e, i, forward); } } return null; } private static class SelectNextItemAction extends AbstractAction { static boolean FORWARD = true; static boolean BACKWARD = false; boolean direction; SelectNextItemAction(boolean dir) { direction = dir; } public void actionPerformed(ActionEvent e) { MenuSelectionManager msm = MenuSelectionManager.defaultManager(); MenuElement path[] = msm.getSelectedPath(); if (path.length < 2) { return; } int len = path.length; if (path[0] instanceof JMenuBar && path[1] instanceof JMenu && len == 2) { // a toplevel menu is selected, but its popup not shown. // Show the popup and select the first item JPopupMenu popup = ((JMenu)path[1]).getPopupMenu(); MenuElement next = findEnabledChild(popup.getSubElements(), -1, FORWARD); MenuElement[] newPath; if (next != null) { // an enabled item found -- include it in newPath newPath = new MenuElement[4]; newPath[3] = next; } else { // menu has no enabled items -- still must show the popup newPath = new MenuElement[3]; } System.arraycopy(path, 0, newPath, 0, 2); newPath[2] = popup; msm.setSelectedPath(newPath); } else if (path[len-1] instanceof JPopupMenu && path[len-2] instanceof JMenu) { // a menu (not necessarily toplevel) is open and its popup // shown. Select the appropriate menu item JMenu menu = (JMenu)path[len-2]; JPopupMenu popup = menu.getPopupMenu(); MenuElement next = findEnabledChild(popup.getSubElements(), -1, direction); if (next != null) { MenuElement[] newPath = new MenuElement[len+1]; System.arraycopy(path, 0, newPath, 0, len); newPath[len] = next; msm.setSelectedPath(newPath); } else { // all items in the popup are disabled. // We're going to find the parent popup menu and select // its next item. If there's no parent popup menu (i.e. // current menu is toplevel), do nothing if (len > 2 && path[len-3] instanceof JPopupMenu) { popup = ((JPopupMenu)path[len-3]); next = findEnabledChild(popup.getSubElements(), menu, direction); if (next != null && next != menu) { MenuElement[] newPath = new MenuElement[len-1]; System.arraycopy(path, 0, newPath, 0, len-2); newPath[len-2] = next; msm.setSelectedPath(newPath); } } } } else { // just select the next item, no path expansion needed MenuElement subs[] = path[len-2].getSubElements(); MenuElement nextChild = findEnabledChild(subs, path[len-1], direction); if (nextChild == null) { nextChild = findEnabledChild(subs, -1, direction); } if (nextChild != null) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -