jueves, 9 de diciembre de 2010

/*
 * ListasycombosView.java
 */


package listasycombos;


import java.awt.Color;
import java.awt.event.ItemEvent;
import org.jdesktop.application.Action;
import org.jdesktop.application.ResourceMap;
import org.jdesktop.application.SingleFrameApplication;
import org.jdesktop.application.FrameView;
import org.jdesktop.application.TaskMonitor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JFrame;




/**
 * The application's main frame.
 */
public class ListasycombosView extends FrameView {


    //IMAGENES
    private String ima[] = { "calamardo,.jpg", "pokemon.png", "avatar.png", "catdog.gif",
                             "calamardo 45.jpg", "rocko.png", "beavers.png"};
    private Icon imagen[] = {new ImageIcon (ima[0]) {}, new ImageIcon (ima[1]),
                                  new ImageIcon (ima[2]), new ImageIcon (ima[3]),
                                  new ImageIcon (ima[4]), new ImageIcon (ima[5]),
                                  new ImageIcon (ima[6])};




 //   private final String ncolores[] = {"Negro", "DeepSkyBlue", "LimeGreen", "Firebrick", "Orange1", "DeepPink1", "DarkOrchid3"};
    private final Color colores[] = {Color.black, new Color(0, 191, 255),
                                        new Color(50, 205, 50), new Color(178, 34, 34),
                                        new Color(255, 165, 0), new Color(255, 20, 147), new Color(154, 50, 205) };


    private String edos[] = { "CAPITAL DEL ESTADO", "PACHUCA", "PUEBLA", "CD. DE MEXICO",
                               "VILLA HERMOSA", "JALAPA"};
    private String ed[] = {new String (edos[0]), new String (edos[1]),
                           new String (edos[2]), new String (edos[3]),
                           new String (edos[4]), new String (edos[5])};


    public ListasycombosView(SingleFrameApplication app) {
        super(app);


        initComponents();


        // status bar initialization - message timeout, idle icon and busy animation, etc
        ResourceMap resourceMap = getResourceMap();
        int messageTimeout = resourceMap.getInteger("StatusBar.messageTimeout");
        messageTimer = new Timer(messageTimeout, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                statusMessageLabel.setText("");
            }
        });
        messageTimer.setRepeats(false);
        int busyAnimationRate = resourceMap.getInteger("StatusBar.busyAnimationRate");
        for (int i = 0; i < busyIcons.length; i++) {
            busyIcons[i] = resourceMap.getIcon("StatusBar.busyIcons[" + i + "]");
        }
        busyIconTimer = new Timer(busyAnimationRate, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                busyIconIndex = (busyIconIndex + 1) % busyIcons.length;
                statusAnimationLabel.setIcon(busyIcons[busyIconIndex]);
            }
        });
        idleIcon = resourceMap.getIcon("StatusBar.idleIcon");
        statusAnimationLabel.setIcon(idleIcon);
        progressBar.setVisible(false);


        // connecting action tasks to status bar via TaskMonitor
        TaskMonitor taskMonitor = new TaskMonitor(getApplication().getContext());
        taskMonitor.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
            public void propertyChange(java.beans.PropertyChangeEvent evt) {
                String propertyName = evt.getPropertyName();
                if ("started".equals(propertyName)) {
                    if (!busyIconTimer.isRunning()) {
                        statusAnimationLabel.setIcon(busyIcons[0]);
                        busyIconIndex = 0;
                        busyIconTimer.start();
                    }
                    progressBar.setVisible(true);
                    progressBar.setIndeterminate(true);
                } else if ("done".equals(propertyName)) {
                    busyIconTimer.stop();
                    statusAnimationLabel.setIcon(idleIcon);
                    progressBar.setVisible(false);
                    progressBar.setValue(0);
                } else if ("message".equals(propertyName)) {
                    String text = (String)(evt.getNewValue());
                    statusMessageLabel.setText((text == null) ? "" : text);
                    messageTimer.restart();
                } else if ("progress".equals(propertyName)) {
                    int value = (Integer)(evt.getNewValue());
                    progressBar.setVisible(true);
                    progressBar.setIndeterminate(false);
                    progressBar.setValue(value);
                }
            }
        });
    }


    @Action
    public void showAboutBox() {
        if (aboutBox == null) {
            JFrame mainFrame = ListasycombosApp.getApplication().getMainFrame();
            aboutBox = new ListasycombosAboutBox(mainFrame);
            aboutBox.setLocationRelativeTo(mainFrame);
        }
        ListasycombosApp.getApplication().show(aboutBox);
    }


    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                        
    private void initComponents() {


        fondo = new javax.swing.JPanel();
        comimi = new javax.swing.JComboBox();
        jScrollPane1 = new javax.swing.JScrollPane();
        lcol = new javax.swing.JList();
        comedo = new javax.swing.JComboBox();
        imi = new javax.swing.JLabel();
        edo = new javax.swing.JLabel();
        menuBar = new javax.swing.JMenuBar();
        javax.swing.JMenu fileMenu = new javax.swing.JMenu();
        javax.swing.JMenuItem exitMenuItem = new javax.swing.JMenuItem();
        javax.swing.JMenu helpMenu = new javax.swing.JMenu();
        javax.swing.JMenuItem aboutMenuItem = new javax.swing.JMenuItem();
        statusPanel = new javax.swing.JPanel();
        javax.swing.JSeparator statusPanelSeparator = new javax.swing.JSeparator();
        statusMessageLabel = new javax.swing.JLabel();
        statusAnimationLabel = new javax.swing.JLabel();
        progressBar = new javax.swing.JProgressBar();


        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(listasycombos.ListasycombosApp.class).getContext().getResourceMap(ListasycombosView.class);
        fondo.setBackground(resourceMap.getColor("fondo.background")); // NOI18N
        fondo.setName("fondo"); // NOI18N


        comimi.setBackground(resourceMap.getColor("comimi.background")); // NOI18N
        comimi.setFont(resourceMap.getFont("comimi.font")); // NOI18N
        comimi.setForeground(resourceMap.getColor("comimi.foreground")); // NOI18N
        comimi.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "muestra", "pokemon.png", "avatar.png", "catdog", "calamardo", "rocko", "castores " }));
        comimi.setName("comimi"); // NOI18N
        comimi.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                comimiItemStateChanged(evt);
            }
        });


        jScrollPane1.setName("jScrollPane1"); // NOI18N


        lcol.setBackground(resourceMap.getColor("lcol.background")); // NOI18N
        lcol.setFont(resourceMap.getFont("lcol.font")); // NOI18N
        lcol.setForeground(resourceMap.getColor("lcol.foreground")); // NOI18N
        lcol.setModel(new javax.swing.AbstractListModel() {
            String[] strings = { "Negro", "Azul", "Verde", "Rojo", "Naranja", "Rosa", "Morado" };
            public int getSize() { return strings.length; }
            public Object getElementAt(int i) { return strings[i]; }
        });
        lcol.setName("lcol"); // NOI18N
        lcol.setSelectionBackground(resourceMap.getColor("lcol.selectionBackground")); // NOI18N
        lcol.setSelectionForeground(resourceMap.getColor("lcol.selectionForeground")); // NOI18N
        lcol.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
            public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
                lcolValueChanged(evt);
            }
        });
        jScrollPane1.setViewportView(lcol);


        comedo.setBackground(resourceMap.getColor("comedo.background")); // NOI18N
        comedo.setFont(resourceMap.getFont("comedo.font")); // NOI18N
        comedo.setForeground(resourceMap.getColor("comedo.foreground")); // NOI18N
        comedo.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "ESTADO DE LA REPUBLICA", "HIDALGO", "PUEBLA", "MEXICO", "TABASCO", "VERACRUZ" }));
        comedo.setName("comedo"); // NOI18N
        comedo.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                comedoItemStateChanged(evt);
            }
        });


        imi.setBackground(resourceMap.getColor("imi.background")); // NOI18N
        imi.setFont(resourceMap.getFont("imi.font")); // NOI18N
        imi.setForeground(resourceMap.getColor("imi.foreground")); // NOI18N
        imi.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        imi.setIcon(resourceMap.getIcon("imi.icon")); // NOI18N
        imi.setText(resourceMap.getString("imi.text")); // NOI18N
        imi.setName("imi"); // NOI18N


        edo.setBackground(resourceMap.getColor("edo.background")); // NOI18N
        edo.setFont(resourceMap.getFont("edo.font")); // NOI18N
        edo.setForeground(resourceMap.getColor("edo.foreground")); // NOI18N
        edo.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        edo.setText(resourceMap.getString("edo.text")); // NOI18N
        edo.setName("edo"); // NOI18N


        org.jdesktop.layout.GroupLayout fondoLayout = new org.jdesktop.layout.GroupLayout(fondo);
        fondo.setLayout(fondoLayout);
        fondoLayout.setHorizontalGroup(
            fondoLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(fondoLayout.createSequentialGroup()
                .add(fondoLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(fondoLayout.createSequentialGroup()
                        .addContainerGap()
                        .add(fondoLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                            .add(fondoLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING, false)
                                .add(org.jdesktop.layout.GroupLayout.LEADING, comimi, 0, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .add(org.jdesktop.layout.GroupLayout.LEADING, comedo, 0, 266, Short.MAX_VALUE))
                            .add(imi, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 422, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                        .add(31, 31, 31)
                        .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 116, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                    .add(fondoLayout.createSequentialGroup()
                        .add(42, 42, 42)
                        .add(edo, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 273, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(140, Short.MAX_VALUE))
        );
        fondoLayout.setVerticalGroup(
            fondoLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(fondoLayout.createSequentialGroup()
                .add(21, 21, 21)
                .add(comimi, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
                .add(comedo, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .add(35, 35, 35)
                .add(imi, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 294, Short.MAX_VALUE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(edo, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 37, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .add(38, 38, 38))
            .add(fondoLayout.createSequentialGroup()
                .add(34, 34, 34)
                .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 139, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(309, Short.MAX_VALUE))
        );


        menuBar.setName("menuBar"); // NOI18N


        fileMenu.setText(resourceMap.getString("fileMenu.text")); // NOI18N
        fileMenu.setName("fileMenu"); // NOI18N


        javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(listasycombos.ListasycombosApp.class).getContext().getActionMap(ListasycombosView.class, this);
        exitMenuItem.setAction(actionMap.get("quit")); // NOI18N
        exitMenuItem.setName("exitMenuItem"); // NOI18N
        fileMenu.add(exitMenuItem);


        menuBar.add(fileMenu);


        helpMenu.setText(resourceMap.getString("helpMenu.text")); // NOI18N
        helpMenu.setName("helpMenu"); // NOI18N


        aboutMenuItem.setAction(actionMap.get("showAboutBox")); // NOI18N
        aboutMenuItem.setName("aboutMenuItem"); // NOI18N
        helpMenu.add(aboutMenuItem);


        menuBar.add(helpMenu);


        statusPanel.setBackground(resourceMap.getColor("statusPanel.background")); // NOI18N
        statusPanel.setName("statusPanel"); // NOI18N


        statusPanelSeparator.setName("statusPanelSeparator"); // NOI18N


        statusMessageLabel.setName("statusMessageLabel"); // NOI18N


        statusAnimationLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
        statusAnimationLabel.setName("statusAnimationLabel"); // NOI18N


        progressBar.setName("progressBar"); // NOI18N


        org.jdesktop.layout.GroupLayout statusPanelLayout = new org.jdesktop.layout.GroupLayout(statusPanel);
        statusPanel.setLayout(statusPanelLayout);
        statusPanelLayout.setHorizontalGroup(
            statusPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(statusPanelSeparator, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 719, Short.MAX_VALUE)
            .add(statusPanelLayout.createSequentialGroup()
                .addContainerGap()
                .add(statusMessageLabel)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 549, Short.MAX_VALUE)
                .add(progressBar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(statusAnimationLabel)
                .addContainerGap())
        );
        statusPanelLayout.setVerticalGroup(
            statusPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(statusPanelLayout.createSequentialGroup()
                .add(statusPanelSeparator, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .add(statusPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(statusMessageLabel)
                    .add(statusAnimationLabel)
                    .add(progressBar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .add(3, 3, 3))
        );


        setComponent(fondo);
        setMenuBar(menuBar);
        setStatusBar(statusPanel);
    }// </editor-fold>                      






    private void comimiItemStateChanged(java.awt.event.ItemEvent evt) {                                      


      if (evt.getStateChange() == java.awt.event.ItemEvent.SELECTED)
            imi.setIcon(imagen[comimi.getSelectedIndex()]);


    }                                    


    private void lcolValueChanged(javax.swing.event.ListSelectionEvent evt) {                                


        fondo.setBackground(colores[lcol.getSelectedIndex()]);


    }                              


    private void comedoItemStateChanged(java.awt.event.ItemEvent evt) {                                      


        if (evt.getStateChange() == java.awt.event.ItemEvent.SELECTED)
            edo.setText(ed[comedo.getSelectedIndex()]);
    }                                    






    // Variables declaration - do not modify                  
    private javax.swing.JComboBox comedo;
    private javax.swing.JComboBox comimi;
    private javax.swing.JLabel edo;
    private javax.swing.JPanel fondo;
    private javax.swing.JLabel imi;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JList lcol;
    private javax.swing.JMenuBar menuBar;
    private javax.swing.JProgressBar progressBar;
    private javax.swing.JLabel statusAnimationLabel;
    private javax.swing.JLabel statusMessageLabel;
    private javax.swing.JPanel statusPanel;
    // End of variables declaration                


    private final Timer messageTimer;
    private final Timer busyIconTimer;
    private final Icon idleIcon;
    private final Icon[] busyIcons = new Icon[15];
    private int busyIconIndex = 0;


    private JDialog aboutBox;
}




miércoles, 27 de octubre de 2010

LAYOUTS (ADMINISTRADORES DE ESQUEMAS)

LAYOUTS
Los layout managers o manejadores de composición, en traducción literal, ayudan a adaptar los diversos Componentes que se desean incorporar a un Panel, es decir, especifican la apariencia que tendrán los Componentes a la hora de colocarlos sobre un Contenedor.
¿Por qué Java proporciona estos esquemas predefinidos de disposición de componentes? La razón es simple: imaginemos que deseamos agrupar objetos de distinto tamaño en celdas de una rejilla virtual: si confiados en nuestro conocimiento de un sistema gráfico determinado, codificamos a mano tal disposición, deberemos preveer el redimensionamiento del applet, su repintado cuando sea cubierto por otra ventana, etc., además de todas las cuestiones relacionadas con un posible cambio de plataforma (uno nunca sabe a donde van a ir a parar los propios hijos, o los applets).
Con un layout adecuado, el método pack() de la ventana hará que coja el tamaño necesario para que se vea todo lo que tiene dentro.
ventana.pack();
Las ventanas vienen con un Layout por defecto. En java hay varios layouts disponbiles y podemos cambiar el de defecto por el que queramos.

El Layout null
Uno de los Layouts más utilizados por la gente que empieza, por ser el más sencillo, es NO usar layout. Somos nosotros desde código los que decimos cada botón en qué posición va y qué tamaño ocupa
contenedor.setLayout(null);  // Eliminamos el layout
contenedor.add (boton); // Añadimos el botón
boton.setBounds (10,10,40,20); // Botón en posicion 10,10 con ancho 40 pixels y alto 20

Esto, aunque sencillo, no es recomendable. Si estiramos la ventana los componentes seguirán en su sitio, no se estirarán con la ventana. Si cambiamos de sistema operativo, resolución de pantalla o fuente de letra, tenemos casi asegurado que no se vean bien las cosas: etiquetas cortadas, letras que no caben, etc.
Además, al no haber layout, la ventana no tiene tamaño adecuado. Deberemos dárselo nosotros con un ventana.setSize(...).
El tiempo que ahorramos no aprendiendo cómo funcionan los Layouts, lo perderemos echando cuentas con los pixels, para conseguir las cosas donde queremos, sólo para un tipo de letra y un tamaño fijo.

FlowLayout
El FlowLayout es bastante sencillo de usar. Nos coloca los componente en fila. Hace que todos quepan (si el tamaño de la ventana lo permite). Es adecuado para barras de herramientas, filas de botones, etc.
contenedor.setLayout(new FlowLayout());
contenedor.add(boton);
contenedor.add(textField);
contenedor.add(checkBox);


BoxLayout
Es como un FlowLayout, pero mucho más completo. Permite colocar los elementos en horizontal o vertical.
// Para poner en vertical
contenedor.setLayout(new BoxLayout(contenedor,BoxLayout.Y_AXIS));
contenedor.add(unBoton);
contenedor.add(unaEtiqueta);


GridLayout
Este pone los componentes en forma de matriz (cuadrícula), estirándolos para que tengan todos el mismo tamaño. El GridLayout es adecuado para hacer tableros, calculadoras en que todos los botones son iguales, etc.

// Creación de los botones
JButton boton[] = new JButton[9];
for (int i=0;i<9;i++)
   boton[i] = new JButton(Integer.toString(i));

// Colocación en el contenedor
contenedor.setLayout (new GridLayout (3,3));  // 3 filas y 3 columnas
for (int i=0;i<9;i++)
    contenedor.add (boton[i]);  // Añade los botones de 1 en 1.

BorderLayout
El BorderLayout divide la ventana en 5 partes: centro, arriba, abajo, derecha e izquierda.
Hará que los componentes que pongamos arriba y abajo ocupen el alto que necesiten, pero los estirará horizontalmente hasta ocupar toda la ventana.
Los componentes de derecha e izquierda ocuparán el ancho que necesiten, pero se les estirará en vertical hasta ocupar toda la ventana.
El componente central se estirará en ambos sentidos hasta ocupar toda la ventana.
El BorderLayout es adecuado para ventanas en las que hay un componente central importante (una tabla, una lista, etc) y tiene menús o barras de herramientas situados arriba, abajo, a la derecha o a la izquierda.
Este es el layout por defecto para los JFrame y JDialog.
contenedor.setLayout (new BorderLayout());
contenedor.add (componenteCentralImportante, BorderLayout.CENTER);
contenedor.add (barraHerramientasSuperior, BordeLayout.NORTH);
contenedor.add (botonesDeAbajo, BorderLayout.SOUTH);
contenedor.add (IndiceIzquierdo, BorderLayout.WEST);
contenedor.add (MenuDerecha, BorderLayout.EAST);

Por ejemplo, es bastante habitual usar un contenedor (JPanel por ejemplo) con un FlowLayout para hacer una fila de botones y luego colocar este JPanel en el NORTH de un BorderLayout de una ventana. De esta forma, tendremos en la parte de arriba de la ventana una fila de botones, como una barra de herramientas.
JPanel barraHerramientas = new JPanel();
barraHerrameientas.setLayout(new FlowLayout());
barraHerramientas.add(new JButton("boton 1"));
...
barraHerramientas.add(new JButton("boton n"));

JFrame ventana = new JFrame();
ventana.getContentPane().setLayout(new BorderLayout()); // No hace falta, por defecto ya es BorderLayout
ventana.getContentPane().add(barraHerramientas, BorderLayout.NORTH);
ventana.getContentPane().add(componentePrincipalDeVentana, BorderLayout.CENTER);

ventana.pack();
ventana.setVisible(true);


GridBagLayout
El GridBagLayout es de los layouts más versátiles y complejos de usar. Es como el GridLayout, pone los componentes en forma de matriz (cuadrícula), pero permite que las celdas y los componentes en ellas tengan tamaños variados.
§  Es posible hacer que un componente ocupe varias celdas
§  Un componente puede estirarse o no con su celda
§  Si no se estira, puede quedar en el centro de la celda o pegarse a sus bordes o esquinas.
§  Las columnas pueden ensancharse o no al estirar la ventana y la proporición podemos decidirla
§  Lo mismo con la filas.

CardLayout
El CardLayout hace que los componente recibidos ocupen el máximo espacio posible, superponiendo unos a otros. Sólo es visible uno de los componentes, los otros quedan detrás. Tiene métodos para indicar cual de los componentes es el que debe quedar encima y verse.
El CardLayout es el que utiliza el JTabbedPane (el de las pestañas) de forma que en función de la pestaña que pinchemos, se ve uno u otro.

SpringLayout
Para los nostálgicos que usaban motif, este layout es muy similar a los attachment de motif.
Se añaden los componentes y para cada uno de ellos tenemos que decir qué distancia en pixel queremos que tenga cada uno de sus bordes respecto al borde de otro componente. Por ejemplo, para decir que el borde izquierdo de una etiqueta está a 5 pixels del panel que la contiene ponemos
layout.putConstraint(SpringLayout.WEST, label, 5, SpringLayout.WEST, contentPane);
Para decir que el borde derecho de la etiqueta debe estar a 5 pixels del borde izquierdo de un JTextField, ponemos esto
layout.putConstraint(SpringLayout.WEST, textField, 5, SpringLayout.EAST, label);
Con este layout, cuando estiramos el panel, siempre ceden aquellos componentes más "flexibles". Entre una etiqueta y una caja de texto, la caja de texto es la que cambia su tamaño.