JLayeredPane adds depth to a JFC/Swing container, allowing components to overlap
each other when needed. An Integer object specifies each component's depth in the
container, where higher-numbered components sit "on top" of other
For task-oriented documentation and examples of using layered panes see
How to Use a Layered Pane,
a section in The Java Tutorial.
For convenience, JLayeredPane divides the depth-range into several different
layers. Putting a component into one of those layers makes it easy to ensure
that components overlap properly, without having to worry about specifying
numbers for specific depths:
The standard layer, where most components go. This the bottommost
The palette layer sits over the default layer. Useful for floating
toolbars and palettes, so they can be positioned above other components.
The layer used for modal dialogs. They will appear on top of any
toolbars, palettes, or standard components in the container.
The popup layer displays above dialogs. That way, the popup windows
associated with combo boxes, tooltips, and other help text will appear
above the component, palette, or dialog that generated them.
When dragging a component, reassigning it to the drag layer ensures
that it is positioned over every other component in the container. When
finished dragging, it can be reassigned to its normal layer.
The JLayeredPane methods moveToFront(Component),
moveToBack(Component) and setPosition can be used
to reposition a component within its layer. The setLayer method
can also be used to change the component's current layer.
JLayeredPane manages it's list of children like Container, but
allows for the definition of a several layers within itself. Children
in the same layer are managed exactly like the normal Container object,
with the added feature that when children components overlap, children
in higher layers display above the children in lower layers.
Each layer is a distinct integer number. The layer attribute can be set
on a Component by passing an Integer object during the add call.
layeredPane.add(child, new Integer(10));
The layer attribute can also be set on a Component by calling
on the JLayeredPane that is the parent of component. The layer
should be set before adding the child to the parent.
Higher number layers display above lower number layers. So, using
numbers for the layers and letters for individual components, a
representative list order would look like this:
5a, 5b, 5c, 2a, 2b, 2c, 1a
where the leftmost components are closest to the top of the display.
A component can be moved to the top or bottom position within its
layer by calling moveToFront or moveToBack.
The position of a component within a layer can also be specified directly.
Valid positions range from 0 up to one less than the number of
components in that layer. A value of -1 indicates the bottommost
position. A value of 0 indicates the topmost position. Unlike layer
numbers, higher position values are lower in the display.
Note: This sequence (defined by java.awt.Container) is the reverse
of the layer numbering sequence. Usually though, you will use moveToFront,
moveToBack, and setLayer.
Here are some examples using the method add(Component, layer, position):
Calling add(5x, 5, -1) results in:
5a, 5b, 5c, 5x, 2a, 2b, 2c, 1a
Calling add(5z, 5, 2) results in:
5a, 5b, 5z, 5c, 5x, 2a, 2b, 2c, 1a
Calling add(3a, 3, 7) results in:
5a, 5b, 5z, 5c, 5x, 3a, 2a, 2b, 2c, 1a
Using normal paint/event mechanics results in 1a appearing at the bottom
and 5a being above all other components.
Note: that these layers are simply a logical construct and LayoutManagers
will affect all child components of this container without regard for
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. A future release of Swing will provide support for
long term persistence.
Adds the specified component to this container at the specified
index. This method also notifies the layout manager to add
the component to this container's layout using the specified
This is the method to override if a program needs to track
every add request to a container. An overriding method should
usually include a call to the superclass's version of the method:
public static void putLayer(JComponent c,
Sets the layer property on a JComponent. This method does not cause
any side effects like setLayer() (painting, add/remove, etc).
Normally you should use the instance method setLayer(), in order to
get the desired side-effects (like repainting).
Convenience method that returns the first JLayeredPane which
contains the specified component. Note that all JFrames have a
JLayeredPane at their root, so any component in a JFrame will
have a JLayeredPane parent.
c - the Component to check
the JLayeredPane that contains the component, or
null if no JLayeredPane is found in the component
Returns the index of the specified Component.
This is the absolute index, ignoring layers.
Index numbers, like position numbers, have the topmost component
at index zero. Larger numbers are closer to the bottom.
public void setPosition(Component c,
Moves the component to position within it's current layer,
where 0 is the topmost position within the layer and -1 is the bottommost
Note: Position numbering is defined by java.awt.Container, and
is the opposite of layer numbering. Lower position numbers are closer
to the top (0 is topmost), and higher position numbers are closer to
c - the Component to move
position - an int in the range -1..N-1, where N is the number of
components in the component's current layer
Returns a string representation of this JLayeredPane. This method
is intended to be used only for debugging purposes, and the
content and format of the returned string may vary between
implementations. The returned string may be empty but may not
Gets the AccessibleContext associated with this JLayeredPane.
For layered panes, the AccessibleContext takes the form of an
A new AccessibleJLayeredPane instance is created if necessary.
Java, Java 2D, and JDBC are trademarks or registered trademarks of Sun Microsystems, Inc. in the US and other countries. Copyright 1993-2001 Sun Microsystems, Inc. 901 San Antonio Road Palo Alto, California, 94303, U.S.A. All Rights Reserved.