Cómo usar Paneles

JPanel es un contenedor de propósito general para componentes de peso ligero. Como todos los contenedores, utiliza un Controlador de Distribución para posicionar y dimensionar sus componentes. Como todos los componentes Swing, JPanel permite añadirle bordes y determinar si utiliza el doble buffer para aumentar el rendimiento.

Esta imagen muestra una aplicación que utiliza un panel y su controlador de distribución por defecto, FlowLayout, para mostrar tres botones:

La clase principal de esta aplicación es ButtonDemo, que es una subclase de JPanel. Aquí puedes ver el código del constructor de ButtonDemo que le añade los tres botones al panel:
public ButtonDemo() {
    super();
    ...
    create the three buttons
    ...
    //Add Components to this container, using the default FlowLayout.
    add(b1);
    add(b2);
    add(b3);
}
Este código no selecciona explícitamente el controlador de distribución del panel, por eso utiliza el controlador por defecto. Este controlador de distribución, FlowLayout, sitúa los componentes en una fila con sus tamaños preferidos. Si queremos utilizar otro controlador de distribución, podemos especicar el controlador cuando creamos el objeto JPanel o utilizar el método setLayout posteriormente. El AWT proporciona una colección de útiles controladores de distribución, y Swing añade otro controlador de distribución de propósito general, BoxLayout.

El fragmento de código anterior utiliza un método add heredado de java.awt.Container que requiere un sólo argumento: el componente a añadir. Como otras subclases de Container, JPanel hereda otros métodos add que permiten especificar restricciones e información sobre posicionamiento cuando se añade un componente. Se debe elegir el método add para el controlador de disposición que se está utilizando.

Otros Contenedores

JPanel es sólo una de las varias clases de contenedores que se pueden utilizar. Existen algunos contenedores de propósito especial que podríamos utilizar en lugar de un JPanel:

Box Automáticamente utiliza un BoxLayout para distribuir sus componentes. La ventaja de Box es que es de peso superligero, ya que desciende directamente de la clase Container. Su desventaja es que no es un verdadero componente Swing -- no hereda el API que soporta caracterísitcas como los bordes de la caja, ni la selección sencilla de los tamaños máximo, mínimo y preferido. Por esta razón, nuestros ejemplos utilizan JPanel con BoxLayout, en vez Box.
JLayeredPane Proporciona una tercera dimensión, profundidad, para posicionar componentes. Los paneles con capas no tienen controladores de distribución pero pueden ser utilizados para colocar los componentes en capas en un JPanels. Un tipo de layeredpane, JDesktopPane, está diseñado específicamente para manejar frames internos.
JScrollPane Proporciona una vista desplazable de un componente grande.
JSplitPane Muestra dos componentes cuyos tamaños relativos pueden ser modificados por el usuario.
JTabbedPane Permite a varios componentes, normalmente objetos JPanel, compartir el mismo espacio.

Otro contenedor que podríamos utilizar es el panel de contenido por defecto de un applet, frame, internal frame, o dialog. El panel de contenido es un Container que, como regla, contiene todos los componentes no-menús de la ventana. Se puede encontrar el panel de contenido utilizando un método llamado getContentPane. De forma similar, se puede seleccionar el panel de contenido -- quizás para que sea un JPanel que hayamos creado -- utilizando setContentPane.

El API JPanel

El API de la propia clase JPanel es mínimo. Los métodos que más se utilizan de un objeto JPanel son aquellos que hereda de sus superclases JComponent, Container y Component.

Crear un JPanel
Método Propósito
JPanel()
JPanel(boolean)
JPanel(LayoutManager)
JPanel(LayoutManager, boolean)
Crea un panel. Cuando está presente, el parámetro boolean determina la estrategía de buffer del panel. Un valor true indica doble buffer. El parámetro LayoutManager proporciona el controlador de distribución para el nuevo panel. Si no se especifica, el panel utiliza FlowLayout para distribuir sus componentes.

Manejar Componentes en un Contenedor
Método Propósito
void add(Component)
void add(Component, int)
void add(Component, Object)
void add(Component, Object, int)
void add(String, Component)
Añade el componente especificado al panel. Cuando existe, el parámetro int es la posición o índice del componente dentro del contenedor. El parámetro Object depende del controlador de distribución y normalmente proporciona información sobre el posicionamiento y restricciones de distribución cuando se añaden componentes. El parámetro String proporciona un nombre para el componente.
int getComponentCount() Obtiene el número de componentes en este panel.
Component getComponent(int)
Component getComponentAt(int, int)
Component getComponentAt(Point)
Component[] getComponents()
Obtiene el componente o componentes especificados. Se pueden obtener basándose en su índice, o en sus posiciones x,y.
void remove(Component)
void remove(int)
void removeAll()
Elimina el componente o componentes especificados.

Seleccionar/Obtener el Controlador de Distribución
Método Propósito
void setLayout(LayoutManager)
LayoutManager getLayout()
Selecciona u obtiene el controlador de distribución para este panel. El controlador de distribución es el responsable de posicionar los componentes dentro del panel de acuerdo con alguna filosofía.

Ejemplos que utilizan Paneles

Muchos ejemplos de esta lección utilizan objetos JPanel:

Ejemplo Dónde se describe Notas
ButtonDemo.java Como usar Buttons Un subclase de JPanel. Utiliza FlowLayout, el controlador de distribución por defecto para un panel.
ToolBarDemo.java Cómo usar Toolbar Muestra un panel con tres componentes distribuidos por BorderLayout.
BorderDemo.java Cómo usar Borders Contiene varios paneles que utilizan BoxLayout. Contiene muchos más paneles con distintos tipos de bordes.
BoxLayoutDemo.java Cómo usar BoxLayout Ilustra el uso de paneles con el controlador de distribución BoxLayout de Swing.
LabelDemo.java Cómo usar Labels Utiliza un panel cuyos tres componentes están distribuidos en una parrilla con GridLayout.
TabbedPaneDemo.java Cómo usar TabbedPanes Una subclase de JPanel que crea su GUI en su constructor y utiliza GridLayout.


Ozito