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

📄 basicoptionpaneui.java

📁 java jdk 1.4的源码
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
/* * @(#)BasicOptionPaneUI.java	1.55 03/01/23 * * 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.border.Border;import javax.swing.border.EmptyBorder;import javax.swing.*;import javax.swing.event.*;import javax.swing.plaf.ActionMapUIResource;import javax.swing.plaf.ComponentUI;import javax.swing.plaf.OptionPaneUI;import java.awt.*;import java.awt.event.*;import java.beans.PropertyChangeEvent;import java.beans.PropertyChangeListener;import java.util.Locale;import java.security.AccessController;/** * Provides the basic look and feel for a <code>JOptionPane</code>. * <code>BasicMessagePaneUI</code> provides a means to place an icon, * message and buttons into a <code>Container</code>. * Generally, the layout will look like:<p> * <pre> *        ------------------ *        | i | message    | *        | c | message    | *        | o | message    | *        | n | message    | *        ------------------ *        |     buttons    | *        |________________| * </pre> * icon is an instance of <code>Icon</code> that is wrapped inside a * <code>JLabel</code>.  The message is an opaque object and is tested * for the following: if the message is a <code>Component</code> it is * added to the <code>Container</code>, if it is an <code>Icon</code> * it is wrapped inside a <code>JLabel</code> and added to the  * <code>Container</code> otherwise it is wrapped inside a <code>JLabel</code>. * <p> * The above layout is used when the option pane's  * <code>ComponentOrientation</code> property is horizontal, left-to-right. * The layout will be adjusted appropriately for other orientations. * <p> * The <code>Container</code>, message, icon, and buttons are all * determined from abstract methods. *  * @version 1.55 01/23/03 * @author James Gosling * @author Scott Violet * @author Amy Fowler */public class BasicOptionPaneUI extends OptionPaneUI {    public static final int MinimumWidth = 262;    public static final int MinimumHeight = 90;    private static String newline;    /**     * The mnemonics for the keys, these are set in <code>getButtons</code>.     */    private int[] mnemonics;    /**     * <code>JOptionPane</code> that the receiver is providing the     * look and feel for.     */    protected JOptionPane         optionPane;    protected Dimension minimumSize;    /** JComponent provide for input if optionPane.getWantsInput() returns     * true. */    protected JComponent          inputComponent;    /** Component to receive focus when messaged with selectInitialValue. */    protected Component           initialFocusComponent;    /** This is set to true in validateComponent if a Component is contained     * in either the message or the buttons. */    protected boolean             hasCustomComponents;    protected PropertyChangeListener propertyChangeListener;    static {        java.security.AccessController.doPrivileged(            new java.security.PrivilegedAction() {                public Object run() {		    newline = System.getProperty("line.separator");		    if (newline == null) {		        newline = "\n";		    }		    return null;                }            }        );    }    /**      * Creates a new BasicOptionPaneUI instance.      */    public static ComponentUI createUI(JComponent x) {	return new BasicOptionPaneUI();    }    /**      * Installs the receiver as the L&F for the passed in      * <code>JOptionPane</code>.      */    public void installUI(JComponent c) {	optionPane = (JOptionPane)c;        installDefaults();        optionPane.setLayout(createLayoutManager());	installComponents();        installListeners();         installKeyboardActions();    }    /**      * Removes the receiver from the L&F controller of the passed in split      * pane.      */    public void uninstallUI(JComponent c) {        uninstallComponents();        optionPane.setLayout(null);        uninstallKeyboardActions();        uninstallListeners();        uninstallDefaults();	optionPane = null;    }    protected void installDefaults() {        LookAndFeel.installColorsAndFont(optionPane, "OptionPane.background",                                          "OptionPane.foreground", "OptionPane.font");	LookAndFeel.installBorder(optionPane, "OptionPane.border");        minimumSize = UIManager.getDimension("OptionPane.minimumSize");	optionPane.setOpaque(true);    }    protected void uninstallDefaults() {	LookAndFeel.uninstallBorder(optionPane);    }    protected void installComponents() {	optionPane.add(createMessageArea());                Container separator = createSeparator();        if (separator != null) {            optionPane.add(separator);        }	optionPane.add(createButtonArea());	optionPane.applyComponentOrientation(optionPane.getComponentOrientation());    }    protected void uninstallComponents() {	hasCustomComponents = false;        inputComponent = null;	initialFocusComponent = null;	optionPane.removeAll();    }    protected LayoutManager createLayoutManager() {        return new BoxLayout(optionPane, BoxLayout.Y_AXIS);    }    protected void installListeners() {        if ((propertyChangeListener = createPropertyChangeListener()) != null) {            optionPane.addPropertyChangeListener(propertyChangeListener);        }    }    protected void uninstallListeners() {        if (propertyChangeListener != null) {            optionPane.removePropertyChangeListener(propertyChangeListener);            propertyChangeListener = null;        }    }    protected PropertyChangeListener createPropertyChangeListener() {        return new PropertyChangeHandler();    }    protected void installKeyboardActions() {	InputMap map = getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);	SwingUtilities.replaceUIInputMap(optionPane, JComponent.				       WHEN_IN_FOCUSED_WINDOW, map);	ActionMap actionMap = getActionMap();	SwingUtilities.replaceUIActionMap(optionPane, actionMap);    }    protected void uninstallKeyboardActions() {	SwingUtilities.replaceUIInputMap(optionPane, JComponent.				       WHEN_IN_FOCUSED_WINDOW, null);	SwingUtilities.replaceUIActionMap(optionPane, null);    }    InputMap getInputMap(int condition) {	if (condition == JComponent.WHEN_IN_FOCUSED_WINDOW) {	    Object[] bindings = (Object[])UIManager.get		                ("OptionPane.windowBindings");	    if (bindings != null) {		return LookAndFeel.makeComponentInputMap(optionPane, bindings);	    }	}	return null;    }    ActionMap getActionMap() {	ActionMap map = (ActionMap)UIManager.get("OptionPane.actionMap");	if (map == null) {	    map = createActionMap();	    if (map != null) {		UIManager.getLookAndFeelDefaults().put("OptionPane.actionMap",                                                       map);	    }	}	return map;    }    ActionMap createActionMap() {	ActionMap map = new ActionMapUIResource();	map.put("close", new CloseAction());	// Set the ActionMap's parent to the Auditory Feedback Action Map	BasicLookAndFeel lf = (BasicLookAndFeel)UIManager.getLookAndFeel();	ActionMap audioMap = lf.getAudioActionMap();	map.setParent(audioMap);	return map;    }    /**     * Returns the minimum size the option pane should be. Primarily     * provided for subclassers wishing to offer a different minimum size.     */    public Dimension getMinimumOptionPaneSize() {        if (minimumSize == null) {            //minimumSize = UIManager.getDimension("OptionPane.minimumSize");            // this is called before defaults initialized?!!!            return new Dimension(MinimumWidth, MinimumHeight);        }	return new Dimension(minimumSize.width,			     minimumSize.height);    }    /**     * If <code>c</code> is the <code>JOptionPane</code> the receiver     * is contained in, the preferred     * size that is returned is the maximum of the preferred size of     * the <code>LayoutManager</code> for the <code>JOptionPane</code>, and     * <code>getMinimumOptionPaneSize</code>.     */    public Dimension getPreferredSize(JComponent c) {	if ((JOptionPane)c == optionPane) {	    Dimension            ourMin = getMinimumOptionPaneSize();	    LayoutManager        lm = c.getLayout();	    if (lm != null) {		Dimension         lmSize = lm.preferredLayoutSize(c);		if (ourMin != null)		    return new Dimension			(Math.max(lmSize.width, ourMin.width),			 Math.max(lmSize.height, ourMin.height));		return lmSize;	    }	    return ourMin;	}	return null;    }    /**     * Messages getPreferredSize.     */    public Dimension getMinimumSize(JComponent c) {	return getPreferredSize(c);    }    /**     * Messages getPreferredSize.     */    public Dimension getMaximumSize(JComponent c) {	return getPreferredSize(c);    }    /**     * Messaged from installComponents to create a Container containing the     * body of the message. The icon is the created by calling     * <code>addIcon</code>.     */    protected Container createMessageArea() {        JPanel top = new JPanel();        top.setBorder(UIManager.getBorder("OptionPane.messageAreaBorder"));	top.setLayout(new BorderLayout());	/* Fill the body. */	Container          body = new JPanel() {};	Container          realBody = new JPanel() {};	realBody.setLayout(new BorderLayout());	if (getIcon() != null) {            Container sep = new JPanel() {	        public Dimension getPreferredSize() {		    return new Dimension(15, 1);	        }            };	    realBody.add(sep, BorderLayout.BEFORE_LINE_BEGINS);	}	realBody.add(body, BorderLayout.CENTER);	body.setLayout(new GridBagLayout());	GridBagConstraints cons = new GridBagConstraints();	cons.gridx = cons.gridy = 0;	cons.gridwidth = GridBagConstraints.REMAINDER;	cons.gridheight = 1;	cons.anchor = GridBagConstraints.LINE_START;	cons.insets = new Insets(0,0,3,0);	addMessageComponents(body, cons, getMessage(),			  getMaxCharactersPerLineCount(), false);	top.add(realBody, BorderLayout.CENTER);	addIcon(top);	return top;    }    /**     * Creates the appropriate object to represent <code>msg</code> and     * places it into <code>container</code>. If <code>msg</code> is an     * instance of Component, it is added directly, if it is an Icon,     * a JLabel is created to represent it, otherwise a JLabel is     * created for the string, if <code>d</code> is an Object[], this     * method will be recursively invoked for the children.     * <code>internallyCreated</code> is true if Objc is an instance     * of Component and was created internally by this method (this is     * used to correctly set hasCustomComponents only if !internallyCreated).     */    protected void addMessageComponents(Container container,				     GridBagConstraints cons,				     Object msg, int maxll,				     boolean internallyCreated) {	if (msg == null) {	    return;        }	if (msg instanceof Component) {            // To workaround problem where Gridbad will set child            // to its minimum size if its preferred size will not fit            // within allocated cells            if (msg instanceof JScrollPane || msg instanceof JPanel) {                cons.fill = GridBagConstraints.BOTH;                cons.weighty = 1;            } else {	        cons.fill = GridBagConstraints.HORIZONTAL;            }	    cons.weightx = 1;	    container.add((Component) msg, cons);	    cons.weightx = 0;            cons.weighty = 0;	    cons.fill = GridBagConstraints.NONE;	    cons.gridy++;	    if (!internallyCreated) {		hasCustomComponents = true;            }	} else if (msg instanceof Object[]) {	    Object [] msgs = (Object[]) msg;	    for (int i = 0; i < msgs.length; i++) {		addMessageComponents(container, cons, msgs[i], maxll, false);            }	} else if (msg instanceof Icon) {	    JLabel label = new JLabel( (Icon)msg, SwingConstants.CENTER );            configureMessageLabel(label);	    addMessageComponents(container, cons, label, maxll, true);	} else {	    String s = msg.toString();	    int len = s.length();	    if (len <= 0) {		return;            }	    int nl = -1;	    int nll = 0;	    if ((nl = s.indexOf(newline)) >= 0) {		nll = newline.length();	    } else if ((nl = s.indexOf("\r\n")) >= 0) {	        nll = 2;	    } else if ((nl = s.indexOf('\n')) >= 0) {	        nll = 1;	    }	    if (nl >= 0) {		// break up newlines		if (nl == 0) {		    addMessageComponents(container, cons, new Component() {		        public Dimension getPreferredSize() {			    Font       f = getFont();			    			    if (f != null) {				return new Dimension(1, f.getSize() + 2);                            }			    return new Dimension(0, 0);		        }		    }, maxll, true);		} else {		    addMessageComponents(container, cons, s.substring(0, nl),				      maxll, false);                }		addMessageComponents(container, cons, s.substring(nl + nll), maxll,				  false);	    } else if (len > maxll) {		Container c = Box.createVerticalBox();		burstStringInto(c, s, maxll);		addMessageComponents(container, cons, c, maxll, true );	    } else {	        JLabel label;		label = new JLabel( s, JLabel.LEADING );                configureMessageLabel(label);		addMessageComponents(container, cons, label, maxll, true);	    }	}    }    /**     * Returns the message to display from the JOptionPane the receiver is     * providing the look and feel for.     */    protected Object getMessage() {	inputComponent = null;	if (optionPane != null) {	    if (optionPane.getWantsInput()) {		/* Create a user component to capture the input. If the		   selectionValues are non null the component and there		   are < 20 values it'll be a combobox, if non null and		   >= 20, it'll be a list, otherwise it'll be a textfield. */		Object             message = optionPane.getMessage();

⌨️ 快捷键说明

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