FileDocCategorySizeDatePackage
CardLayout.javaAPI DocJava SE 6 API20232Tue Jun 10 00:25:12 BST 2008java.awt

CardLayout

public class CardLayout extends Object implements Serializable, LayoutManager2
A CardLayout object is a layout manager for a container. It treats each component in the container as a card. Only one card is visible at a time, and the container acts as a stack of cards. The first component added to a CardLayout object is the visible component when the container is first displayed.

The ordering of cards is determined by the container's own internal ordering of its component objects. CardLayout defines a set of methods that allow an application to flip through these cards sequentially, or to show a specified card. The {@link CardLayout#addLayoutComponent} method can be used to associate a string identifier with a given card for fast random access.

version
1.42 03/28/06
author
Arthur van Hoff
see
java.awt.Container
since
JDK1.0

Fields Summary
private static final long
serialVersionUID
Vector
vector
int
currentCard
int
hgap
int
vgap
private static final ObjectStreamField[]
serialPersistentFields
Constructors Summary
public CardLayout()
Creates a new card layout with gaps of size zero.


                   
      
	this(0, 0);
    
public CardLayout(int hgap, int vgap)
Creates a new card layout with the specified horizontal and vertical gaps. The horizontal gaps are placed at the left and right edges. The vertical gaps are placed at the top and bottom edges.

param
hgap the horizontal gap.
param
vgap the vertical gap.

	this.hgap = hgap;
	this.vgap = vgap;
    
Methods Summary
public voidaddLayoutComponent(java.awt.Component comp, java.lang.Object constraints)
Adds the specified component to this card layout's internal table of names. The object specified by constraints must be a string. The card layout stores this string as a key-value pair that can be used for random access to a particular card. By calling the show method, an application can display the component with the specified name.

param
comp the component to be added.
param
constraints a tag that identifies a particular card in the layout.
see
java.awt.CardLayout#show(java.awt.Container, java.lang.String)
exception
IllegalArgumentException if the constraint is not a string.

      synchronized (comp.getTreeLock()) {
	if (constraints instanceof String) {
	    addLayoutComponent((String)constraints, comp);
	} else {
	    throw new IllegalArgumentException("cannot add to layout: constraint must be a string");
	}
      }
    
public voidaddLayoutComponent(java.lang.String name, java.awt.Component comp)

deprecated
replaced by addLayoutComponent(Component, Object).

        synchronized (comp.getTreeLock()) {
            if (!vector.isEmpty()) {
                comp.setVisible(false);
            }
            for (int i=0; i < vector.size(); i++) {
                if (((Card)vector.get(i)).name.equals(name)) {
                    ((Card)vector.get(i)).comp = comp;
                    return;
                }
            }
            vector.add(new Card(name, comp));
        }
    
voidcheckLayout(java.awt.Container parent)
Make sure that the Container really has a CardLayout installed. Otherwise havoc can ensue!

	if (parent.getLayout() != this) {
	    throw new IllegalArgumentException("wrong parent for CardLayout");
	}
    
public voidfirst(java.awt.Container parent)
Flips to the first card of the container.

param
parent the parent container in which to do the layout
see
java.awt.CardLayout#last

	synchronized (parent.getTreeLock()) {
	    checkLayout(parent);
            int ncomponents = parent.getComponentCount();
            for (int i = 0 ; i < ncomponents ; i++) {
                Component comp = parent.getComponent(i);
                if (comp.isVisible()) {
                    comp.setVisible(false);
                    break;
                }
            }
            if (ncomponents > 0) {
                currentCard = 0;
                parent.getComponent(0).setVisible(true);
                parent.validate();
            }
	}
    
public intgetHgap()
Gets the horizontal gap between components.

return
the horizontal gap between components.
see
java.awt.CardLayout#setHgap(int)
see
java.awt.CardLayout#getVgap()
since
JDK1.1

	return hgap;
    
public floatgetLayoutAlignmentX(java.awt.Container parent)
Returns the alignment along the x axis. This specifies how the component would like to be aligned relative to other components. The value should be a number between 0 and 1 where 0 represents alignment along the origin, 1 is aligned the furthest away from the origin, 0.5 is centered, etc.

	return 0.5f;
    
public floatgetLayoutAlignmentY(java.awt.Container parent)
Returns the alignment along the y axis. This specifies how the component would like to be aligned relative to other components. The value should be a number between 0 and 1 where 0 represents alignment along the origin, 1 is aligned the furthest away from the origin, 0.5 is centered, etc.

	return 0.5f;
    
public intgetVgap()
Gets the vertical gap between components.

return
the vertical gap between components.
see
java.awt.CardLayout#setVgap(int)
see
java.awt.CardLayout#getHgap()

	return vgap;
    
public voidinvalidateLayout(java.awt.Container target)
Invalidates the layout, indicating that if the layout manager has cached information it should be discarded.

    
public voidlast(java.awt.Container parent)
Flips to the last card of the container.

param
parent the parent container in which to do the layout
see
java.awt.CardLayout#first

	synchronized (parent.getTreeLock()) {
	    checkLayout(parent);
            int ncomponents = parent.getComponentCount();
            for (int i = 0 ; i < ncomponents ; i++) {
                Component comp = parent.getComponent(i);
                if (comp.isVisible()) {
                    comp.setVisible(false);
                    break;
                }
            }
            if (ncomponents > 0) {
                currentCard = ncomponents - 1;
                parent.getComponent(currentCard).setVisible(true);
                parent.validate();
            }
	}
    
public voidlayoutContainer(java.awt.Container parent)
Lays out the specified container using this card layout.

Each component in the parent container is reshaped to be the size of the container, minus space for surrounding insets, horizontal gaps, and vertical gaps.

param
parent the parent container in which to do the layout
see
java.awt.Container#doLayout

        synchronized (parent.getTreeLock()) {
            Insets insets = parent.getInsets();
            int ncomponents = parent.getComponentCount();
            Component comp = null;
            boolean currentFound = false;

            for (int i = 0 ; i < ncomponents ; i++) {
                comp = parent.getComponent(i);
                comp.setBounds(hgap + insets.left, vgap + insets.top,
                               parent.width - (hgap*2 + insets.left + insets.right),
                               parent.height - (vgap*2 + insets.top + insets.bottom));
                if (comp.isVisible()) {
                    currentFound = true;
                }
            }

            if (!currentFound && ncomponents > 0) {
                parent.getComponent(0).setVisible(true);
            }
        }
    
public java.awt.DimensionmaximumLayoutSize(java.awt.Container target)
Returns the maximum dimensions for this layout given the components in the specified target container.

param
target the component which needs to be laid out
see
Container
see
#minimumLayoutSize
see
#preferredLayoutSize

	return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE);
    
public java.awt.DimensionminimumLayoutSize(java.awt.Container parent)
Calculates the minimum size for the specified panel.

param
parent the parent container in which to do the layout
return
the minimum dimensions required to lay out the subcomponents of the specified container
see
java.awt.Container#doLayout
see
java.awt.CardLayout#preferredLayoutSize

        synchronized (parent.getTreeLock()) {
            Insets insets = parent.getInsets();
            int ncomponents = parent.getComponentCount();
            int w = 0;
            int h = 0;

            for (int i = 0 ; i < ncomponents ; i++) {
                Component comp = parent.getComponent(i);
                Dimension d = comp.getMinimumSize();
                if (d.width > w) {
                    w = d.width;
                }
                if (d.height > h) {
                    h = d.height;
                }
            }
            return new Dimension(insets.left + insets.right + w + hgap*2,
                                 insets.top + insets.bottom + h + vgap*2);
        }
    
public voidnext(java.awt.Container parent)
Flips to the next card of the specified container. If the currently visible card is the last one, this method flips to the first card in the layout.

param
parent the parent container in which to do the layout
see
java.awt.CardLayout#previous

	synchronized (parent.getTreeLock()) {
	    checkLayout(parent);
            int ncomponents = parent.getComponentCount();
            for (int i = 0 ; i < ncomponents ; i++) {
                Component comp = parent.getComponent(i);
                if (comp.isVisible()) {
                    comp.setVisible(false);
                    currentCard = (i + 1) % ncomponents;
                    comp = parent.getComponent(currentCard);
                    comp.setVisible(true);
                    parent.validate();
                    return;
                }
            }
            showDefaultComponent(parent);
	}
    
public java.awt.DimensionpreferredLayoutSize(java.awt.Container parent)
Determines the preferred size of the container argument using this card layout.

param
parent the parent container in which to do the layout
return
the preferred dimensions to lay out the subcomponents of the specified container
see
java.awt.Container#getPreferredSize
see
java.awt.CardLayout#minimumLayoutSize

        synchronized (parent.getTreeLock()) {
            Insets insets = parent.getInsets();
            int ncomponents = parent.getComponentCount();
            int w = 0;
            int h = 0;

            for (int i = 0 ; i < ncomponents ; i++) {
                Component comp = parent.getComponent(i);
                Dimension d = comp.getPreferredSize();
                if (d.width > w) {
                    w = d.width;
                }
                if (d.height > h) {
                    h = d.height;
                }
            }
            return new Dimension(insets.left + insets.right + w + hgap*2,
                                 insets.top + insets.bottom + h + vgap*2);
        }
    
public voidprevious(java.awt.Container parent)
Flips to the previous card of the specified container. If the currently visible card is the first one, this method flips to the last card in the layout.

