2603 lines · 107.5 KB · Java
RawDownload
/* * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.  Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package javax.swing; import java.awt.BorderLayout;import java.awt.Component;import java.awt.Container;import java.awt.Dialog;import java.awt.Dimension;import java.awt.KeyboardFocusManager;import java.awt.Frame;import java.awt.Point;import java.awt.HeadlessException;import java.awt.Toolkit;import java.awt.Window;import java.beans.PropertyChangeEvent;import java.beans.PropertyChangeListener;import java.awt.event.WindowListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.awt.event.ComponentAdapter;import java.awt.event.ComponentEvent;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;import java.lang.reflect.Method;import java.lang.reflect.InvocationTargetException;import java.security.AccessController;import java.security.PrivilegedAction;import java.util.Vector;import javax.swing.plaf.OptionPaneUI;import javax.swing.event.InternalFrameEvent;import javax.swing.event.InternalFrameAdapter;import javax.accessibility.*;import static javax.swing.ClientPropertyKey.PopupFactory_FORCE_HEAVYWEIGHT_POPUP; /** * <code>JOptionPane</code> makes it easy to pop up a standard dialog box that * prompts users for a value or informs them of something. * For information about using <code>JOptionPane</code>, see * <a href="http://java.sun.com/docs/books/tutorial/uiswing/components/dialog.html">How to Make Dialogs</a>, * a section in <em>The Java Tutorial</em>. * * <p> * * While the <code>JOptionPane</code> * class may appear complex because of the large number of methods, almost * all uses of this class are one-line calls to one of the static * <code>showXxxDialog</code> methods shown below: * <blockquote> * * * <table border=1 summary="Common JOptionPane method names and their descriptions"> * <tr> *    <th>Method Name</th> *    <th>Description</th> * </tr> * <tr> *    <td>showConfirmDialog</td> *    <td>Asks a confirming question, like yes/no/cancel.</td> * </tr> * <tr> *    <td>showInputDialog</td> *    <td>Prompt for some input.</td> * </tr> * <tr> *   <td>showMessageDialog</td> *   <td>Tell the user about something that has happened.</td> * </tr> * <tr> *   <td>showOptionDialog</td> *   <td>The Grand Unification of the above three.</td> * </tr> * </table> * * </blockquote> * Each of these methods also comes in a <code>showInternalXXX</code> * flavor, which uses an internal frame to hold the dialog box (see * {@link JInternalFrame}). * Multiple convenience methods have also been defined -- overloaded * versions of the basic methods that use different parameter lists. * <p> * All dialogs are modal. Each <code>showXxxDialog</code> method blocks * the caller until the user's interaction is complete. * <p> * * <table cellspacing=6 cellpadding=4 border=0 align=right summary="layout"> * <tr> *  <td bgcolor=#FFe0d0 rowspan=2>icon</td> *  <td bgcolor=#FFe0d0>message</td> * </tr> * <tr> *  <td bgcolor=#FFe0d0>input value</td> * </tr> * <tr> *   <td bgcolor=#FFe0d0 colspan=2>option buttons</td> * </tr> * </table> * * The basic appearance of one of these dialog boxes is generally * similar to the picture at the right, although the various * look-and-feels are * ultimately responsible for the final result.  In particular, the * look-and-feels will adjust the layout to accommodate the option pane's * <code>ComponentOrientation</code> property. * <br clear=all> * <p> * <b>Parameters:</b><br> * The parameters to these methods follow consistent patterns: * <blockquote> * <dl compact> * <dt>parentComponent<dd> * Defines the <code>Component</code> that is to be the parent of this * dialog box. * It is used in two ways: the <code>Frame</code> that contains * it is used as the <code>Frame</code> * parent for the dialog box, and its screen coordinates are used in * the placement of the dialog box. In general, the dialog box is placed * just below the component. This parameter may be <code>null</code>, * in which case a default <code>Frame</code> is used as the parent, * and the dialog will be * centered on the screen (depending on the L&F). * <dt><a name=message>message</a><dd> * A descriptive message to be placed in the dialog box. * In the most common usage, message is just a <code>String</code> or * <code>String</code> constant. * However, the type of this parameter is actually <code>Object</code>. Its * interpretation depends on its type: * <dl compact> * <dt>Object[]<dd>An array of objects is interpreted as a series of *                 messages (one per object) arranged in a vertical stack. *                 The interpretation is recursive -- each object in the *                 array is interpreted according to its type. * <dt>Component<dd>The <code>Component</code> is displayed in the dialog. * <dt>Icon<dd>The <code>Icon</code> is wrapped in a <code>JLabel</code> *               and displayed in the dialog. * <dt>others<dd>The object is converted to a <code>String</code> by calling *               its <code>toString</code> method. The result is wrapped in a *               <code>JLabel</code> and displayed. * </dl> * <dt>messageType<dd>Defines the style of the message. The Look and Feel * manager may lay out the dialog differently depending on this value, and * will often provide a default icon. The possible values are: * <ul> * <li><code>ERROR_MESSAGE</code> * <li><code>INFORMATION_MESSAGE</code> * <li><code>WARNING_MESSAGE</code> * <li><code>QUESTION_MESSAGE</code> * <li><code>PLAIN_MESSAGE</code> * </ul> * <dt>optionType<dd>Defines the set of option buttons that appear at * the bottom of the dialog box: * <ul> * <li><code>DEFAULT_OPTION</code> * <li><code>YES_NO_OPTION</code> * <li><code>YES_NO_CANCEL_OPTION</code> * <li><code>OK_CANCEL_OPTION</code> * </ul> * You aren't limited to this set of option buttons.  You can provide any * buttons you want using the options parameter. * <dt>options<dd>A more detailed description of the set of option buttons * that will appear at the bottom of the dialog box. * The usual value for the options parameter is an array of * <code>String</code>s. But * the parameter type is an array of <code>Objects</code>. * A button is created for each object depending on its type: * <dl compact> * <dt>Component<dd>The component is added to the button row directly. * <dt>Icon<dd>A <code>JButton</code> is created with this as its label. * <dt>other<dd>The <code>Object</code> is converted to a string using its *              <code>toString</code> method and the result is used to *              label a <code>JButton</code>. * </dl> * <dt>icon<dd>A decorative icon to be placed in the dialog box. A default * value for this is determined by the <code>messageType</code> parameter. * <dt>title<dd>The title for the dialog box. * <dt>initialValue<dd>The default selection (input value). * </dl> * </blockquote> * <p> * When the selection is changed, <code>setValue</code> is invoked, * which generates a <code>PropertyChangeEvent</code>. * <p> * If a <code>JOptionPane</code> has configured to all input * <code>setWantsInput</code> * the bound property <code>JOptionPane.INPUT_VALUE_PROPERTY</code> *  can also be listened * to, to determine when the user has input or selected a value. * <p> * When one of the <code>showXxxDialog</code> methods returns an integer, * the possible values are: * <ul> * <li><code>YES_OPTION</code> * <li><code>NO_OPTION</code> * <li><code>CANCEL_OPTION</code> * <li><code>OK_OPTION</code> * <li><code>CLOSED_OPTION</code> * </ul> * <b>Examples:</b> * <dl> * <dt>Show an error dialog that displays the message, 'alert': * <dd><code> * JOptionPane.showMessageDialog(null, "alert", "alert", JOptionPane.ERROR_MESSAGE); * </code><p> * <dt>Show an internal information dialog with the message, 'information': * <dd><code> * JOptionPane.showInternalMessageDialog(frame, "information",<br> *             <ul><ul>"information", JOptionPane.INFORMATION_MESSAGE);</ul></ul> * </code><p> * <dt>Show an information panel with the options yes/no and message 'choose one': * <dd><code>JOptionPane.showConfirmDialog(null, *             <ul><ul>"choose one", "choose one", JOptionPane.YES_NO_OPTION);</ul></ul> * </code><p> * <dt>Show an internal information dialog with the options yes/no/cancel and * message 'please choose one' and title information: * <dd><code>JOptionPane.showInternalConfirmDialog(frame, *             <ul><ul>"please choose one", "information",</ul></ul> *             <ul><ul>JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE);</ul></ul> * </code><p> * <dt>Show a warning dialog with the options OK, CANCEL, title 'Warning', and * message 'Click OK to continue': * <dd><code> * Object[] options = { "OK", "CANCEL" };<br> * JOptionPane.showOptionDialog(null, "Click OK to continue", "Warning", *             <ul><ul>JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE,</ul></ul> *             <ul><ul>null, options, options[0]);</ul></ul> * </code><p> * <dt>Show a dialog asking the user to type in a String: * <dd><code> * String inputValue = JOptionPane.showInputDialog("Please input a value"); * </code><p> * <dt>Show a dialog asking the user to select a String: * <dd><code> * Object[] possibleValues = { "First", "Second", "Third" };<br> * Object selectedValue = JOptionPane.showInputDialog(null, *             <ul><ul>"Choose one", "Input",</ul></ul> *             <ul><ul>JOptionPane.INFORMATION_MESSAGE, null,</ul></ul> *             <ul><ul>possibleValues, possibleValues[0]);</ul></ul> * </code><p> * </dl> * <b>Direct Use:</b><br> * To create and use an <code>JOptionPane</code> directly, the * standard pattern is roughly as follows: * <pre> *     JOptionPane pane = new JOptionPane(<i>arguments</i>); *     pane.set<i>.Xxxx(...); // Configure</i> *     JDialog dialog = pane.createDialog(<i>parentComponent, title</i>); *     dialog.show(); *     Object selectedValue = pane.getValue(); *     if(selectedValue == null) *       return CLOSED_OPTION; *     <i>//If there is <b>not</b> an array of option buttons:</i> *     if(options == null) { *       if(selectedValue instanceof Integer) *          return ((Integer)selectedValue).intValue(); *       return CLOSED_OPTION; *     } *     <i>//If there is an array of option buttons:</i> *     for(int counter = 0, maxCounter = options.length; *        counter < maxCounter; counter++) { *        if(options[counter].equals(selectedValue)) *        return counter; *     } *     return CLOSED_OPTION; * </pre> * <p> * <strong>Warning:</strong> Swing is not thread safe. For more * information see <a * href="package-summary.html#threading">Swing's Threading * Policy</a>. * <p> * <strong>Warning:</strong> * Serialized objects of this class will not be compatible with * future Swing releases. The current serialization support is * appropriate for short term storage or RMI between applications running * the same version of Swing.  As of 1.4, support for long term storage * of all JavaBeans<sup><font size="-2">TM</font></sup> * has been added to the <code>java.beans</code> package. * Please see {@link java.beans.XMLEncoder}. * * @see JInternalFrame * * @beaninfo *      attribute: isContainer true *    description: A component which implements standard dialog box controls. * * @author James Gosling * @author Scott Violet */public class JOptionPane extends JComponent implements Accessible{    /**     * @see #getUIClassID     * @see #readObject     */    private static final String uiClassID = "OptionPaneUI";     /**     * Indicates that the user has not yet selected a value.     */    public static final Object      UNINITIALIZED_VALUE = "uninitializedValue";     //    // Option types    //     /**     * Type meaning Look and Feel should not supply any options -- only     * use the options from the <code>JOptionPane</code>.     */    public static final int         DEFAULT_OPTION = -1;    /** Type used for <code>showConfirmDialog</code>. */    public static final int         YES_NO_OPTION = 0;    /** Type used for <code>showConfirmDialog</code>. */    public static final int         YES_NO_CANCEL_OPTION = 1;    /** Type used for <code>showConfirmDialog</code>. */    public static final int         OK_CANCEL_OPTION = 2;     //    // Return values.    //    /** Return value from class method if YES is chosen. */    public static final int         YES_OPTION = 0;    /** Return value from class method if NO is chosen. */    public static final int         NO_OPTION = 1;    /** Return value from class method if CANCEL is chosen. */    public static final int         CANCEL_OPTION = 2;    /** Return value form class method if OK is chosen. */    public static final int         OK_OPTION = 0;    /** Return value from class method if user closes window without selecting     * anything, more than likely this should be treated as either a     * <code>CANCEL_OPTION</code> or <code>NO_OPTION</code>. */    public static final int         CLOSED_OPTION = -1;     //    // Message types. Used by the UI to determine what icon to display,    // and possibly what behavior to give based on the type.    //    /** Used for error messages. */    public static final int  ERROR_MESSAGE = 0;    /** Used for information messages. */    public static final int  INFORMATION_MESSAGE = 1;    /** Used for warning messages. */    public static final int  WARNING_MESSAGE = 2;    /** Used for questions. */    public static final int  QUESTION_MESSAGE = 3;    /** No icon is used. */    public static final int   PLAIN_MESSAGE = -1;     /** Bound property name for <code>icon</code>. */    public static final String      ICON_PROPERTY = "icon";    /** Bound property name for <code>message</code>. */    public static final String      MESSAGE_PROPERTY = "message";    /** Bound property name for <code>value</code>. */    public static final String      VALUE_PROPERTY = "value";    /** Bound property name for <code>option</code>. */    public static final String      OPTIONS_PROPERTY = "options";    /** Bound property name for <code>initialValue</code>. */    public static final String      INITIAL_VALUE_PROPERTY = "initialValue";    /** Bound property name for <code>type</code>. */    public static final String      MESSAGE_TYPE_PROPERTY = "messageType";    /** Bound property name for <code>optionType</code>. */    public static final String      OPTION_TYPE_PROPERTY = "optionType";    /** Bound property name for <code>selectionValues</code>. */    public static final String      SELECTION_VALUES_PROPERTY = "selectionValues";    /** Bound property name for <code>initialSelectionValue</code>. */    public static final String      INITIAL_SELECTION_VALUE_PROPERTY = "initialSelectionValue";    /** Bound property name for <code>inputValue</code>. */    public static final String      INPUT_VALUE_PROPERTY = "inputValue";    /** Bound property name for <code>wantsInput</code>. */    public static final String      WANTS_INPUT_PROPERTY = "wantsInput";     /** Icon used in pane. */    transient protected Icon                  icon;    /** Message to display. */    transient protected Object                message;    /** Options to display to the user. */    transient protected Object[]              options;    /** Value that should be initially selected in <code>options</code>. */    transient protected Object                initialValue;    /** Message type. */    protected int                   messageType;    /**     * Option type, one of <code>DEFAULT_OPTION</code>,     * <code>YES_NO_OPTION</code>,     * <code>YES_NO_CANCEL_OPTION</code> or     * <code>OK_CANCEL_OPTION</code>.     */    protected int                   optionType;    /** Currently selected value, will be a valid option, or     * <code>UNINITIALIZED_VALUE</code> or <code>null</code>. */    transient protected Object                value;    /** Array of values the user can choose from. Look and feel will     * provide the UI component to choose this from. */    protected transient Object[]              selectionValues;    /** Value the user has input. */    protected transient Object                inputValue;    /** Initial value to select in <code>selectionValues</code>. */    protected transient Object                initialSelectionValue;    /** If true, a UI widget will be provided to the user to get input. */    protected boolean                         wantsInput;      /**     * Shows a question-message dialog requesting input from the user. The     * dialog uses the default frame, which usually means it is centered on     * the screen.     *     * @param message the <code>Object</code> to display     * @exception HeadlessException if     *   <code>GraphicsEnvironment.isHeadless</code> returns     *   <code>true</code>     * @see java.awt.GraphicsEnvironment#isHeadless     */    public static String showInputDialog(Object message)        throws HeadlessException {        return showInputDialog(null, message);    }     /**     * Shows a question-message dialog requesting input from the user, with     * the input value initialized to <code>initialSelectionValue</code>. The     * dialog uses the default frame, which usually means it is centered on     * the screen.     *     * @param message the <code>Object</code> to display     * @param initialSelectionValue the value used to initialize the input     *                 field     * @since 1.4     */    public static String showInputDialog(Object message, Object initialSelectionValue) {        return showInputDialog(null, message, initialSelectionValue);    }     /**     * Shows a question-message dialog requesting input from the user     * parented to <code>parentComponent</code>.     * The dialog is displayed on top of the <code>Component</code>'s     * frame, and is usually positioned below the <code>Component</code>.     *     * @param parentComponent  the parent <code>Component</code> for the     *          dialog     * @param message  the <code>Object</code> to display     * @exception HeadlessException if     *    <code>GraphicsEnvironment.isHeadless</code> returns     *    <code>true</code>     * @see java.awt.GraphicsEnvironment#isHeadless     */    public static String showInputDialog(Component parentComponent,        Object message) throws HeadlessException {        return showInputDialog(parentComponent, message, UIManager.getString(            "OptionPane.inputDialogTitle", parentComponent), QUESTION_MESSAGE);    }     /**     * Shows a question-message dialog requesting input from the user and     * parented to <code>parentComponent</code>. The input value will be     * initialized to <code>initialSelectionValue</code>.     * The dialog is displayed on top of the <code>Component</code>'s     * frame, and is usually positioned below the <code>Component</code>.     *     * @param parentComponent  the parent <code>Component</code> for the     *          dialog     * @param message the <code>Object</code> to display     * @param initialSelectionValue the value used to initialize the input     *                 field     * @since 1.4     */    public static String showInputDialog(Component parentComponent, Object message,                                         Object initialSelectionValue) {        return (String)showInputDialog(parentComponent, message,                      UIManager.getString("OptionPane.inputDialogTitle",                      parentComponent), QUESTION_MESSAGE, null, null,                      initialSelectionValue);    }

Lines 1–500 of 2603.