Esta secci�n mustra un programa Swing, llamado Converter, que tiene un UI gr�fico. Puedes ver c�mo est� implementado este programa mirando el c�digo fuente que puedes encontrar en los ficheros Converter.java y ConversionPanel.java. Sin embargo, no habla sobre l�neas individuales de c�digo. Se concentra en c�mo el programa Converter usa las caracter�sticas GUI proporcionadas por la plataforma Java. Si te pierdes cuando lees el c�digo fuente de Converter, puedes refrescar tu memoria en la p�gina Una Ruta R�pida por el C�digo de una Aplicaci�n Swing.
Converter es una aplicaci�n que convierte medidas de distancias entre unidades m�tricas y am�ricanas. Para ejecutarlo, debes compilar los siguientes ficheros fuente: Converter.java, ConversionPanel.java, ConverterRangeModel.java, FollowerRangeModel.java, DecimalField.java, FormattedDocument.java, y Unit.java. Una vez compilado, puedes ejecutarlo llamando al int�rprete con la clase Converter. Si necesitas ayuda para compilar y ejecutar Converter, puedes ver Compilar y Ejecutar un Programa Swing.
Aqu� tenemos un gr�fico comentado del GUI de Converter.

"JFrame", "JPanel (ConversionPanel)" (x2 apuntado a los paneles que dicen "Metric System" and "U.S. System"), "JTextField (DecimalField)" (x2), JSlider (x2), JComboBox (x2)]
Esta secci�n describe las siguientes caracter�sitcas de Converter.
�Componentes Swing
C�mo se ve en la figura anterior, Converter tiene los siguientes componentes visibles.
- 1 JFrame
- 2 JPanel personalizados
- 2 JTextField personalizados
- 2 JSliders
- 2 JComboBoxes
El JFrame es el contenedor de alto nivel, s�lo proporciona la ventana de la aplicaci�n. Todos los otros componentes de la aplicaci�n est�n contenidos en JFrame.
Excepto el contenedor de alto nivel, todos los componentes visibles de Converter descienden de JComponent. La clase JComponent proporciona muchas caracter�sticas, como soporte para bordes y accesibilidad. Los dos JPanel personalizados usan bordes para soportar t�tulos (por ejemplo, "Metric System") y para dibujar recuadros a su alrededor.
�El �rbol de Contenidos
La siguiente figura muesta el �rbol de contenidos del JFrame.
JFrame | ... | JPanel (custom content pane) | +---------------------------------+ | | JPanel JPanel (ConversionPanel) (ConversionPanel) | | (copy left half here) +---------+ | | JPanel JComboBox (custom) | +----------+ | | JTextField JSlider (DecimalField)
Este diagrama muestra tres componentes no etiquetados en el figura anterior porque no dibujan nada observable en la pantalla..
- 1 JPanel que sirve para el panel de contenidos
- 2 JPanel personalizados que contienen un campo de texto y un deslizador
Estos tres componentes existen para afectar a la distribuci�n. Hacen esto simplificando la distribuci�n o a�adiendo bordes "vac�os" que a�aden espacio para la distribuci�n. El agrupamiento de componentes -- tanto en contenedores visibles como en invisibles -- tambien proporciona ayuda para las tecnolog�as asistivas. Por ejemplo, agrupar un campo de texto y un deslizador en su propio contenedor le ofrece a las tecnolog�as asisitivas la informaci�n de que el campo de texto y el deslizador est�n estrechamente relacionados.
Bajo el panel de contenidos hay dos ConversionPanel. Uno de ellos contiene los componentes relacionados con las ditancias m�tricas, y el otro hace lo mismo con las distancias americanas.
Cada ConversionPanel contiene 3 componentes visibles: un campo de texto, un deslizador y un combo box. El campo de texto y el deslizador est�n agrupados en un JPanel, principalmente para simplificar la distribuci�n.
�Control de Distribuci�n y Bordes
La siguiente figura muesta una versi�n coloreada de Converter. En esta versi�n, cada contenedor tiene un color de fondo diferente, para que puedes ver f�cilmente las partes de los contenedores que no est�n cubiertas por otros componentes. Observa que todos los contenedores son opacos; de otro modo, el color del fondo podr�a no ser pintado autom�ticamente.

Converter create cinco objetos controladores de distribuci�n -- un ejemplar de GridLayout, y cuatro de BoxLayout.
El primer JPanel (el panel de contenidos personalizado) usa GridLayout para hacer que los ConversionPanels tengan exactamente el mismo tama�o. El c�digo configura el GridLayout para que ponga los ConversionPanels en una s�la columna (dos filas), con cinco pixels entre ellos. El JPanel se inicializa para tener un borde vac�o que a�ade cinco pixels entre el panel y los lados del frame.
Cada ConversionPanel tiene un borde compuesto. El exterior es un borde con t�tulo y el interior es un borde vac�o. El borde titulado dibuja una recuadro espec�fico del aspecto y comportamiento alrededor del ConversionPanel y sit�a dentro el t�tulo del panel. El borde vac�o pone alg�n espacio m�s entre el ConversionPanel y sus contenidos.
Cada ConversionPanel usa un controlador BoxLayout para situar sus contenidos, que son un JPanel y un JComboBox, en un fila. Seleccionando el alineamineto Y tanto del panel como del combo box, el programa alinea la parte superior del panel con la perte superior del combo box.
El JPanel que agrupa al campo de texto y al deslizador est� implementado con una subclase sin nombre de JPanel. Esta subclase sobreescribe los m�todos getMinimumSize, getPreferredSize, y getMaximumSize para que devuelvan el mismo valor: 150 pixels de ancho y la altura preferida. As� es como se asegura de que los dos grupos de texto-deslizador tienen la misma anchura, incluso aunque est�n controlados por diferentes controladores de distribuci�n. Necesitamos crear una subclase de JPanel, en vez de llamar a los m�todos setXxxxSize, porque la altura preferida de los componentes se determina en tiempo de ejecuci�n, por el controlador de distribuci�n.
El JPanel que agrupa el campo de texto y el deslizador usa un controlador BoxLayout de arriba-a-abajo para que el campo de texto se situe encima del deslizador. El JPanel tambi�n tiene un borde vac�o que a�ade un poco de espacio a su derecha entre �l y el combo box.
�Modelos Separados
Este programa usa tres modelos personalizados. El primero es un modelo de datos para el campo de texto. Los modelos de datos de texto son conocidos como modelos de documento. El modelo de documento analiza el valor que el usuario introduce en el campo de texto. Tambi�n formatea el n�mero para que parezca bonito. Hemos tomado prestado este modelo de documento, sin cambiarlo, del ejemplo presentado en Crear y Validar y un Campo de Texto.
Los otros dos modelos personalizados son modelos de datos de deslizador. Esto asegura que el dato mostrado por la aplicaci�n est� en un s�lo lugar -- en el modelo del deslizador superior. El modelo del deslizador superior es un ejemplar de una clase personalizada llamada ConverterRangeModel. El deslizador inferior usa una segunda clase personalizada, FollowerRangeModel, que reenv�a todas las peticiones para obtener un conjunto de datos al modelo del deslizados superior.
Todos los modelos de datos de deslizador deben implementar el interface BoundedRangeModel. Aprenderemos esto en la secci�n del API de C�mo usar Sliders. La documentaci�n del BoundedRangeModel que tiene un clase de implementaci�n llamada DefaultBoundedRangeModel. La documentaci�n del API de DefaultBoundedRangeModel muestra que es una implementaci�n de c�digo general de BoundedRangeModel.
No usamos DefaultBoundedRangeModel porque almacena los datos como enteros, y necesitamos almacenar datos en coma flotante. As�, implementamos ConverterRangeModel como una subclase de Object, compar�lo con el c�digo fuente de DefaultBoundedRangeModel (distribuido con las versiones JFC 1.1y JDK 1.2), para asegurarnos que implementamos el modelo correctamente. Implementamos FollowerRangeModel como una subclase de ConverterRangeModel.
�Aspecto y Comportamiento Conectable
El programa Converter se configura a s� mismo para usar el Aspecto y Comportamiento Java. Cambiando el valor de su variable LOOKANDFEEL, podemos hacer que use un Aspecto y Comportamiento diferente. Tres de sus encarnaciones est�n dibujadas en �Qu� son el JFC y Swing?.
�Manejo de Eventos
El programa Converter crea varios manejadores de eventos.
- Oyentes de Action
- Cada combo box tiene un oyente de action. Siempre que el usuario selecciona una nueva unidad de medida, el oyente de action notifica el modelo de deslizador relevante y resetea los valores m�ximos de los dos deslizadores.
Cada campo de texto tiene un oyente de action que es notificado cuando el usuario pulsa la tecla Return para indicar que el tecleado ha terminado. Este oyente de action actualiza el correspondiente modelo de deslizador para reflejar el valor del campo de texto.
- Oyente de Change
- Cada modelo de deslizador tiene un oyente de change personalizado. Siempre que el valor de un deslizador cambia, este oyente actualiza el correspondiente campo de texto. No hemos tenido que registrar los deslizadores como oyentes de dus propios modelos, ya que lo hace Swing autom�ticamente. En otras palabras, siempre que el programa selecciona un valor en un modelo de deslizador, �ste se actualiza autom�ticamente para reflejar el nuevo estado del modelo.
El modelo para el deslizador inferior a�ade un oyente de cambio al modelo del deslizador superior, Este oyente dispara un evento de cambio al oyente de cambio del modelo del deslizador inferior. El efecto es que cuando cambia el valor del deslizador superior, se actualizan los valores del deslizador y del campo de texto inferior. No es necesario notificar al deslizador superior los cambios en el deslizador inferior, ya que el modelo del deslizador inferior reenvia las peticiones de selecci�n de datos al modelo del deslizador superior.
- Oyentes de Window
- Un oyente de window en el frame hace que se salga de la aplicaci�n cuando se cierre la ventana.
Casi todos los oyentes del programa Converter est�n implementados en clases internas an�nimas --clases sin nombre definidas dentro de otras clases. Aunque las clases internas podr�an parecer dif�ciles de leer, al principio, realmente hacen el c�digo mucho m�s f�cil de comprender, una vez que las has utilizado. Manteniendo una implementaci�n de un menejador de eventos cerca de donde se registra el manejador de eventos, las clases internas te ayudan y ayudan a los que te siguen a encontrar f�cilmente la implementaci�n completa del manejador de eventos. Puedes ver Usar Adaptadores y Clases Internas para Manejar Eventos para m�s informaci�n.