param
parent the parent container in which to do the layout
see
java.awt.CardLayout#next

	synchronized (parent.getTreeLock()) {
	    checkLayout(parent);
            int ncomponents = parent.getComponentCount();
            for (int i = 0 ; i < ncomponents ; i++) {
                Component comp = parent.getComponent(i);
                if (comp.isVisible()) {
                    comp.setVisible(false);
                    currentCard = ((i > 0) ? i-1 : ncomponents-1);
                    comp = parent.getComponent(currentCard);
                    comp.setVisible(true);
                    parent.validate();
                    return;
                }
            }
            showDefaultComponent(parent);
	}
    
private voidreadObject(java.io.ObjectInputStream s)
Reads serializable fields from stream.

        ObjectInputStream.GetField f = s.readFields();

        hgap = f.get("hgap", 0);
        vgap = f.get("vgap", 0);

        if (f.defaulted("vector")) { 
            //  pre-1.4 stream
            Hashtable tab = (Hashtable)f.get("tab", null);
            vector = new Vector();
            if (tab != null && !tab.isEmpty()) {
                for (Enumeration e = tab.keys() ; e.hasMoreElements() ; ) {
                    String key = (String)e.nextElement();
                    Component comp = (Component)tab.get(key);
                    vector.add(new Card(key, comp));
                    if (comp.isVisible()) {
                        currentCard = vector.size() - 1;
                    }
                }
            }
        } else {
            vector = (Vector)f.get("vector", null);
            currentCard = f.get("currentCard", 0);
        }
    
public voidremoveLayoutComponent(java.awt.Component comp)
Removes the specified component from the layout. If the card was visible on top, the next card underneath it is shown.

param
comp the component to be removed.
see
java.awt.Container#remove(java.awt.Component)
see
java.awt.Container#removeAll()

        synchronized (comp.getTreeLock()) {
            for (int i = 0; i < vector.size(); i++) {
                if (((Card)vector.get(i)).comp == comp) { 
                    // if we remove current component we should show next one
                    if (comp.isVisible() && (comp.getParent() != null)) {
                        next(comp.getParent());
                    }

                    vector.remove(i);

                    // correct currentCard if this is necessary
                    if (currentCard > i) {
                        currentCard--;
                    }
                    break;
                }
            }
        }
    
public voidsetHgap(int hgap)
Sets the horizontal gap between components.

param
hgap the horizontal gap between components.
see
java.awt.CardLayout#getHgap()
see
java.awt.CardLayout#setVgap(int)
since
JDK1.1

	this.hgap = hgap;
    
public voidsetVgap(int vgap)
Sets the vertical gap between components.

param
vgap the vertical gap between components.
see
java.awt.CardLayout#getVgap()
see
java.awt.CardLayout#setHgap(int)
since
JDK1.1

	this.vgap = vgap;
    
public voidshow(java.awt.Container parent, java.lang.String name)
Flips to the component that was added to this layout with the specified name, using addLayoutComponent. If no such component exists, then nothing happens.

param
parent the parent container in which to do the layout
param
name the component name
see
java.awt.CardLayout#addLayoutComponent(java.awt.Component, java.lang.Object)

	synchronized (parent.getTreeLock()) {
	    checkLayout(parent);
            Component next = null;
            int ncomponents = vector.size();
            for (int i = 0; i < ncomponents; i++) {
                Card card = (Card)vector.get(i);
                if (card.name.equals(name)) {
                    next = card.comp;
                    currentCard = i;
                    break;
                }
            }
            if ((next != null) && !next.isVisible()) {
                ncomponents = parent.getComponentCount();
                for (int i = 0; i < ncomponents; i++) {
                    Component comp = parent.getComponent(i);
                    if (comp.isVisible()) {
                        comp.setVisible(false);
                        break;
                    }
                }
                next.setVisible(true);
                parent.validate();
            }
	}
    
voidshowDefaultComponent(java.awt.Container parent)

        if (parent.getComponentCount() > 0) {
            currentCard = 0;
            parent.getComponent(0).setVisible(true);
            parent.validate();
        }
    
public java.lang.StringtoString()
Returns a string representation of the state of this card layout.

return
a string representation of this card layout.

	return getClass().getName() + "[hgap=" + hgap + ",vgap=" + vgap + "]";
    
private voidwriteObject(java.io.ObjectOutputStream s)
Writes serializable fields to stream.

        Hashtable tab = new Hashtable();
        int ncomponents = vector.size();
        for (int i = 0; i < ncomponents; i++) {
            Card card = (Card)vector.get(i);
            tab.put(card.name, card.comp);
        }

        ObjectOutputStream.PutField f = s.putFields();
        f.put("hgap", hgap);
        f.put("vgap", vgap);
        f.put("vector", vector);
        f.put("currentCard", currentCard);
        f.put("tab", tab);
        s.writeFields();