217 lines · 9.2 KB · Java
RawDownload
/* * Copyright (c) 2005, 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.Container;import javax.swing.plaf.ComponentUI;import sun.awt.AppContext; /** * <code>LayoutStyle</code> provides information about how to position * components.  This class is primarily useful for visual tools and * layout managers.  Most developers will not need to use this class. * <p> * You typically don't set or create a * <code>LayoutStyle</code>.  Instead use the static method * <code>getInstance</code> to obtain the current instance. * * @since 1.6 */public abstract class LayoutStyle {    /**     * Sets the shared instance of <code>LayoutStyle</code>.  Specifying     * <code>null</code> results in using the <code>LayoutStyle</code> from     * the current <code>LookAndFeel</code>.     *     * @param style the <code>LayoutStyle</code>, or <code>null</code>     * @see #getInstance     */    public static void setInstance(LayoutStyle style) {        synchronized(LayoutStyle.class) {            if (style == null) {                AppContext.getAppContext().remove(LayoutStyle.class);            }            else {                AppContext.getAppContext().put(LayoutStyle.class, style);            }        }    }     /**     * Returns the shared instance of <code>LayoutStyle</code>.  If an instance     * has not been specified in <code>setInstance</code>, this will return     * the <code>LayoutStyle</code> from the current <code>LookAndFeel</code>.     *     * @see LookAndFeel#getLayoutStyle     * @return the shared instance of <code>LayoutStyle</code>     */    public static LayoutStyle getInstance() {        LayoutStyle style;        synchronized(LayoutStyle.class) {            style = (LayoutStyle)AppContext.getAppContext().                    get(LayoutStyle.class);        }        if (style == null) {            return UIManager.getLookAndFeel().getLayoutStyle();        }        return style;    }      /**     * <code>ComponentPlacement</code> is an enumeration of the     * possible ways two components can be placed relative to each     * other.  <code>ComponentPlacement</code> is used by the     * <code>LayoutStyle</code> method <code>getPreferredGap</code>.  Refer to     * <code>LayoutStyle</code> for more information.     *     * @see LayoutStyle#getPreferredGap(JComponent,JComponent,     *      ComponentPlacement,int,Container)     * @since 1.6     */    public enum ComponentPlacement {        /**         * Enumeration value indicating the two components are         * visually related and will be placed in the same parent.         * For example, a <code>JLabel</code> providing a label for a         * <code>JTextField</code> is typically visually associated         * with the <code>JTextField</code>; the constant <code>RELATED</code>         * is used for this.         */        RELATED,         /**         * Enumeration value indicating the two components are         * visually unrelated and will be placed in the same parent.         * For example, groupings of components are usually visually         * separated; the constant <code>UNRELATED</code> is used for this.         */        UNRELATED,         /**         * Enumeration value indicating the distance to indent a component         * is being requested.  For example, often times the children of         * a label will be horizontally indented from the label.  To determine         * the preferred distance for such a gap use the         * <code>INDENT</code> type.         * <p>         * This value is typically only useful with a direction of         * <code>EAST</code> or <code>WEST</code>.         */        INDENT;    }      /**     * Creates a new <code>LayoutStyle</code>.  You generally don't     * create a <code>LayoutStyle</code>.  Instead use the method     * <code>getInstance</code> to obtain the current     * <code>LayoutStyle</code>.     */    public LayoutStyle() {    }     /**     * Returns the amount of space to use between two components.     * The return value indicates the distance to place     * <code>component2</code> relative to <code>component1</code>.     * For example, the following returns the amount of space to place     * between <code>component2</code> and <code>component1</code>     * when <code>component2</code> is placed vertically above     * <code>component1</code>:     * <pre>     *   int gap = getPreferredGap(component1, component2,     *                             ComponentPlacement.RELATED,     *                             SwingConstants.NORTH, parent);     * </pre>     * The <code>type</code> parameter indicates the relation between     * the two components.  If the two components will be contained in     * the same parent and are showing similar logically related     * items, use <code>RELATED</code>.  If the two components will be     * contained in the same parent but show logically unrelated items     * use <code>UNRELATED</code>.  Some look and feels may not     * distinguish between the <code>RELATED</code> and     * <code>UNRELATED</code> types.     * <p>     * The return value is not intended to take into account the     * current size and position of <code>component2</code> or     * <code>component1</code>.  The return value may take into     * consideration various properties of the components.  For     * example, the space may vary based on font size, or the preferred     * size of the component.     *     * @param component1 the <code>JComponent</code>     *               <code>component2</code> is being placed relative to     * @param component2 the <code>JComponent</code> being placed     * @param position the position <code>component2</code> is being placed     *        relative to <code>component1</code>; one of     *        <code>SwingConstants.NORTH</code>,     *        <code>SwingConstants.SOUTH</code>,     *        <code>SwingConstants.EAST</code> or     *        <code>SwingConstants.WEST</code>     * @param type how the two components are being placed     * @param parent the parent of <code>component2</code>; this may differ     *        from the actual parent and it may be <code>null</code>     * @return the amount of space to place between the two components     * @throws NullPointerException if <code>component1</code>,     *         <code>component2</code> or <code>type</code> is     *         <code>null</code>     * @throws IllegalArgumentException if <code>position</code> is not     *         one of <code>SwingConstants.NORTH</code>,     *         <code>SwingConstants.SOUTH</code>,     *         <code>SwingConstants.EAST</code> or     *         <code>SwingConstants.WEST</code>     * @see LookAndFeel#getLayoutStyle     * @since 1.6     */    public abstract int getPreferredGap(JComponent component1,                                        JComponent component2,                                        ComponentPlacement type, int position,                                        Container parent);     /**     * Returns the amount of space to place between the component and specified     * edge of its parent.     *     * @param component the <code>JComponent</code> being positioned     * @param position the position <code>component</code> is being placed     *        relative to its parent; one of     *        <code>SwingConstants.NORTH</code>,     *        <code>SwingConstants.SOUTH</code>,     *        <code>SwingConstants.EAST</code> or     *        <code>SwingConstants.WEST</code>     * @param parent the parent of <code>component</code>; this may differ     *        from the actual parent and may be <code>null</code>     * @return the amount of space to place between the component and specified     *         edge     * @throws IllegalArgumentException if <code>position</code> is not     *         one of <code>SwingConstants.NORTH</code>,     *         <code>SwingConstants.SOUTH</code>,     *         <code>SwingConstants.EAST</code> or     *         <code>SwingConstants.WEST</code>     */    public abstract int getContainerGap(JComponent component, int position,                                        Container parent);}