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");