Swing y JFC (Java Foundation Classes)

Esta p�gina te lleva a trav�s del c�digo del programa SwingApplication. La siguiente lecci�n proporciona explicaciones completas sobre los t�picos introducidos en esta secci�n. Tambi�n proporciona, un ejemplo mayor y m�s realista, que puedes usar para ampliar y probar tus conocimientos sobre Swing.

La aplicaci�n SwingAplication presentada en la secci�n anterior es muy sencilla. Trae una ventana que se parece a �sta.

Cada vez que el usuario pulsa el bot�n, la etiqueta se actualiza. Puedes encontrar el programa completo en SwingApplication.java.

Esta p�gina explica el programa en detalle, incluyendo los siguientes aspectos.

.�Importar paquetes Swing

La siguiente l�nea importa el paquete principal de Swing.

import javax.swing.*;
Nota: Las primeras versiones beta del JFC/Swing y del JDK 1.2 usaban nombres de paquetes diferentes. Puedes ver Nombres de Paquetes Swing para m�s detalles.

Los programas Swing tambi�n necesitan clases de los paquetes principales del AWT.

import java.awt.*;
import java.awt.event.*;

.�Elegir el Aspecto y Comportamiento

Aqu� puedes ver el c�digo que utiliza SwingApplication para seleccionar su aspecto y comportamiento.

public static void main(String [] args) {
try {
    UIManager.setLookAndFeel(
        UIManager.getCrossPlatformLookAndFeelClassName());
      } catch (Exception e) { }

      /Crea y muestra el GUI...
}

El c�digo anterior, esencialmente dice, "No me importa si el usuario a elegido un aspecto y comportamiento -- utiliza el aspecto y comportamiento multi-plataforma." Esta aproximaci�n dictatorial tiene sentido cuando el program ha sido dise�ado con un aspecto y comportamiento particular en mente. El aspecto y comportamiento multi-plataforma es conocido como Aspecto y Comportamiento Java (con el nick "Metal").

.�Configurar el Contenedor de Alto Nivel

Todo programa que presente un GUI Swing contiene al menos un contenedor Swing de alto nivel. Para la mayor�a de los programas, los contenedores de alto nivel Swing son ejemplares de JFrame, JDialog, o (para los applets) JApplet. Cada objeto JFrame implementa una ventana secundaria. Cada objeto JApplet implementa un �rea de pantalla de un applet dentro de una ventana del navegador. Un contenedor de Alto Nivel Swing porporciona el soporte que necesitan los componentes Swing para realizar su dibujado y su manejo de eventos.

El ejemplo SwingApplication tiene un s�lo contenedor de alto nivel, un JFrame. Cuando el usuario cierra el frame, la aplicaci�n finaliza. Aqu� est� el c�digo que configura y muestra el frame.

public class SwingApplication {
    ...
    public static void main(String[] args) {
	...
        JFrame frame = new JFrame("SwingApplication");
        //...create the components to go into the frame...
        //...stick them in a container named contents...
        frame.getContentPane().add(contents, 
				BorderLayout.CENTER);

        //Finish setting up the frame, and show it.
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        frame.pack();
        frame.setVisible(true);
    }
}

Para m�s informaci�n sobre los contenedores de alto nivel puedes ver Los Componentes Swing y el �rbol de Herencia de Contenedores

.�Configurar los Botones y las Etiquetas

Como la mayor�a de los GUIs, el ejemplo de SwingApplication contiene un bot�n y una etiqueta. (Al contrario que la mayor�a de los GUIs, esto es todo lo que tiene SwingApplication). Aqu� podemos ver el c�digo que inicializa el bot�n.

JButton button = new JButton("I'm a Swing button!");
button.setMnemonic('i');
button.addActionListener(this);

La primera l�nea crea el bot�n, La segunda l�nea selecciona la letra "i" como mnem�nico que el usuario puede utilizar para simular un click del bot�n. Por ejemplo, en el Aspecto y Comportamiento Metal, teclear Alt+i resulta en un click del bot�n. La tercera l�nea registra un manejador de eventos para el click del bot�n. Podremos ver el c�digo del manejador de eventos en Menajear Eventos.

Aqu� podemos ver el c�digo que inicializa y manipula la etiqueta.

./where instance variables are declared:
private static String labelPrefix = "Number of button clicks: ";
private int numClicks = 0;

./in GUI initialization code:
final JLabel label = new JLabel(labelPrefix + "0    ");
...
label.setLabelFor(button);

./in the event handler for button clicks:
label.setText(labelPrefix + numClicks);

El c�digo anterior es bastante conocido, excepto la l�nea que invoca al m�todo setLabelFor. Este c�digo existe s�lo para indicar a las tecnolog�as asistivas que la etiqueta describe el bot�n. Para m�s informaci�n, puedes ver Supporting Assistive Technologies.

Finalmente, aqu� est� el c�digo que inicializa el panel.

JPanel pane = new JPanel();
pane.setBorder(BorderFactory.createEmptyBorder(30, 30, 10, 30));
pane.setLayout(new GridLayout(0, 1));
pane.add(button);
pane.add(label);

.�A�adir Componentes a los Contenedores

SwingApplication agrupa la etiqueta y el bot�n en un contenedor (un JPanel) antes de a�adir los componentes al frame. Aqu� est� el c�digo que inicializa el panel.

JPanel pane = new JPanel();
pane.setBorder(BorderFactory.createEmptyBorder(30, 30, 10, 30));
pane.setLayout(new GridLayout(0, 1));
pane.add(button);
pane.add(label);

La primera l�nea de c�digo crea el panel. La segunda le a�ade un borde; explicaremos los bordes m�s tarde.

La tercera l�nea de c�digo crea un controlador de distribuci�n que fuerza el contenido del panel a dibujarse en una s�la columna. La �ltima l�nea a�ade el bot�n y la etiqueta al panel. A�adir el bot�n y la etiqueta al panel significa que est�n controlados por el controlador de distribuci�n del panel. Espec�ficamente, el controlador de distribuci�n de un contenedor determina el tama�o y la posici�n de cada componente que haya sido a�adido al contenedor.

Los conceptos de los controladores de distribuci�n se describen en Controladores de Distribuci�n. Para aprender c�mo usar controladores de distribuci�n individuales, puedes ver la lecci�n Usar Controladores de Distribuci�n.

.�A�adir Bordes Alrededor de los Componentes

Aqu� est�, de nuevo, el c�digo que a�ade el borde al JPanel.

pane.setBorder(BorderFactory.createEmptyBorder(
                                30, //top
                                30, //left
                                10, //bottom
                                30) //LEFT
                                );

Este borde simplemente proporciona un espacio en blanco alrededor del panel de contenidos -- 30 pixels extras en la parte superior, izquierda y derecha y 10 pixels extras en la parte inferior. Los bordes son una caracter�sitcas que JPanel de la clase Component.

Los conceptos de los bordes se describen en Control de la distribuci�n y en Dibujo

.�Manejar Eventos

El ejemplo SwingApplication contiene dos manejadores de eventos. Uno maneja las pulsaciones del bot�n (eventos action) y otro maneja los eventos de cerrar ventana.

button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        numClicks++;
        label.setText(labelPrefix + numClicks);
    }
});
...
frame.addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent e) {
	System.exit(0);
    }
});

Puedes leer sobre el manejo de eventos Swing en Manejo de Eventos y en la lecci�n Escribir Oyentes de Eventos.

.�Tratar con Problemas de Threads

El programa SwingApplication es de thread seguro. Una vez que su GUI es visible, en el manejador de eventos s�lo ocurre manipulaci�n GUI (actualizar la etiqueta). Como el manejador de eventos se ejecuta en el mismo thread que realiza todo el manejo de eventos y pintado de la aplicaci�n, no existe la posibilidad de que dos threads intenten manipular el GUI a la vez.

Sin embargo, es f�cil introducir problemas de threads en un programa.

Puedes ver Threads y Swing para m�s informaci�n sobre los threads seguros en Swing.

.�Soportar Tecnolog�as Asistivas

El soporte para tecnolog�as asistivas -- dispositivos como lectores de pantalla que proporcionan formas alternativas de acceder a la informaci�n de un GUI -- ya est� incluido en cada componente Swing. El �nico c�digo que existen en SwingApplication que maneja el soporte de tecnolog�as asistivas es este.

label.setLabelFor(button);

Adem�s, la siguientes l�neas seleccionan la informaci�n que puede ser utilizada por tecnolog�as asistivas.

super("HelloSwing");
JButton button = new JButton("I'm a Swing button!");
label = new JLabel(labelPrefix + "0    ");
label.setText(labelPrefix + numClicks);
JFrame frame = new JFrame("SwingApplication");

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR