⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 basicpopupmenuui.java

📁 java jdk 1.4的源码
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
/* * @(#)BasicPopupMenuUI.java	1.101 03/01/31 * * Copyright 2003 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */package javax.swing.plaf.basic;import javax.swing.*;import javax.swing.event.*;import javax.swing.plaf.*;import javax.swing.border.*;import java.awt.Component;import java.awt.Container;import java.awt.Dimension;import java.awt.KeyboardFocusManager;import java.awt.Window;import java.awt.event.*;import java.beans.PropertyChangeListener;import java.beans.PropertyChangeEvent;import java.util.*;/** * A Windows L&F implementation of PopupMenuUI.  This implementation  * is a "combined" view/controller. * * @version 1.101 01/31/03 * @author Georges Saab * @author David Karlton * @author Arnaud Weber */public class BasicPopupMenuUI extends PopupMenuUI {    protected JPopupMenu popupMenu = null;    static boolean menuKeyboardHelperInstalled = false;    static MenuKeyboardHelper menuKeyboardHelper = null;private static boolean checkInvokerEqual(MenuElement present, MenuElement last) {        Component invokerPresent = present.getComponent();        Component invokerLast = last.getComponent();        if (invokerPresent instanceof JPopupMenu) {        invokerPresent = ((JPopupMenu)invokerPresent).getInvoker();        }        if (invokerLast instanceof JPopupMenu) {        invokerLast = ((JPopupMenu)invokerLast).getInvoker();        }        return (invokerPresent == invokerLast);        }    public static ComponentUI createUI(JComponent x) {	return new BasicPopupMenuUI();    }    public void installUI(JComponent c) {	popupMenu = (JPopupMenu) c;	installDefaults();        installListeners();        installKeyboardActions();    }    public void installDefaults() {	if (popupMenu.getLayout() == null ||	    popupMenu.getLayout() instanceof UIResource)	    popupMenu.setLayout(new DefaultMenuLayout(popupMenu, BoxLayout.Y_AXIS));	popupMenu.setOpaque(true);	LookAndFeel.installBorder(popupMenu, "PopupMenu.border");	LookAndFeel.installColorsAndFont(popupMenu,					 "PopupMenu.background",					 "PopupMenu.foreground",					 "PopupMenu.font");    }        protected void installListeners() {	if (mouseGrabber == null) {	    mouseGrabber = new MouseGrabber();	}	if (basicPopupMenuListener == null) {	    basicPopupMenuListener = createPopupMenuListener();	} 	popupMenu.addPopupMenuListener(basicPopupMenuListener);        if (!menuKeyboardHelperInstalled) {            if (menuKeyboardHelper == null) {                menuKeyboardHelper = new MenuKeyboardHelper();            }            MenuSelectionManager msm = MenuSelectionManager.defaultManager();            msm.addChangeListener(menuKeyboardHelper);        }    }    protected void installKeyboardActions() {    }    static InputMap getInputMap(JPopupMenu popup, JComponent c) {        InputMap windowInputMap = null;	Object[] bindings = (Object[])UIManager.get("PopupMenu.selectedWindowInputMapBindings");	if (bindings != null) {	    windowInputMap = LookAndFeel.makeComponentInputMap(c, bindings);	    if (!popup.getComponentOrientation().isLeftToRight()) {		Object[] km = (Object[])UIManager.get("PopupMenu.selectedWindowInputMapBindings.RightToLeft");		if (km != null) {		    InputMap rightToLeftInputMap = LookAndFeel.makeComponentInputMap(c, km);		    rightToLeftInputMap.setParent(windowInputMap);		    windowInputMap = rightToLeftInputMap;		}	    }        }        return windowInputMap;    }    static ActionMap getActionMap() {	ActionMap map = (ActionMap)UIManager.get("PopupMenu.actionMap");	if (map == null) {	    map = createActionMap();	    if (map != null) {		UIManager.getLookAndFeelDefaults().put("PopupMenu.actionMap",                                                       map);	    }  	}	return map;    }      static ActionMap createActionMap() {  	ActionMap map = new ActionMapUIResource();  	// Set the ActionMap's parent to the Auditory Feedback Action Map  	BasicLookAndFeel lf = (BasicLookAndFeel)UIManager.getLookAndFeel();	ActionMap audioMap = lf.getAudioActionMap();	map.setParent(audioMap);	map.put("cancel", new CancelAction());        map.put("selectNext",                new SelectNextItemAction(SelectNextItemAction.FORWARD));        map.put("selectPrevious",                new SelectNextItemAction(SelectNextItemAction.BACKWARD));	map.put("selectParent",                new SelectParentChildAction(SelectParentChildAction.PARENT));	map.put("selectChild",                new SelectParentChildAction(SelectParentChildAction.CHILD));	map.put("return", new ReturnAction());	// return the created map	return map;    }    public void uninstallUI(JComponent c) {        uninstallDefaults();        uninstallListeners();        uninstallKeyboardActions();		popupMenu = null;    }        protected void uninstallDefaults() {	LookAndFeel.uninstallBorder(popupMenu);    }    protected void uninstallListeners() {	if (basicPopupMenuListener != null) {	    popupMenu.removePopupMenuListener(basicPopupMenuListener);	}    }    protected void uninstallKeyboardActions() {	SwingUtilities.replaceUIActionMap(popupMenu, null);	SwingUtilities.replaceUIInputMap(popupMenu, 				  JComponent.WHEN_IN_FOCUSED_WINDOW, null);    }    public Dimension getMinimumSize(JComponent c) {        return getPreferredSize(c);    }    public Dimension getPreferredSize(JComponent c) {	return null;    }    public Dimension getMaximumSize(JComponent c) {        return getPreferredSize(c);    }/////////////////////////////////////////////////////////////////////////////////// Grab Code///////////////////////////////////////////////////////////////////////////////    private static Window getWindow(Component c) {        Component w = c;        while(!(w instanceof Window) && (w!=null)) {            w = w.getParent();        }        return (Window)w;    }    private static MenuElement getFirstPopup() {	MenuSelectionManager msm = MenuSelectionManager.defaultManager();	MenuElement[] p = msm.getSelectedPath();	MenuElement me = null;	    		for(int i = 0 ; me == null && i < p.length ; i++) {	    if (p[i] instanceof JPopupMenu)		me = p[i];	}		return me;    }    private static JPopupMenu getLastPopup() {	MenuSelectionManager msm = MenuSelectionManager.defaultManager();	MenuElement[] p = msm.getSelectedPath();	JPopupMenu popup = null;	    		for(int i = p.length - 1; popup == null && i >= 0; i--) {	    if (p[i] instanceof JPopupMenu)		popup = (JPopupMenu)p[i];	}	return popup;    }    private static List getPopups() {	MenuSelectionManager msm = MenuSelectionManager.defaultManager();	MenuElement[] p = msm.getSelectedPath();		List list = new ArrayList(p.length); 	for(int i = 0; i < p.length; i++) {	    if (p[i] instanceof JPopupMenu) {		list.add((JPopupMenu)p[i]);	    }	}	return list;    }        private transient static MouseGrabber mouseGrabber = null;    private static class MouseGrabber        implements MouseListener, MouseMotionListener, MouseWheelListener,                   WindowListener, WindowFocusListener, ComponentListener, ChangeListener {	Vector grabbed = new Vector();	MenuElement lastGrabbed = null;	boolean lastGrabbedMenuBarChild = false;        public MouseGrabber() {	    MenuSelectionManager msm = MenuSelectionManager.defaultManager();	    msm.addChangeListener(this);        }		private void requestAddGrab(Component invoker) {	    Window ancestor;	    ancestor = getWindow(invoker);	    MenuSelectionManager msm = MenuSelectionManager.defaultManager();	    MenuElement[] p = msm.getSelectedPath();	    Component excluded = null;	    	    for(int i = 0 ; excluded == null && i < p.length ; i++) {		if (p[i] instanceof JPopupMenu)		    excluded = p[i].getComponent();	    }	    grabContainer(ancestor, excluded);	}	private void requestRemoveGrab() {	    ungrabContainers();	}    	void cancelPopupMenu() {	    MenuSelectionManager msm = MenuSelectionManager.defaultManager();	    MenuElement[] p = msm.getSelectedPath();	    JPopupMenu firstPopup = (JPopupMenu)getFirstPopup();	    if (lastGrabbed == firstPopup) {		// 4234793: This action should call firePopupMenuCanceled but it's		// a protected method. The real solution could be to make 		// firePopupMenuCanceled public and call it directly.		List popups = getPopups();		Iterator iter = popups.iterator();		while (iter.hasNext()) {		    JPopupMenu popup = (JPopupMenu)iter.next();		    popup.putClientProperty("JPopupMenu.firePopupMenuCanceled", Boolean.TRUE);		}		MenuSelectionManager.defaultManager().clearSelectedPath();		ungrabContainers();	    } else {		// The cancel has cause another menu selection		lastGrabbed = firstPopup;		if (p[0] instanceof JMenuBar) {		    lastGrabbedMenuBarChild = true;		} else {		    lastGrabbedMenuBarChild = false;		}	    }	}	MenuElement[] lastPathSelected = new MenuElement[0];	public void stateChanged(ChangeEvent e) {	    MenuSelectionManager msm = MenuSelectionManager.defaultManager();	    MenuElement[] p = msm.getSelectedPath();            if (lastPathSelected.length != 0 && p.length != 0 ) {                      if (!checkInvokerEqual(p[0],lastPathSelected[0])) {                           requestRemoveGrab();                           lastPathSelected = new MenuElement[0];                     }        	}	    if (lastPathSelected.length == 0 &&		p.length != 0) {		// A grab needs to be added		Component invoker = p[0].getComponent();		if (invoker instanceof JPopupMenu)		    invoker = ((JPopupMenu)invoker).getInvoker();		requestAddGrab(invoker);	    }	    if (lastPathSelected.length != 0 &&		p.length == 0) {		// The grab should be removed		requestRemoveGrab();	    }	    // Switch between menubar children	    if (p!=null && p.length>2 && (p[0] instanceof JMenuBar &&					  lastGrabbedMenuBarChild == true)) {		if (!(lastGrabbed==getFirstPopup())) {		    lastGrabbed=getFirstPopup();		    if (p[0] instanceof JMenuBar) {			lastGrabbedMenuBarChild = true;		    } else {			lastGrabbedMenuBarChild = false;		    }		}	    }	    // Remember the last path selected	    lastPathSelected = p;	}			void grabContainer(Container c, Component excluded) {	    if(c == excluded)		return;	    	    MenuSelectionManager msm = MenuSelectionManager.defaultManager();	    MenuElement[] p = msm.getSelectedPath();	    lastGrabbed = getFirstPopup();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -