Swing y JFC (Java Foundation Classes)

El primer foco cuando se convierte un programa basado en el AWT 1.1 a Swing es modificar el programa para que use los componentes Swing en vez de los componentes AWT. Esta p�gina explica los pasos para hacer esto. Cada paso se aplica a todos los programas -- aplicaciones y applets -- a menos que se especifique lo contrario.

.�Paso 1: Guardad una copia del programas basado en el AWT.

Necesitares una copia de todos los ficheros del programa, incluyendo los ficheros .java y .class. Necesitamos estas copias por varias razones.

  • Cualquier usuario que no pueda ejecutar programas Swing necesitar� ejecutar el viejo programa AWT.
  • Necesitaremos referirinos al c�digo fuente durante el proceso de conversi�n.
  • Despu�s de la conversi�n, deberemos ejecutar las dos versiones del programa para compararlos.
  • Despu�s de la conversi�n, podemos comparar el c�digo fuente de ambas versiones para aplicar lo que hemos aprendido en otros programas que necesitemos convertir.

.�Paso 2: Eliminar cualquier sentencia java.awt.

Este paso pone el compilador a trabajar por nosotros. Es �til eliminar todas las importaciones del AWT incluso si nuestro programa todav�a utiliza clases AWT -- como sus controladores de distribuci�n -- porque, sin estas sentencias, el compilador generar� erroees "not found" por cada componente AWT usado en nuestro programa y el n�mero de l�nea donde es utilizado. Esto ayuda a localizar cada uno de los componentes AWT usado por nuestro programa para que podamos reemplazarlos por su equivalente Swing en el Paso 8, luego a�adiremos las importaciones para las clases AWT que realmente necesitemos.

.�Paso 3: Si nuestro programa es un applet, eliminar cualquier sentencia java.applet

No necesitamos la vieja clase Applet ni el paquete java.applet, porque nuestros applets Swing ser� una subclase de la clase JApplet de Swing. Por eso debemos eliminar cualquiera de estas sentencias de nuestro programa.

import java.applet.Applet;
    o
import java.applet.*;

.�Paso 4: Importar el paquete principal Swing.

A�adir la siguiente sentencia import a nuestro programa.

import javax.swing.*;

Esto importa todos los componentes Swing adem�s de algunas otras clases Swing. Si queremos podemos ser m�s meticulosos y a�adir una sentencia import por cada clase Swing que utilicemos.

.� Paso 5: Cuidado con el problemas con los Threads!

Antes de continuar, recuerda este echo importante: Aunque el AWT es seguro ante los Threads, Swing no lo es. Debemos tener esto en consideraci�n cuando convirtamos nuestros programas.

Para la mayor�a de los programadores esto significa que un programa modifica los componentes Swing s�lo desde dentro del thread de eventos del AWT. Los programas t�picos modifican componentes desde dentro de los m�todos de manejo de eventos y del m�todo paint, que son llamados por el thread de eventos del AWT, por eso modificar un componente en esto m�todos es seguro. Si nuestro programa modifica un componente en cualquier otro lugar, debemos tomar las acciones expl�citas para hacerlo seguro ante los threads.

Hemos proporcionado dos p�ginas sobre Swing y los threads. Primero Threads y Swing proporciona una cobertura conceptual. Luego C�mo usar Threads contiene informaci�n pr�ctica y ejemplos.

.�Paso 6: Cambiar cada componente AWT por su equivalente Swing m�s cercano.

La tabla proporcionada en la secci�n de recursos, Reemplazos Swing para Componentes AWT, lista cada uno de los componentes AWT y su equivalente Swing m�s cercano. Podemos usarla como una gu�a para elegir el reemplazo para cada componente Swing usado en nuestro programa.

En el mejor de los casos, el componente AWT y su reemplazo Swing son compatibles en el c�digo y un simple cambio de nombre es todo lo que requiere. Por ejemplo, para convertir un bot�n del AWT por un bot�n Swing, s�lo debemos cambiar todas las ocurrencias de Button por JButton en nuestro programa. Aqu� tenemos un peque�o ejemplo de c�digo AWT y su equivalente Swing. El c�digo subrrayado muestra las diferencias entre los dos programas.

C�digo AWT C�digo Swing
Button button = new Button("A Button");
button.addActionListener(this);
JButton button = new JButton("A Button");
button.addActionListener(this);

Estaras contento de aprender que un gran n�mero de componentes Swing tiene el c�digo compatible con su pareja AWT.

En el lado contrario tenemos que no todos los componentes Swing son totalmente compatibles con los componentes AWT. Por eso, para algunos componentes AWT tendremos que re-escribir alg�n c�digo cuando lo reemplazemos por un componente Swing. Adem�s, podr�amos elegir hacer cambios innecesarios para aprovecharnos de las caracter�sticas Swing. Por ejemplo, podr�amos querer a�adir una imagen a un bot�n, podr�amos querer soportar la accesibilidad llamando al m�todo setLabelFor sobre las etiquetas asociadas con otros componentes. Recursos de Conversi�n tiene m�s informaci�n para ayudarnos con las conversiones que requieren algo m�s que un simple cambio de nombre y sobre las conversiones opcionales.

.�Paso 7: Cambiar todas las llamadas a los m�todos add y setLayout.

Los programas AWT a�aden componentes y seleccionan el controlador de distribuci�n directamente sobre el contenedor de alto nivel ( un frame, dialog, o applet). En contraste, los programas Swing a�aden componentes y seleccionan el controlador de distribuci�n sobre el panel de contenido del contenedor de alto nivel. La primera fila de la siguiente tabla muestra alg�n c�digo t�pico AWT para a�adir componentes a un frame y seleccionar su controlador de distribuci�n. La segunda y tercera filas muestran dos diferentes conversiones Swing.

C�digo AWT
frame.setLayout(new FlowLayout());
frame.add(button);
frame.add(label);
frame.add(textField);
Conversi�n �bvia Swing

(No hagas esto)

frame.getContentpane().setLayout(new FlowLayout());
frame.getContentPane().add(button);
frame.getContentPane().add(label);
frame.getContentPane().add(textField);
Conversi�n Eficiente Swing

(Haz esto)

Container contentPane = frame.getContentPane();
contentPane.setLayout(new FlowLayout());
contentPane.add(button);
contentPane.add(label);
contentPane.add(textField);

Habr�s notado que el c�digo Swing de la segunda fila llama a getContentPane m�ltiples veces, lo que es ineficiente si nuestro programa usa muchos componentes. El c�digo Swing de la tercera fila mejora el c�digo, obteniendo el panel de contenido una s�la vez, almacen�ndolo en una variable, y usando la variable para a�adir componentes y seleccionar el controlador de distribuci�n.

.�Paso 8: Usar el compilador para indicar m�s cambios necesarios.

Una vez modificado el c�digo fuente como se ha indicado en los pasos anteriores, utilizaremos el compilador para intentar compilar nuestro programa.

javac MyClass.java

Durante este paso, el compilador nos est� ayudando a identificar cualquier conversi�n que nos haya pasado por alto. No podemos esperar que el programa se compile a la primera.

El compilador puede ayudarnos.

  • Encontrando cada componente AWT que nos hayamos olvidado de convertir a su equivalente Swing. Si seguimos el paso 2 el compilador mostrar� un mensaje de error como este por cada componente AWT que quede en nuestro programa.
    TextEventDemo.java:23: Class Button not found in type declaration.
    	Button button = new Button("Clear");
    	^
    
  • Identificar que clases AWT todav�a necesita nuestro programa. Si hemos seguido las instrucciones del paso 2 el compilador mostrar� un mensaje de error como este por cada clase AWT que todav�a necesitesmos
    TextEventDemo.java:17: Class BorderLayout not found in type declaration.
    	BorderLayout layout = new BorderLayout();
    	^
    

    Las clases AWT que podr�amos necesitar en un programa Swing son los controladores de distribuci�n, Color, Dimension, Point, Insets, etc.

  • Localiza cualquier incompatibilidad de c�digo entre los componentes AWT y si reemplazo Swing. Esto se muestra como un error del compilador sobre m�todos no definidos. Por ejemplo, aunque los componentes de texto del AWT tienen un m�todo addTextListener, los componentes de Swing no lo tienen. El compilador genera un mensaje de error como este indicando que JTextField no tiene dicho m�todo.
    TextEventDemo.java:22: Method addTextListener(TextEventDemo.
                MyTextListener) not found in class javax.swing.JTextField.
    	textField.addTextListener(new MyTextListener("Text Field"));
    	                         ^
    
  • Eliminar el uso de API "obsoleto". Usamos la bandera del compilador -deprecation para obtener detalles sobre las clases o m�todos obsoletos usados por nuestro programa y el n�mero de l�nea donde son utilizados.
    javac -deprecation MyClass.java
    

Debemos corregir todos los errores devueltos por el compilador hasta que el programa se compile correctamente.

.�Paso 9: Ejecutar el programa Swing.

Usamoos el int�rprete o el Applet Viewer para ejecutar nuestro programa.

java MyClass      o     appletviewer MyApplet.html

Si hemos olvidado modificar cualquier llamada a add o setLayout, lo descubriremos durante este paso. Si lo hemos hecho, el sistema runtime muestra un mensaje como este (el mensaje de error para setLayout es similar).

java.lang.Error: Do not use MultiListener.add() use 
                     MultiListener.getContentPane().add() instead
	at javax.swing.JApplet.createRootPaneException(Compiled Code)
	at javax.swing.JApplet.addImpl(Compiled Code)
	at java.awt.Container.add(Compiled Code)
	at MultiListener.init(Compiled Code)
	at sun.applet.AppletPanel.run(Compiled Code)
	at java.lang.Thread.run(Compiled Code)

Volvemos sobre el c�digo, buscaremos cualquier add o setLayout, resolveremos el problema. compilaremos y ejecutaremos el programa de nuevo.

.�Paso 10: Comparar las versiones Swing y AWT.

Probablemente querramos que los programas sean similares, est�n abiertos a las mejoras ofrecidas por swing y cualquier diferencia inherente en los dos GUIs.

.�Paso 11: Investigar otros componentes Swing.

Podr�amos mejorar nuestro UI usando caracter�sticas s�lo disponibles en componentes Swing (como las im�genes en botones) o usando componentes Swing m�s sofisticados no disponibles en el AWT. Tambi�n podr�amos reemplazar un componente escrito por nosotros mismos con un componente del propio Swing o un componente personalizado Swing. Los componentes completamente nuevos en Swing incluyen tablas, trees, color choosers, etc.

.�Paso 12: Limpieza!

Ahora es el momento de limpiar nuestro c�digo. Si hemos dejado alg�n c�digo para corregir alguna deficiencia o bug del AWT , es el momento de limpiarlo!

COMPARTE ESTE ARTÍCULO

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