14968478 Manual Programacion Java Tutor Swing

download 14968478 Manual Programacion Java Tutor Swing

If you can't read please download the document

Transcript of 14968478 Manual Programacion Java Tutor Swing

UI-Swing q q Utilizar los Paquetes JFC/Swing Empezar con Swing r r Sobre el JFC y Swing Compilar y Ejecutar programas Swing s s Compilar y Ejecutar programas Swing (JDK 1.2) Compilar y Ejecutar programas Swin g (JDK 1.1) r r q Ejecutar Applets Swing Una gira rpida por el cdigo de un programa Swing Herenc ia de Componentes y Contenedores Swing Control de Distribucin Manejo de Eventos Dibujo Threads y Swing Ms Caractersticas Swing Anatomia de un programa Swing Reglas Generales del uso de Componentes La clase JComponent Indice Visual de Com ponentes Swing Contenedores de Alto Nivel s s s s s s s s s s s Caractersticas y Conceptos Swing r r r r r r r q Usar Componentes Swing r r r r Cmo crear Frames Cmo crear Dilogos Cmo crear Applets Contenedores Intermedio s Cmo usar Panel Cmo usar ScrollPane Cmo usar SplitPane Cmo usar TabbedPane Cmo usar ToolBar Cmo usar InternalFrame Cmo usar LayeredPane

s r Cmo usar RootPane Componentes Swing s Cmo usar Button s s s s s s s s s s s s Cmo usar ChekBox Cmo usar ColorChooser Cmo usar ComboBox Cmo usar FileChoose r Cmo usar Label Cmo usar List Cmo usar Menu Cmo usar MonitorProgress Cmo u sar RadioButton Cmo usar Slider Cmo usar Table Componentes de Texto s s s s s Ejemplos de cada Componente de texto Reglas de uso de Componentes de texto Cmo usar TextField Cmo usar EditorPane y TextPane Sumario de Texto s s r q Cmo usar ToolTip Cmo usar Trees Problemas comunes con Componentes Ejemplos de Manejo de Eventos Reglas Generales para Escribir Oyentes de Eventos Manejar Eventos s s s s s s Escribir Oyentes de Eventos r r r Oyente de Action Oyente de Caret Oyente de Change Oyente de Component Oyente de Container Oyente de Document

s s s s s s s s s q Oyente de Focus Oyente de InternalFrame Oyente de Item Oyente de Key Oyente de L istSelection Oyente de Mouse Oyente de MouseMotion Oyente de UnodableEdit Oyente de Window Distribuir Componentes en un Contenedor r Usar Controladores de Distribucin s s s s s s s Reglas de uso de Controladores de Distribucin Cmo usar BorderLayout Cmo usar BoxLayout Cmo usar CardLayout Cmo usar FlowLayout Cmo usar GridLayout Cmo us ar GridBagLayout s s Especificar Restricciones El ejemplo explicado s s s q Crear un controlador de Distribucin Personalizado Hacerlo sin controlador de Di stribucin (Posicionamiento Absoluto) Solucin de Problemas con la Distribucin Trabajar con Grficos r r Introduccin al Soporte de Graficos del AWT Usar Grficos Primitivos s s Dibujar Formas Sencillas Trabajar con Texto Cargar Imgenes Dibujar Imgenes Cre ar un Bucle de Animacin r Utilizar Imgenes s s r Realizar Animacin s

s s s s r q Animar Grficos Mover una Imagen por la Pantalla Mostrar una Secuencia de Imgen es Aumentar el rendimiento y la aparaciencia de una Animacin Solucin de Problemas con los Graficos Cmo usar Action Cmo soportar tecnologa s de accesibilidad Cmo usar Iconos Cmo seleccionar el Aspecto y Comportamiento Cmo usar Threads Cmo usar Timer Por qu convertir a Swing? Cmo convertir m is programas a Swing? Recursos de Conversin s s s s Usar Otras Caractersticas de Swing r r r r r r q Convertir a Swing r r r Repuestos Swing para Componentes SWT Trucos de Conversin Algunos ejemplos de Co nversin Solucin de Problemas de Conversin

Swing Crear un GUI usando JFC/Swing Esta seccin explica como crear un Interface Grfico de Usuario (GUI) para aplic aciones y applets, usando los componentes Swing. Los componentes Swing, que form an parte de JavaTM Foundation Classes (JFC), se pueden usar tanto con el JDK 1.1 como con el JDK 1.2. Empezar con Swing es una leccin para empezar rpidamente. Primero ofrece conocimientos sobre el JFC y Swing. Luego explica cmo compilar y ejecutar programas -- tanto applets como aplicaciones -- que usan componentes Swing. Finalmente muestra el cdigo de un programa sencillo. Caractersticas y C onceptos Swing ofrece la iformacin que necesitas para poder usar componentes sw ing efectivamente. Por ejemplo, explica cmo los progrmas Swing muestran sus GUI s, cmo manejan los eventos como las pulsaciones del ratn, y cmo pueden usar c aractersticas como los bordes para ayudar a la distribucin. Finaliza con una e xplicacn de cmo se usan las caractersticas y los conceptos en un programa rea l. Usar componentes Swing explica cmo usar cada uno de los componentes Swing. E scribir oyentes de eventos explica cmo manejar eventos en los programas Swing. Distribuir Componentes Dentro de un Contenedor explica cmo elegir un controlado r de disposicin, cmo usar cada una de las clases de controladores de distribuc in proporcionadas por el entorno Java, cmo usar posicionamiento absoluto en ve z de un controlador de disposicin, y cmo crear nuestro propio controlador de d istribucin. Usar otras Caractersticas Swing explica cmo usar actions, borders , icons, y timers. Tambin nos ensea a crear programas multi-threads Convertir a Swing explica cmo convertir programas que usan el API del AWT 1.1 para usar c omponentes Swing.

Swing Empezar con Swing Esta seccin ofrece una introduccin rpida al uso de paquetes Swing para grear un GUI de un programa. Primero explica lo que son Swing y JFC. Luego nos ayuda a obtener la versiones necesarias para compilar y ejecutar programas Swing. Despu s muestra cmo ejecutar applets. Finalmente, nos lleva a una excursin sobre un a aplicacin Swing sencilla. Si t ests ms interesado en aprender conceptos qu e en ejecutar programas ahora mismo, puedes saltarle libremente esta leccin e i r a la siguiente leccin, Caractersticas y Conceptos. Puedes volver aqu cuando ests listo para empezar a programar. Sobre el JFC y Swing Esta leccin cuenta una pequea historia sobre JFC y Swing. Si has desarrollado programas usando com ponentes SWT, probablemente estars interesado en la descripcin de las diferenc ias entre los componentes ATW y los componentes Swing. Compilar y Ejecutar Progr amas Swing Para escribir programas usando los componentes Swing, primero debes d escargar las versiones apropidas del JDK y del JFC. Luego puedes seguir las inst rucciones de esta seccin para compilar y ejecutar una pequea aplicacin Swing que te proporcionamos. Ejecutar Applets Swing Si ests interesado en escribir ap lets swing, primero debers poder ejecutarlos. Esta leccin proporciona dos appl ets, con instrucciones para ejecutarlos. Una Gira Rpida por el Cdigo de una Ap licacin Swing Esta seccin muestra el cdigo de una pequea aplicacin swing. V ers que el cdigo que debe tener necesariamente una aplicacin Swing y aprender s algunas de las caractersitcas ms utilizadas de Swing

Swing Sobre el JFC y Swing Esta pgina responde cuatro preguntas: q Qu son el JFC y Swing? q q q Qu versiones contienen el API Swing? Qu paquetes Swing debera utilizar? Qu e tienen de diferente los componentes Swing de los componentes AWT? Qu son el JFC y Swing? JFC es la abreviatura de JavaTM Foundation Classes, que comprende un grupo de caractersticas para ayudar a construir interfaces grfic os de usuario (GUIs). Los componentes Swing Inlcuye todo desde botones hasta spl itpanes o tablas. Puedes ver imgenes de todos los componentes en ndice Visual de Componente Swing. Soporte de Aspecto y Comportamiento Conectable Le ofrece a cualquier componente Swing una amplia seleccin de aspectos y comportamientos. P or ejemplo, el mismo programa puede usar el Aspecto y Comportamiento Java o el A specto y Comportamiento Windows. Esperamos mucho ms de los paquetes de Aspecto y Comportamiento -- incluyendo algo que use sonido en lugar de un 'look' visual. API de Accesibilidad Permite tecnologas asistivas como lectores de pantalla y display Braille para obtener informacin desde el interface de usuario. Java 2D API (slo JDK 1.2 ) Permite a los desarrolladores incorporar fcilmente graficos 2D de alta calidad, texto, e imgenes en aplicaciones y applets Java. Soporte d e Drag&Drop (slo JDK 1.2) Proporciona la habilidad de arrastrar y soltar entre aplicaciones Java y aplicaciones nativas. Las tres primeras caractersitcas del JFC fueron implementadas sin ningn cdigo nativo, tratando slo con el API defi nido en el JDK 1.1.

Cmo resultado, se convirtieron en una extensin del JDK 1.1. Esta versin fue l iberada como JFC 1.1, que algunas veces es llamada 'Versin Swing'. El API del J FC 1.1 es conocido como el API Swing. Nota: "Swing" era el nombre clave del proy ecto que desarroll los nuevos componentes. Aunque no es un nombre oficial, frec uentemente se usa para referirse a los nuevos componentes y al API relacionado. Est inmortalizado en los nombres de paquete del API Swing, que empiezan con "ja vax.swing." Esta seccin se concentra en los componentes Swing. Te ayudaremos a elegir los apropiados para tu GUI, te diremos cmo usarlos, y te daremos la info rmacin que necesites para usarlos de forma efectiva. Explicaremos el Aspecto y Comportamiento Conectable y el soporte de Accesibilidad cuando afecten a la form a de escribir programas Swing. No cubre aquellas caractersitcas del JFC que sl o aparecen en el JDK 1.2. Para informacin sobre ellas, puedes ver Grficos 2D y la Home Page del JFC. Los siguientes grficos muestran tres vistas de un GUI qu e usa componentes Swing. Cada imagen muestra el mismo programa pero con un Aspec to y Comportamiento diferente. El programa, llamado Converter, se explica en det alle al final de la siguiente leccin, Caractersticas y Conceptos Swing. Java L ook & Feel CDE/Motif Look & Feel Windows Look & Feel Qu Versiones Contienen el API Swing? El API Swing se presenta en dos versiones : q JDK 1.2 q JFC 1.1 (para usar con JDK 1.1) La versin que deberas usar depen de de si necesitas usar JDK 1.1 o JDK 1.2. Es ms sencillo usar JDK 1.2, ya que no necesitas aadir libreras para poder usar el API Swing; el JFC construido de ntro del JDK 1.2. Sin embargo, si necesitas usar el JDK 1.1, aadir el API Swing (usando JFC 1.1) no es dficil. Las instrucciones para hacer ambas cosas estn en

Compilar y Ejecutar Programas Swing. Esta seccin describe el API Swing 1.1, que es la versin presente en JDK 1.2 y en la versin llamada 'JFC 1.1 (con Swing 1 .1).' El cdigo de esta seccin, funciona, sin ninguna modificacin, en ambas ve rsiones. Sun ha liberado muchas versiones del JFC 1.1, que estn identificadas p or la versin del API Swing que contienen. Por ejemplo, una versin anterior del JFC 1.1, fue llamada "JFC 1.1 (con Swing 1.0.3)." La siguiente tabla muestra al gunas de las versiones importantes que contienen el API Swing. La fuente en negr ita indica las versiones tpicamente usadas en productos comerciales. Versin de l API Versin del JFC 1.1 Versin del JDK 1.2 Comentarios Swingg Correspondiente Correspondiente JFC 1.1 La primera verin Swing 0.2 ninguna (con Swing 0.2) pb ica del JFC 1.1. La versin del JFC 1.1 incluida en Java JFC 1.1 Plug-in 1.1.1. (con Swing 1.0.3 ninguna Soportada para el Swing 1.0.3) uso en productos comerci ales. La primera versin del JDK 1.2 que usa JFC 1.1 los mismos nombres Swing 1. 1 JDK 1.2 Beta 4 de paquetes Swing (con Swing 1.1 Beta Beta) que la correspondie nte versin del JFC 1.1. La primera versin JFC 1.1 Swing 1.1 con los nombres JD K 1.2 RC1 (con Swing 1.1 Beta 3 finales de los Beta 3) paquetes Swing.

Swing 1.1 Nota: Este es JFC 1.1 el API cubierto (con Swing 1.1) por este tutoria l. JDK 1.2 FCS La primera versin que contiene el API final de Swing 1.1 que est soportada par a el uso en productos comerciales. Java Plug-in 1.1.2 y Java Plug-in 1.2 proporc iona soporte para applets para JDK 1.1 + Swing 1.1 y JDK 1.2, respectivamente. Qu Paquetes Swing Debera Utilizar? El API Swing es poderoso, flexible -- e in menso. Por ejemplo, la versin JFC 1.1 tiene 15 paquetes pblicos: javax.accessi bility, javax.swing, javax.swing.border, javax.swing.colorchooser, javax.swing.e vent, javax.swing.filechooser, javax.swing.plaf, javax.swing.plaf.basic, javax.s wing.plaf.metal, javax.swing.plaf.multi, javax.swing.table, javax.swing.text, ja vax.swing.text.html, javax.swing.tree, y javax.swing.undo. Afortunadamente, la m ayora de los programas slo usan un subconjunto de este API. Esta seccin orden a el API para t, ofreciendo el cdigo ms comn y guindote por los mtodos y c lases que podras necesitar. La mayora del cdigo de esta seccin usa slo uno o dos paquetes swing: q javax.swing q javax.swing.event (no siempre es necesario ) Que tienen de diferente los componentes Swing de los componentes AWT? Si no t e importan los componentes AWT, puedes saltarte esta secccin. Puedes obtener un a introduccin ms general a los componentes Swing en Una ruta rpida por el cd igo de una aplicacin Swing y Caractersticas y Conceptos Swing. Los componentes AWT son aquellos proporcionados por las plataformas JDK 1.0 y 1.1. Aunque JDK 1 .2 todava soporta componentes AWT, recomendamos encarecidamente el uso de compo nente Swing en su lugar. Puedes indentificar los componentes Swing porque sus no mbres empiezan con J. Por ejemplo, la clase button del AWT se llama Button, y la clase buttn de Swing se llama JButton. Los componentes AWT estn en el paquete java.awt, mientras que los componentes Swing estn en

el paquete javax.swing. La mayor diferencia entre los componentes AWT y los comp onentes Swing es que stos ltimos estn implementados sin nada de cdigo nativo . Esto significa que los componentes Swing pueden tener ms funcionalidad que lo s componentes AWT, porque no estn restringidos al denominador comn -- las cara ctersticas presentes en cada plataforma. El no tener cdigo nativo tambin perm ite que los componentes Swing sean vendidos como aadidos al JDK 1.1, en lugar d e slo formar parte del JDK 1.2. Incluso el ms sencillo de los componentes Swin g tiene capacidades que van ms all de lo que ofrecen los componentes AWT. Por ejemplo: q Los botones y las etiquetas Swing pueden mostrar imgenes en lugar de o adems del texto. q Se pueden aadir o modificar fcilmente los bordes dibuja dos alrededor de casi cualquier componente Swing. Por ejemplo, es fcil poner un a caja alrededor de un contenedor o una etiqueta. q Se puede modificar fcilment e el comportamiento o la apariencia de un componente Swing llamando a mtodos o creando una subclase. q Los componentes Swing no tienen porque ser rectangulares . Por ejemplo, los botones pueden ser redondos. q Las tecnologas asistivas como los lectores de pantallas pueden fcilmente obtener informacin desde los compo nentes Swing. Por ejemplo, una herramienta puede fcilmente obtener el texto mos trado en un botn o en una etiqueta. Otra caractersitca Swing es que se puede e specificar el Aspecto y Comportamiento que utilice el GUI de nuestro programa. P or el contrario, los componentes AWT siempre tienen el aspecto y comportamiento de la plataforma nativa. Otra caracterstica interesante es que los componentes Swing con estado usan modelos para mantener el estado. Por ejemplo, un JSlider u sa un objeto BoundedRangeModel para contener su valor actual y un rango de valor es legales. Los modelos se configuran automticamente, por eso no tenemos que tr atar con ellos, a menos que queramos tomar ventaja de la potencia que pueden ofr ecernos. Si ests acostumbrado a usar componentes AWT, necesitars tener cuidado con algunas reglas cuando uses componentes Swing: q Como regla, los programas n o deberan usar componentne de 'peso pesado' junto con componentes Swing. Los co mponentes de peso pesado incluyen todos los componentes AWT listos para usar (co mo Menu y ScrollPane) y todos los componentes que desciendan de las clases Canva s y Panel del AWT. Esta restriccin existe porque

q q q cuando un componente Swing (u otro componente de 'peso ligero') se solapa con co mponentes de peso pesado, ste ltimo siempre se dibuja encima. Para ms informa cin puedes ver Mezclar Componentes de peso ligero y pesado, un artculo de 'The Swing Connection'. Los componentes Swing no son de thread seguro. Si modificas un componente Swing visible -- llamando a su mtodo setText, por ejemplo -- desd e cualquier lugar que no sea el manejador de eventos, necesitas seguir unos paso s especiales para hacer que la modificacin se ejecute en el thread de despacho de eventos. Esto no es ningn problema para la mayora de los programas Swing, y a que el cdigo que modifica los componentes normalmente se encuentra en los man ejadores de eventos. La herencia de contenidos de cualquier ventana o applet que contenga componentes swing debe tener un contenedor de alto nivel Swing como ra z del rbol. Por ejemplo, una ventana principal debera ser implementada como u n ejemplar de JFrame en vez de como un ejemplar de Frame. No se aaden directame nte los componentes a un contenedor de alto nivel como un JFrame. En su lugar, s e aaden los componentes a un contenedor (llamado panel de contenido) que a su v ez est contenido por el JFrame. Convertir a Swing explica ms cosas sobre las diferencias entre los componentes Swing y los componentes AWT.

Swing Compilar y Ejecutar Programas Swing Esta seccin explica cmo compilar e ejecutar una aplicacin Swing. Las instrucc iones de compilacin funcionan para todos los programas Swing -- applets y aplic aciones. Si ests interesados en los applets Swing, deberas leer tambin Ejecut ar Applets Swing. Si no ests intesado en compilar y ejecutar programas Swing, p uedes saltar directamente a Un Ruta Rpida por el Cdigo de una Aplicacin Swing , que te guiar a travs del cdigo de una sencilla aplicacin. Las instruccione s de esta seccin asumen que ya sabes escribir y compilar programas Java. Cmo s e compila un programa Swing depende de si se est utilizando el JDK 1.1 o el JDK 1.2. Usar el JDK 1.2 es un poco ms sencillo porque tiene incluido la versin d e Swing. Elige las instrucciones correspondientes a la versin que ests utiliza ndo: q JDK 1.2 q JDK 1.1 + JFC/Swing Release Las instrucciones explican cmo ejecutar un programa sencillo, llamado SwingAppl ication, cuyo GUI se parece a esto: .

Swing Compilar y Ejecutar Programas Swing (JDK 1.2) qu estn los pasos para compilar y ejecutar nuestro primer programa Swing con el JDK 1.2.: 1. Descargar la ltima versin del JDK 1.2, si no lo has hecho y. 2. Crear un programas que use componentes Swing. 3. Compilar el programa. 4. Eje cutar el programa. Descargar la ltima versin del JDK 1.2 Aqu podrs descargar gratis la ltima versin del JDK 1.2. Crear un Porgrama que Use Componentes Swi ng Puedes usar un programa sencillo que nosotros proporcionamos, llamado SwingAp plication. Por favor, descarga y guarda este fichero: SwingApplication.java. El nombre del fichero debe ser exactamente "SwingApplication.java" incluyendo las m aysculas. Compilar un Programa que usa Componentes Swing El siguiente paso es c ompilar el programa. Compilar un programa Swing con el JDK 1.2 es sencillo, ya q ue los paquetes Swing forman parte del JDK 1.2. Aqu tenemos un ejemplo: javac -deprecation SwingApplication.java Si no puedes compilar SwingApplication.java, ser probablemente porque ests usa ndo un compilador del JDK 1.1 en vez de uno del JDK 1.2, o porque ests usando u na versin beta del JDK 1.2. Deberas poder ejecutar los programas de esta secci n sin cambiarlos si te has actualizado a la versin ms reciente del JDK 1.2. S i debes usar el JDK 1.2 Beta 4, por alguna razn, aqu puedes ver cmo cambiar S wingApplication.java para usar los antiguos nombres de paquetes: //import javax.swing.*; //comment out this line import com.sun.java.swing.*; //u ncomment this line

Puedes ver Nombres de Paquetes Swing para ms informacin sobre los distintos no mbres de paquetes. Ejecutar el Programa Una vez que el programa se ha compilado satisfactoriamente, podemos ejecutarlo. Asumiendo que nuestro programa usa un As pecto y Comportamiento estndard -- como el Aspecto y Comportamiento Java, o Win dows o CDE/Motif -- podemos usar el intrpre del JDK 1.2 para ejecutar el progra mas sin aadir nada al path de clases. Por ejemplo: java SwingApplication Si se usa un Aspecto y Comportamiento no estndard, deberemos asegurarnos de que su paquete est incluido en el path de clases. Por ejemplo: Solaris: java -classpath .:/home/me/lnfdir/newlnf.jar SwingApplication Win32: ja va -classpath .;C:\java\lnfdir\newlnf.jar SwingApplication Nota:No incluyas las clases del JDK 1.2 en el path de clases. El intrprete del 1.2 las encuentra automticamente.

Swing Compilar y Ejecutar Programas Swing (JDK 1.1) Aqu estn los pasos para compilar y ejecutar nuestro primer programa Swing con el JDK 1.2 y JFC/Swing: 1. Descargar la ltima versin del JDK, si no lo has hec ho ya. 2. Descargar la ltima versin del JFC 1.1. 3. Crear un programa que use componentes Swing. 4. Compilar el programa. 5. Ejecutar el programa. Descargar l a ltima Versin del JDK 1.1 Puedes descargar gratis la implementacin de refere ncia del JDK 1.1 desde java.sun.com. Slo tienes que ir a la pgina apropiada pa ra tu plataforma -- Solaris o Win32. Descargar la ltima versin de JFC/Swing Pu edes desacargar la ltima versin del JFC 1.1 en la Home Page del JFC. Esta secc in describe la versin Swing 1.1 del JFC 1.1. Crear un Programa que use Compone ntes Swing Puedes usar un programa sencillo que nosotros proporcionamos, llamado SwingApplication. Por favor, descarga y guarda este fichero: SwingApplication.j ava. El nombre del fichero debe ser exactamente "SwingApplication.java" incluyen do las maysculas. Compilar un Programa que use Componentes Swing El siguiente p aso es compilar el programa. Aqu puedes ver una explicacin general de cmo com pilar una aplicacin Swing con el JDK 1.1: 1. Anota dnde se encuentra tu copia del JFC 1.1 (Swing 1.1). El archivo de clases Swing swing.jar, est en el direct orio superior de esta versin. Podras querer crear una variable de entorno llam ada SWING_HOME que contenga el path del directorio superior de la

versin del JFC 1.1. Nota: No descomprimas el archivo swing.jar! 2. Anota dnde est instalada tu versin del JDK. Necesitas esto para poder encontrar las versi ones apropiadas de las clases del JDK y el intrprete. Podras querer crear una variable de entorno llamada JAVA_HOME que contenga el path del directorio superi or de la versin del JDK. Las clases del JDK estn en el directorio lib del JDK, en un fichero llamado classes.zip. No descomprimas este fichero!. El intrprete Java est en el directorio bin del JDK. 3. Compila la aplicacin especificando un classpath que incluya el fichero swing.jar, el fichero classes.zip, y el dire ctorio que contenga las clases del programa (normalmente "."). Asegurate de que el fichero classes.zip y el compilador utilizado son exactamente de la misma ver sin del JDK!. El siguiente ejemplo muestra cmo compilar SwingApplication en un sistema UNIX. Asume que has configurado las variables de entorno JAVA_HOME y SW ING_HOME. $JAVA_HOME/bin/javac -classpath .:$SWING_HOME/swing.jar: $JAVA_HOME/lib/classes. zip SwingApplication.java Si eliges no usar variables de entorno, podras usar un comando como ste: javac -classpath .:/home/me/swing-1.1/swing.jar: /home/me/jdk1.1.7/lib/classes.z ip SwingApplication.java Aqu puedes ver un ejemplo de compilacin sobre Win32: %JAVA_HOME%\bin\javac -deprecation -classpath .;%SWING_HOME%\swing.jar;%JAVA_HOM E%\lib\classes.zip SwingApplication.java Aqu puedes ver una alternativa que no usa variables de entorno: javac -deprecation -classpath .;C:\java\swing-1.1\swing.jar; C:\java\jdk1.1.7\li b\classes.zip SwingApplication.java Nota: Si no puedes compilar SwingApplication.java, probablemente ser debido a q ue no tienes los ficheros correctos en el classpath o a que ests usando una ver sin del JFC 1.1 que tiene un API Swing antiguo. Deberas poder ejecutar los pro gramas de esta seccin sin cambiarlos si te has actualizado a la versin ms rec iente del JFC 1.1. Antes de la Beta 3 de Swing 1.1, el API Swing usaba nombres d e paquetes diferentes. Aqu puedes ver cmo modificar

SwingApplication.java para usar los antiguos nombres de paquetes: //import javax.swing.*; //comment out this line import com.sun.java.swing.*; //u ncomment this line Puedes ver Nombres de Paquetes Swing para ms informacin sobre los distintos no mbres de paquetes. Ejecutar el Programa Una vez que el programa se ha compilado satisfactoriamente, podemos ejecutarlo. Asegurate de que el classpath del intrp rete no slo incluye lo que necesites para compilar el fichero, sino que tambin debe incluir el fichero para el Aspecto y Comportamiento que use el programa. E l Aspecto y Comportamiento Java, que es el valor por defecto, est en el fichero swing.jar. El Aspecto y Comportamiento Windows est en windows.jar, y el Aspect o y Comportamiento CDE/Motif est en motif.jar. No ests limitado a estas opcion es de Aspecto-y-Comportamiento; puedes usar cualquier otro Aspecto y Comportamie nto diseado para usarse con el API de Swing 1.1. Esta aplicacin usa el Aspecto y Comportamiento Java, por eso slo necesitamos swing.jar en el path de clases. As, el comando para ejecutarlo sera similar al comando para compilarlo. Slo hay que sustituir java por javac, y eliminar el sufijo .java. Por ejemplo, en UN IX: java -classpath .:/home/me/swing-1.1/swing.jar: /home/me/jdk1.1.7/lib/classes.zi p SwingApplication Aqu hay un ejemplo de ejecucin de una aplicacin que usa el Aspecto y Comporta miento Windows: %JAVA_HOME%\bin\java -classpath .;%SWING_HOME%\swing.jar; %JAVA_HOME%\lib\classe s.zip;%SWING_HOME%\windows.jar SomeClass Mientras ests desarrollando tu aplicacin puedes simplificar el path de clases usando swingall.jar, que incluye todas las clases de la versin JFC 1.1. Por eso en lugar de poner swing.jar y windows.jar en tu path de clases, por ejemplo, pu edes poner slo swingall.jar. Importante: Evita usar swingall.jar en tu aplicaci n final, contiene informacin usada por desarrolladores, as cmo los paquetes de Aspecto y Comportamiento que usa una aplicacin tpica. Puedes disminuir el t amao usando slo el fichero swing.jar adems de los arhivos de Aspecto y

Comportamiento que necesites.

Swing Ejecutar un Applet Swing Se pueden ejecutar applets Swing en cualquier navegador que tenga instalado el J ava Plug-in. Otras opciones son utilizar un navegador que sea complatible con el JDK 1.1 y que pueda encontrar las clases Swing, o un navegador que sea compatib le con el JDK 1.2. Actualmente, el nico navegador compatible 1.2 disponible es la utilidad AppletViewer proporcionada con el JDK 1.2. Para obtener informacin sobre como configurar los navegadores compatibles 1.2 para que tabajen con Swing , puedes darte una vuelta por Hacer nuestro Navegador Swing, un artculo de "The Swing Connection". La nica diferencia requerida entre un applet no-swing y otr o applet swing, es que ste ltimo debe descender de la clase JApplet, en vez de hacerlo directamente de la clase Applet. Para ms informacin sobre los applets puedes ver Introduccin a los Applets Puedes ver una caja debajo de este prra fo que contiene el texto: "You are successfully running a Swing applet"? Si es a s, tu navegador est configurado correctamente. Nota: Como el applet anterior u tiliza Java Plug-in 1.1.1, es una versin Swing 1.0.3 del applet. Para ejecutar la versin Swing 1.1 Beta 3 del applet, podemos utilizar el AppletViewer para ve r HelloSwingApplet.html, especificando swing.jar en el path de clases del Applet Viewer. Puedes encontrar el cdigo fuente del applet en HelloSwingApplet.java, y el cdigo HTML para incluir el applet viendo el cdigo de sta misma pgina. La mala noticia es que el cdigo HTML para incluir el applet es un poco enrevesado . La buena noticia es que se puede generar el cdigo HTML para una sencilla etiq ueta automticamente. Puedes ver la documentacin del Java Plug-in para obtener detalles sobre cmo descargar un conversor HTML gratis. Aqu puedes ver un applet ms complejo, con mltiples ficheros de clases y un fichero de imagen . El cdigo del applet est en AppletDemo.java. Tambin utiliza el fichero ../im ages/middle.gif. El resto de esta pgina ofrece instrucciones paso a paso para e jecutar los applets anteriores.

Paso a Paso: Ejecutar un Applet Basado en Swing 1. Encontrar un navegador compat ible 1.1 1,2, o descargar el Java Plug-in dentro de un navegador compatible. A segurate de que tienes la ltima versin tanto del navegador como del plug-in, y a que las ltimas versiones tienden a corregir errores que hacen que Swing funci one mejor. Los dos navegadores Java 1.1 son HotJava browser y el Applet Viewer ( appletviewer), que se distribuye con el JDK. Una versin 1.2 del Appletviewer se distribuye en el JDK 1.2. El Java Plug-in lo soportan varias versiones de Netsc ape Navigator e Internet Explorer; puedes ver la Documentacin del Java Plug-in para obtener ms detalles. 2. Si ests utilizando un navegador compatible 1.1 si n el Java Plug-in, determina cmo cargar el fichero Swing JAR en tu navegador. P uedes ver Configurar el Path de Clases del Navegador para ver un ejemplo de cmo poner un fichero JAR de Swing en el path de clases del Appletviewer. Puedes ver Make Your Browser Swing en The Swing Connection para ver cmo hacer lo mismo co n Internet Explorer y Netscape Navigator. 3. Apunta a esta pgina.

Swing Una Ruta Rpida por el Cdigo de una Aplicacin Swing Esta pgina te lleva a travs del cdigo del programa SwingApplication. La sigui ente leccin, Caractersticas y Conceptos Swing, proporciona explicaciones compl etas sobre los tpicos introducidos en esta seccin. Tambin proporciona, un eje mplo mayor y ms realista, que puedes usar para ampliar y probar tus conocimient os sobre Swing. La aplicacin SwingAplication presentada en la seccin anterior es muy sencilla. Trae una ventana que se parece a sta: Cada vez que el usuario pulsa el botn, la etiqueta se actualiza. Puedes encontr ar el programa completo en SwingApplication.java. Esta pgina explica el program a en detalle, incluyendo los siguientes aspectos: q Importar paquetes Swing q q q q q q q q Elegir el Aspecto y Comportamiento Configurar el Contenedor de alto nivel Config urar botones y etiquetas Aadir Componentes a los Contenedores Aadir Bordes alr ededor de los Componentes Manejar Eventos Tratar con los problemas de Threads So portar Tecnologas Asistivas Importar paquetes Swing La siguiente lnea 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 ms detalles. Los programas Swing tambin necesitan clases de los paquetes principales del AWT: import java.awt.*; import java.awt.event.*; Elegir el Aspecto y Comportamiento Aqu puedes ver el cdigo que utiliza SwingAp plication para seleccionar su aspecto y comportamiento: public static void main(String [] args) { try { UIManager.setLookAndFeel( UIMana ger.getCrossPlatformLookAndFeelClassName()); } catch (Exception e) { } ..//Crea y muestra el GUI... } El cdigo anterior, esencialmente dice, "No me importa si el usuario a elegido u n aspecto y comportamiento -- utiliza el aspecto y comportamiento multi-platafor ma." Esta aproximacin dictatorial tiene sentido cuando el program ha sido dise ado con un aspecto y comportamiento particular en mente. El aspecto y comportami ento multi-plataforma es conocido como Aspecto y Comportamiento Java (con el nic k "Metal"). Para ms informacin sobre cmo especificar el aspecto y comportamie nto, puedes ver la pgina Cmo Seleccionar el Aspecto y Comportamiento Configura r el Contenedor de Alto Nivel Todo programa que presente un GUI Swing contiene a l menos un contenedor Swing de alto nivel. Para la mayora 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 ob jeto JApplet implementa un rea de pantalla de un applet dentro de una ventana d el navegador. Un contenedor de Alto Nivel Swing porporciona el soporte que neces itan los componentes Swing para realizar su dibujado y su manejo de eventos. El ejemplo SwingApplication tiene un slo contenedor de alto nivel, un JFrame. Cuan do el usuario cierra el frame, la aplicacin finaliza. Aqu est el cdigo que c onfigura 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(WindowE vent e) { System.exit(0); } }); frame.pack(); frame.setVisible(true); } } Para ms informacin sobre los contenedores de alto nivel puedes ver Los Compone ntes Swing y el rbol de Herencia de Contenedores Configurar los Botones y las E tiquetas Como la mayora de los GUIs, el ejemplo de SwingApplication contiene un botn y una etiqueta. (Al contrario que la mayora de los GUIs, esto es todo lo que tiene SwingApplication). Aqu podemos ver el cdigo que inicializa el botn : JButton button = new JButton("I'm a Swing button!"); button.setMnemonic('i'); bu tton.addActionListener(this); La primera lnea crea el botn, La segunda lnea selecciona la letra "i" como mn emnico que el usuario puede utilizar para simular un click del botn. Por ejemp lo, en el Aspecto y Comportamiento Metal, teclear Alt+i resulta en un click del botn. La tercera lnea registra un manejador de eventos para el click del botn . Podremos ver el cdigo del manejador de eventos en Menajear Eventos. Aqu pode mos ver el cdigo 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 initializati on code: final JLabel label = new JLabel(labelPrefix + "0 "); ... label.setLabel For(button); ...//in the event handler for button clicks: label.setText(labelPre fix + numClicks); El cdigo anterior es bastante conocido, excepto la lnea que invoca al mtodo s etLabelFor. Este cdigo existe slo para indicar a las tecnologas asistivas que la etiqueta describe el botn. Para ms informacin, puedes ver Supporting Assi stive Technologies. Finalmente, aqu est el cdigo que inicializa el panel: JPanel pane = new JPanel(); pane.setBorder(BorderFactory.createEmptyBorder(30, 3 0, 10, 30)); pane.setLayout(new GridLayout(0, 1)); pane.add(button); pane.add(la bel); Para ms informacin sobre los componentes Swing como los botones y las etiqueta s, puedes ver Usar Componentes Swing Aadir Componentes a los Contenedores Swing Application agrupa la etiqueta y el botn en un contenedor (un JPanel) antes de aadir los componentes al frame. Aqu est el cdigo

que inicializa el panel: JPanel pane = new JPanel(); pane.setBorder(BorderFactory.createEmptyBorder(30, 3 0, 10, 30)); pane.setLayout(new GridLayout(0, 1)); pane.add(button); pane.add(la bel); La primera lnea de cdigo crea el panel. La segunda le aade un borde; explicar emos los bordes ms tarde. La tercera lnea de cdigo crea un controlador de dis tribucin que fuerza el contenido del panel a dibujarse en una sla columna. La ltima lnea aade el botn y la etiqueta al panel. Aadir el botn y la etiquet a al panel significa que estn controlados por el controlador de distribucin de l panel. Especficamente, el controlador de distribucin de un contenedor determ ina el tamao y la posicin de cada componente que haya sido aadido al contened or. Los conceptos de los controladores de distribucin se describen en Controlad ores de Distribucin. Para aprender cmo usar controladores de distribucin indi viduales, puedes ver la leccin Distribuir Componentes Dentro de un Contenedor. Aadir Bordes Alrededor de los Componentes Aqu est, de nuevo, el cdigo que a ade el borde al JPanel: pane.setBorder(BorderFactory.createEmptyBorder( 30, //top 30, //left 10, //botto m 30) //LEFT ); Este borde simplemente proporciona un espacio en blanco alrededor del panel de c ontenidos -- 30 pixels extras en la parte superior, izquierda y derecha y 10 pix els extras en la parte inferior. Los bordes son una caractersitcas que JPanel d e la clase Component. Los conceptos de los bordes se describen en Control de la distribucin y en Dibujo Manejar Eventos El ejemplo SwingApplication contiene do s manejadores de eventos. Uno maneja las pulsaciones del botn (eventos action) y otro maneja los eventos de cerrar ventana: button.addActionListener(new ActionListener() { public void actionPerformed(Acti onEvent e) { numClicks++; label.setText(labelPrefix + numClicks); } }); ... fram e.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 slo ocurre manipula cin 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 aplicacin, no existe la posibilidad de que dos threads intenten manipular el GUI a la vez. Sin embargo, es fcil introducir problemas de threads en un programa. Puedes ver Threads y Swing para ms informacin sobre los threads seguros en Swing. Soport ar Tecnologas Asistivas El soporte para tecnologas asistivas -- dispositivos c omo lectores de pantalla que proporcionan formas alternativas de acceder a la in formacin de un GUI -- ya est incluido en cada componente Swing. El nico cdig o que existen en SwingApplication que maneja el soporte de tecnologas asistivas es este: label.setLabelFor(button); Adems, la siguientes lneas seleccionan la informacin que puede ser utilizada por tecnologas 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"); Puedes ver Soportar Tecnologas Asistivas para ms informacin sobre cmo asegur arte de que tu programa funciona bien con herramientas que usan el API de accesi bilidad para pedir componentes.

Swing Caractersticas y Conceptos Swing Esta leccin presenta las caractersticas de Swing y explica todos los conceptos que necesitas para poder utilizar los componentes Swing de forma efectiva. Al f inal de est leccin diseccionamos un programa Swing, como revisin de todo lo q ue has aprendido. Los Componentes Swing y el rbol de Contenedores Esta seccin muestra todos los componentes Swing y te cuenta como combinarlos, en general, pa ra crear un GUI. Swing proporciona muchos componentes GUI estndards como botone s, listas, mens, y reas de texto. Tambin incluye contenedores como ventanas y barras de herramientas. Control de la Distribucin Los Contenedores usan contro ladores de ditribucin para determinar el tamao y la posicin de los componente s que contienen. Los bordes afectan a la distribucin de un GUI Swing haciendo l os componentes ms grandes. Tambin puedes usar componentes invisibles que afect en a la distribucin. Manejo de Eventos El Manejo de Eventos es la forma en que los programas responden a los eventos externos, como una pulsacin de usuario, L os programas Swing realizan todo su dibujado y menejo de eventos en el thread de despacho de eventos. Dibujado Dibujado significa el dibujo del componente en la pantalla. Aunque es sencillo personalizar el dibujado de un componente, la mayo ra de los programas lo ms complicado que hacen es personalizar el borde del co mponente. Threads y Swing Si haces algo a algn componente visible que podra af ectar o depender

de su estado, necesitas hacerlo desde el thread de despacho de eventos. Esto no es ningn problema para la mayora de los programas sencillos, que generalmente se refieren a los componentes slo desde el cdigo de manejo de eventos. Sin emb argo, otros programas necesitan usar el mtodo invoekLater para ejecutar las lla madas al componente relacionado desde el thread de despacho de eventos. Ms Cara ctersticas y Conceptos Swing Esta seccin presenta todava ms caractersticas y conceptos Swing, con enlaces a dnde encontrar ms informacin sobre ellas. Lo s tpicos incluyen, las caractersitcas de la clase JComponent, iconos, actions, soporte de Aspecto y Comportamiento Conectable, Tecnologas Asistivas y modelos separados. La Anatoma de un Programa Swing Esta seccin desmenuza una aplicaci n Swing, llamada 'Converter' para revisar cmo funcionan los programas Swing.

Swing Los Componentes Swing y el rbol de Contenidos Esta seccin presenta algunos de los componentes ms utilizados de Swing y expli ca como los componentes de un GUI entran juntos en un contenedor. Para ilustrarl o, usaremos el programa SwingApplication presentado en Una Ruta Rpida por el C digo de una Aplicacin Swing. Y aqu est su aspecto de nuevo: SwingApplication crea cuatro componentes Swing muy utilizados: q un frame, o ven tana principal (JFrame) q un panel, algunas veces llamado pane (JPanel) q un bot n (JButton) q una etiqueta (JLabel) El frame es un contenedor de alto nivel. Ex iste principalmente para proporcionar espacio para que se dibujen otros componen tes Swing. Los otros contenedores de alto nivel ms utilizados son los dilogos (JDialog) y los applets (JApplet). El panel es un contenedor intermedio. Su nic o propsito es simplificar el posicionamiento del botn y la etiqueta. Otros con tenedores intermedios, como los paneles desplazables, (JScrollPane) y los panele s con pestaas (JTabbedPane), tpicamente juegan un papel ms visible e interact ivo en el GUI de un programa. El botn y la etiqueta son componentes atmicos -componentes que existen no para contener otros componentes Swing, sino como ent idades auto-suficientes que representan bits de informain para el usuario. Frec uentemente, los componentes atmicos tambin obtienen entrada del usuario. El AP I Swing proporciona muchos componentes atmicos, incluyendo combo boxes (JComboB ox), campos de texto (JTextField), y tablas (JTable). Aqu podemos ver un digra ma con el rbol de contenidos de la ventana mostrada por SwingApplication. Este digrama muestra todos los contenedores creados o usados por el programa, junto con los componentes que contienen.

Observa que si aadimos una ventana -- por ejemplo, un dilogo -- la nueva venta na tendra su propio rbol de contenidos, independiente del mostrado en esta fig ura. JFrame (un contenedor de algo nivle) ... panel de contenido JPanel +----------------+ JButton JLabel Como muestra la figura, incluso el program a Swing ms sencillo tiene mltiples niveles en su rbol de contenidos. La raz del rbol de contenidos es siempre un contenedor de alto nivel. Este contenedor proporciona espacio para que sus componentes Swing descendentes se dibujen a s mismo. Truco: Para ver el rbol de contenidos de cualquier frame o dilogo, puls a el borde para seleccionarlo y pulsa Control-Shift-F1. Se escribir una lista c on el rbol de contenidos en el stream de salida estndard. Todo contenedor de a lto nivel contiene indirectamente un contenedor intermedio conocido como panel d e contenido. Para la mayora de los programas no necesitas saber qu pasa entre el contenedor de alto nivel y su panel de contenido. (Si realmente quieres verlo , puedes ver Cmo usar Paneles Raz.) Cmo regla general, el panel de contenido contiene, directamente o indirectamente, todos los componentes visibles en el GU I de la ventana. La gran excepcin a esta regla es que si el contenedor de alto nivel tiene una barra de men, entonces sta se sita en un lugar especial fuera del panel de contenido. Para aadir componentes a un contenedor, se usa una de las distintas formas del mtodo add. Este mtodo tiene al menos un argumento -el componente a aadir. Algunas veces se requiere un argumento adicional para pr oporcionan informacin de distribucin. Por ejemplo, la ltima lnea del siguien te cdigo de ejemplo especifica que el panel debera estar en el centro de su co ntenedor (el panel de contenido). frame = new JFrame(...); button = new JButton( ...); label = new JLabel(...); pane = new JPanel(); pane.add(button);

pane.add(label); frame.getContentPane().add(pane, BorderLayout.CENTER); Para ver todos los componentes Swing puedes ir a la pgina Un ndice visual de los Compo nentes Swing.

Swing Control de Distribucin Las siguientes figuras muestran los GUIs de cinco programas, cada uno de ellos m uestra cinco botones. Los botones son idnticos, y el cdigo de los programas es casi idntico. Entonces por qu parecen tan diferentes? Porque usan diferentes controladores de distribucin para controlar el tamao y posicin de los botone s. Control de Distribucin es el proceso de determinar el tamao y posicin de los componentes. Por defecto, cada contenedor tiene un controlador de distribucin - un objeto que realiza el control de la distribucin de los componentes dentro del contenedor. Los componentes pueden proporcionarle al controlador de disposic in sus preferencias en cuanto a tamao y alineamiento, pero la ltima palabra l a tiene el controlador de disposicin. La plataforma Java suministra cinco contr oladores de disposicin comunmente utilizados: BorderLayout, BoxLayout, FlowLayo ut, GridBagLayout, y GridLayout. Estos controladores de distribucin estn dise ados para mostrar mltiples componentes a la vez, y se han visto en la figura an terior. Una sexta clase proporcionada, CardLayout, es un controlador de disposic in de propsito general usado en combinacin con otros controladores de distrib ucin. Puedes encontrar detalles sobre cada uno de estos seis controladores, inc luyendo claves para elegir el apropiado, en Usar Controladores de Distribucin. Siempre que se use el mtodo add para poner un componente en un contenedor,

debemos tener en cuenta el controlador de distribucin del contenedor. Algunos c ontroladores como BorderLayout requiere que especifiquemos la posicin relativa del componente en el contenedor, usando un argumento extra para el mtodo add. O casionalmente, un controlador de distribucin como GridBagLayout requiere elabor ados procesos de configuracin. Sin embargo, muchos controladores de distribuci n simplemente sitan los componentes en el orden en que fueron aadidos a su con tenedor. Todos esto probablemente suena ms complicado de lo que s. Si quieres puedes copiar el cdigo de nuestros ejemplos de Usar Componentes Swing o buscar el controlador de distribucin individual en Usar Controladores de Distribucin. Generalmente, slo tendrs que seleccionar el controlador de distribucin de do s tipos de contenedores: paneles de contenido (que usan BorderLayout por defecto ) y JPanel (que usan FlowLayout por defecto). El resto de esta seccin describe algunas de las tareas ms comunes de la distribucin: q Seleccionar el Controlad or de Distribucin q q q Proporcionar Consejos sobre un Componente Poner Espacio entre Componentes Cmo O curre el Control de Distribucin Seleccionar el Controlador de Distribucin Podemos cambiar fcilmente el control ador de distribucin que usa un contenedor. Slo se debe llamar al mtodo setLay out del contenedor. Por ejemplo, aqu est el cdigo que hace que un panel use B orderLayout: JPanel pane = new JPanel(); pane.setLayout(new BorderLayout()); Aun que recomendamos que uses controladores de distribucin, se puede realizar la di stribucin sin ellos. Seleccionando una propiedad de distribucin del contenedor a nulo, podemos hacer que el contenedor no use ningn controlador de distribuci n. Con este esquema, llamado posicionamiento absoluto, podemos especificar el t amao y posicin de cada componente dentro del contenedor. Una desventaja del po sicionamiento absoluto es que no se ajusta bien cuando se redimensiona el conten edor de alto nivel. Tampoco se ajusta bien a las diferencias entres usuarios y s istemas, como los diferentes tamaos de fuente. Proporcionar Consejos sobre un C omponente

Algunas veces necesitamos personalizar el tamao que un componente proporciona a l controlador de distribucin del contenedor, para que el componente se vea bien . Se puede hacer esto proporcionando los tamaos mnimo, preferido y mximo del componente. Tambin podemos llamar a los mtodos de seleccin de tamao del comp onente -- setMinimumSize, setPreferredSize, y setMaximumSize -- o podemos crear una subclase del componente que sobreescriba los mtodos apropiados -- getMinimu mSize, getPreferredSize, y getMaximumSize. Actualmente, el nico controlador de distribucin en la plataforma Java que presta atencin a la peticin de tamao m ximo del componente es BoxLayout. Adems de proporcionar preferencias de tamao , podemos especificar preferencias de alineamiento. Por ejemplo, podemos especif icar que los bordes superiores de dos componentes deberan estar alineados. Se s eleccionan los consejos de alineamiento llamando a los mtodos setAlignmentX y s etAlignmentY del componente, o sobreescribiendo los mtodos, getAlignmentX y get AlignmentY del componente. Realmente BoxLayout es el nico controlador de distri bucin que presta atencin a los consejos de alineamiento. Poner Espacio entre C omponentes Tres factores influyen en la cantidad de espacio entre los componente s visibles de un contenedor: El controlador de distribucin Algunos controladore s de distribucin ponen automticamente espacio entre los componentes; otros no. Algunos permiten incluso especificar la cantidad de espacio entre los component es. Puedes ver Distribuir Componentes dentro de un Contenedor sobre el soporte d e espaciado de cada controlador de distribucin. Componentes invisibles. Se pued en crear componentes de peso ligero que no realicen dibujo, pero que ocupen espa cio en el GUI. Frecuentemente se usan los componentes invisibles en contenedores controlados por BoxLayout. Puedes ver Cmo usar BoxLayout para ver ejemplos de uso de componentes invisibles. Bordes vacos No importa cual sea el controlador de distribucin, podemos afectar la aparente cantidad de espacio entre component es aadiendoles bordes. Los mejores candidatos para los bordes vacos son los qu e tpicamente no tienen bordes, como los paneles y las etiquetas. Algunos otros componentes, como paneles desplazables, no funcionan bien con bordes en algunas implementaciones del

Aspecto y Comportamiento, debido a la forma en que implementan su cdigo de dibu jo. Para ms informacin sobre los bordes puedes ver Cmo usar Bordes. Cmo Ocur re el Control de Distribucin Aqu hay un ejemplo de secuencia de control de dis tribucin para un frame (JFrame). 1. Despus de que el GUI est construido, se l lama al mtodo pack sobre el JFrame. Esto especifica que el frame debera ser de su tamao preferido. 2. Para encontrar el tamao preferido del frame, el contro lador de distribucin aade el tamao de los lados del frame al tamao preferido del componente directamente contenido por el frame. Esto es la suma del tamao preferido del panel de contenido, ms el tamao de la barra de men del frame, s i existe. 3. El controlador de disposicin del panel de contenido es responsable de imaginarse el tamao preferido del panel de contenido. Por defecto, este con trolador de disposicin es un objeto BorderLayout. Sin embargo, asumamos que lo hemos reemplazado con un objeto GridLayout que se ha configurado para crear dos columnas. Lo interesante de gridlayout es que fuerza a que todos los componentes sean del mismo tamao, e intenta hacerlos tan anchos como la anchura preferida del componente ms ancho, y tan altos como la altura preferida del componente m s alto. Primero, el controlador gridlayout pregunta el panel de contenido por su insets -- el tamao del borde del panel de contenido, si existe. Luego, el cont rolador de gridlayout le pregunta a cada componente del panel de contenido sus t amaos preferidos, anotando la mayor anchura preferida y la mayor altura preferi a. Luego calcula el tamao preferido del panel de contenido. 4. Cuando a cada bo tn se le pide su tamao preferido, el botn primero comprueba si el usuario ha especificado un tamao preferido. Si es as, reporta este tamao. Si no es as, le pregunta a su Aspecto y Comportamiento el tamao preferido. El resultado fina l es que para determinar el mejor tamao de un frame, el sitema determina los ta maos de los contenedores en la parte inferior del rbol de contenidos. Estos ta maos filtran el rbol de contenidos, eventualmente determinan el tamao total d el frame. De forma similar ocurren los clculos cuando se redimensiona el frame. Para ms informacin sobre control de distribucin, puedes ir a Distribuir Comp onentes Dentro de un Contenedor.

Swing Manejo de Eventos Cada vez que el usuario teclea un caracter o pulsa un botn del ratn, ocurre un evento. Cualquier puede ser notificado del evento. Todo lo que tiene que hacer es implementar el interface apropiado y ser registrado como un oyente de evento del evento fuente apropiado. Los componentes Swing puede generar muchas clases d e evento. Aqu hay unos pocos ejemplos: Accin que resulta en el evento El usuar io pulsa un botn, presiona Return mientras teclea en un campo de texto, o elige un tem de men. El usuario elige un frame (ventana principal). El usuario puls a un botn del ratn mientras el cursor est sobre un componente. El usuario mue ve el cursor sobre un componente. El componente se hace visible. El componente o btiene obtiene el foco del teclado. Cambia la tabla o la seleccin de una lista. Tipo de oyente ActionListener WindowListener MouseListener MouseMotionListener ComponentListener FocusListener ListSelectionListener Cada evento est representado por un objeto que ofrece informacin sobre el even to e identifica la fuente. Las fuentes de los eventos normalmente son componente s, pero otros tipos de objetos tambin pueden ser fuente de eventos. Como muestr a la siguiente figura, cada fuente de evento puede tener varios oyentes registra dos. Inversamente, un slo oyente puede registrarse con varias fuentes de evento s. event event object /----> event listener source ---------------------------> event listener \----> event listener Descripcin: Mltiples oyentes pueden ser r egistrados para ser notificados de eventos de un tipo particular sobre una fuent e particular. Cuando queramos detectar los eventos de un componente determinado, primero debemos chequear la seccin "Cmo se usa" el componente. Esta seccin o frece ejemplos de manejo de eventos de los que querrs utilizar. Por ejemplo, C mo crear Frames ofrece un ejemplo de escritura de un oyente de window que sale d e la aplicacin cuando se cierra el frame. Cmo Implementar un Manejador de Even tos

Todo manejador de eventos requiere tres partes de cdigo: 1. Donde se declare la clase del manejador de eventos, el cdigo especifica que la clase o implementa un interface de oyente, o desciende una clase que implementa un interface de oye nte. Por ejemplo: public class MyClass implements ActionListener { 2. El cdigo que registra un ejemplar de la clase de manejo de eventos de un oynete sobre uno o ms componentes. Por ejemplo: someComponent.addActionListener(instanceOfMyCla ss); 3. La implementacin de los mtodos del interface oyente. Por ejemplo: publ ic void actionPerformed(ActionEvent e) { ...//code that reacts to the action... } Un escenario de manejo de eventos tpico ocurre con los botones (JButton). Par a detectar cuando el usuario pulsa un botn de la pantalla (o pulsa la tecla equ ivalente), un programa debe tener un objeto que implementa el interface ActionLi stener. El programa debe registrar este objeto como un oyente de actin del bot n (la fuente del evento), usando el mtodo addActionListener. Cuando el usuario pulsa el botn de la pantalla, ste dispara el evento action, Esto resulta en un a llamada al mtodo actionPerformed del oyente de action, el nico mtodo del in terface ActionListener). El nico argumento del mtodo es un objeto ActionEvent que ofrece informacin sobre el evento y su fuente. ActionEvent button ---------------------------> action listener Descripcin: Cuando el usuario pulsa un bot n, los oyentes de action del botn son notificados. Los manejadores de eventos pueden ser ejemplares de cualquier clase. Frecuentemente, se implementan usando clases internas annimas, lo que puede hacer el cdio algo ms confuso -- hasta que hayas usado las clases internas. Para ms informacin sobre el uso de clases internas, puedes ver Usar Adaptadores y Clases Internas para Manejar Eventos. P ara ms informacin sobre la implementacin de manejo de eventos, puedes ver Esc ribir Oyentes de Eventos. Los Threads y el Manejo de Eventos El cdigo de manejo de eventos se ejecuta en un slo threadm el thread de despacho de eventos. Esto asegura que todo manejador de eventos se

terminar de ejecutar antes de ejecutar otro. Por ejemplo, el mtodo actionPerfo rmed del ejemplo anterior se ejecuta en el thread de manejo de eventos. El cdig o de dibujo tambin se realiza en el thread de despacho de eventos. Esto signifi ca que mientras se est ejecutando el mtodo actionPerformed, el GUI del program a est congelado -- no se dibujar nada ni se responder a las pulsaciones del r atn, por ejemplo. Importante: El cdigo de manejo de eventos debera ejecutar c ada pulsacin! De otro modo, el rendimiento de tu programa se vera empobrecido. Si necesitas hacer una operacin de larga operacin como resultado de un evento , hazlo arrancando un nuevo thread (o de otro modo envindo una peticin a otro thread) para realizar la operacin. Para obtener ayuda sobre le uso de threads, puedes ver Cmo usar Threads.

Swing Dibujo Podras no necesitar la informacin de esta seccin, en absoluto. Sin embargo, s i tus componentes parece que no se dibujan correctamente, entender los conceptos de esta seccin podra ayudarte a ver qu hay errneo. De igual modo, necesitar s entender esta seccin si creas cdigo de dibujo personalizado para un compone nte. Cmo funciona el dibujo Cuando un GUI Swing necesita dibujarse a s mismo - la primera vez, o en respuesta a la vuelta de un ocultamiento, o porque necesi ta reflejar un cambio en el estado del programa -- empieza con el componente ms alto que necesita ser redibujado y va bajando por el rbol de contenidos. Esto est orquestado por el sistema de dibujo del AWT, y se ha hecho ms eficiente me diante el manejador de dibujo de Swing y el cdigo de doble buffer. Los componen tes Swing generalmente se redibujan a s mismos siempre que es necesario. Por ej emplo, cuando llamamos al mtodo setText de un componente, el cmponente debera redibujarse automticamente a s mismo, y si es necesario, redimensionarse. Si no lo hace as es un bug. El atajo es llamar al mtodo repaint sobre el componen te para pedir que el componente se ponga en la cola para redibujado. Si se neces ita cambiar el tamao o la posicin del componente pero no automticamente, debe ramos llamar al mtodo revalidate sobre el componente antes de llamar a repaint . Al igual que el cdigo de manejo de eventos, el cdigo de dibujo se ejecuta en el thread del despacho de eventos. Mientras se est manejando un evento no ocur rir ningn dibujo. De forma similar, si la operacin de dibujado tarda mucho ti empo, no se manejar ningn evento durante ese tiempo. Los programas slo deber an dibujarse cuando el sistema de dibujo se lo diga. La razn es que cada ocurre ncia de dibujo de un propio componente debe ser ejecutado sin interrupcin. De o tro modo, podran ocurrir resultados imprecedibles. como que un botn fuera dibu jado medio pulsado o medio liberado. Para acelerar, el dibujo Swing usa doble-bu ffer por defecto -- realizado en un buffer fuera de pantalla y luego lanzado a l a pantalla una vez

finalizado. Podra ayudar al rendimiento si hacemos un componente Swing opaco, p ara que el sistema de dibujo de Swing pueda conocer lo que no tiene que pintar d etrs del componente. Para hacer opaco un componente Swing, se llama al mtodo s etOpaque(true) sobre el componente. Los componentes no-opacos de Swing puede par ecer que tienen cualquier forma, aunque su rea de dibujo disponible es siempre rectangular. Por ejemplo, un botn podra dibujarse a s mismo dibujando un oct gono relleno. El componente detrs del botn, (su contenedor, comunmente) sera visible, a travs de las esquinas de los lados del botn. El botn podra necesi tar incluir cdigo especial de deteccin para evitar que un evento action cuando el usuario pulsa en las esquinas del botn. Un Ejemplo de Dibujo Para ilustrar el dibujado, usaremos el programa SwingApplication, que se explic en Una Ruta R pida a travs del Cdigo de una Aplicacin Swing. Aqu podemos ver el GUI de Sw ingApplication: Y aqu su rbol de contenidos: JFrame (a top-level container) ... content pa ne JPanel +----------------+ JButton JLabel Aqu est lo que sucede cuan do se dibuja el GUI de SwingApplication: 1. El contenedor de alto nivel, JFrame, se dibuja as s mismo. 2. El panel de contenido primero dibuja su fondo, que es un rectngulo

slido de color gris. Luego le dice al JPanel que se dibuje el mismo. El rectng ulo del panel de contenido realmente no aparece en el GUI finalizado porque est oscurecido por el JPanel. Nota: Es importante que el panel de contenido sea opa co. De otro modo, resultar en dibujados confusos. Cmo el JPanel es opaco, pode mos hacer que sea el panel de contenido (sustituyendo setContentPane por el cdi go existente getContentPane().add). Esto simplifica considerablemente el rbol d e contenidos y el dibujado, eliminado un contenedor innecesario. 3. El JPanel pr imero dibuja su fondo, un rectngulo slido de color gris. Luego dibuja su borde . Esl borde es un EmptyBorder, que no tendr efecto excepto para incrementar el tamao del JPanel reservando algn espacio extra en los laterales del panel. Fin almente, el panel le pide a sus hijos que se dibujen a s mismos. 4. Para dibuja rse a s mismo, el JButton dibuja su rectngulo de fondo si es necesario y luego dibuja el texto que contiene. Si el botn tiene el foco del teclado, significa que cualquier cosa que se teclee va directamente al botn para su procesamiento, luego el botn realiza algn dibujado especfico del Aspecto y Comportamiento p ara aclarar que tiene el foco. 5. Para dibujarse a s misma, la JLabel dibuja su texto. De este modo, cada componente se dibuja a s mismo antes de que lo haga cualquier componente que contenga, Esto asegura que el fondo de un JPanel, por e jemplo, slo se dibuja cuando no est cubierto por uno de los componentes que co ntiene. La siguiente figura ilustra el orden en que cada componente que desciend e de JComponent se dibuja a s mismo: 1. fondo (si es opaco) 2. dibujo personali zado (si existe) 3. borde (si existe) 4. hijos (si existen) ............. ............. ============= ============= ............. ....().... ... =...()......= =...()......= ............. ............. =...........= =.--------.= ............. ............. =...........= =. JButton .= ............. .. ........... =...........= =.---------.= ............. ............. ============ = ============= Para ms informacin sobe el dibujado, puedes ver la leccin Tra bajar con Grficos.

Swing Threads y Swing Esta pgina explica como usar el API Swing de forma segura con threads. Si nuest ro programa es un applet, lo ms seguro es construir su GUI en el mtodo init. S i nuestro programa es una aplicacin con el siguiente patrn comn estaremos seg uros: //Thread-safe example public class MyApplication { public static void main (String[] args) { JFrame f = new JFrame(...); ...//Add components to the frame h ere... f.pack(); f.setVisible(true); //Don't do any more GUI work here. } ... // All manipulation of the GUI -- setText, getText, etc. -//is performed in event h andlers such as actionPerformed(). ... } Sin embargo, si nuestro programa crea t hreads que realizan tareas que afectan al GUI, o manipulan un GUI ya visible en respuesta a algn evento del AWT, sigue leyendo! La Regla de los Threads Los co mponentes Swing solo pueden ser accedidos por un thread a la vez. Generalmente, este thread es el que despacha los eventos. Excepciones a la Regla Unas pocas op eraciones estn garantizadas como seguras ante los threads. Cmo Ejecutar Cdigo en el Thread de Despacho de Eventos Si necesitamos acceder al UI desde fuera de l cdigo del despachador de eventos o de dibujo, podemos usar los mtodos invoke Later o invokeAndWait. Cmo crear Threads Si necesitamos crear un thread -- por ejemplo para manejar un trabajo que

gasta mucho tiempo o paquetes de I/O -- podemos usar uno de los thread tiles co mo SwingWorker o Timer. La Regla de los Threads La Regla de los Threads es la si guiente: Regla: Una vez que se haya realizado un componente Swing, todo el cdig o que pudiera afectar o depender del estado de ese componente debera ejecutarse en el thread de despacho de eventos. Esta regla podra sonar espeluznante, pero para la mayora de los programas sencillos, no tenemos que preocuparnos de los threads. Antes de entrar en detalles sobre cmo escribir cdigo Swing, definirem os dos trminos: realizado y thread de despacho de eventos. Realizado significa que el mtodo paint del componente haya sido o podra ser llamado. Un componente Swing que sea una ventana de alto nivel se realiza habiendo llamado a uno de es tos mtodos sobre ella: setVisible(true), show, o (lo que podra sorprendernos) pack. Una vez que una ventana se ha realizado, todos los componentes que contien e estn realizados. Otra forma de realizar un componente es aadirlo a un compon ente que ya est realizado. El thread de despacho de eventos es el thead que eje cuta el cdigo de dibujo y de despacho de eventos. Por ejemplo los mtodos paint y actionPerformed se ejecutan automticamente en el thread de despacho de event os. Otra forma de ejecutar cdigo en el thread de despacho de eventos es usar el mtodo invokeLater de SwingUtilities. Excepciones a la Regla Existen unas pocas excepciones a la regla de que todo el cdigo que afecte a un componente Swing r ealizado debe ejecutare en el thread de despacho de eventos: Unos pocos mtodos de threads seguros. En la Documentacin del API Swing, los mtodos de threads se guros estn marcados con este texto: Este mtodo es seguro ante los threads, aun que muchos mtodos Swing no lo son. Por favor lea Threads and Swing para ms inf ormacin. Un GUI de una aplicacin frecuentemente puede ser construido y mostrad o en el thread principal. Mientras que no se haya realizado ningn componente (S wing o de

otro tipo) en el entorno de ejecucin actual, est construir y mostrar un GUI en el thread principal de una aplicacin. Para ayudarnos a ver por qu, aqu hay u n anlisis del thread seguro de thread-safe example. Para refrescar nuestra memo ria, aqu estn las lneas ms importantes del ejemplo: public static void main( String[] args) { JFrame f = new JFrame(...); ...//Add components to the frame he re... f.pack(); f.setVisible(true); //Don't do any more GUI work here. } 1. El e jemplo construye el GUI en el thread principal. En general, podemos construir (p ero no mostrar) un GUI en cualquier thread, mientras que no hagamos llamadas que se refieran o afecten a los componentes ya realizados. 2. Los componentes en el GUI son realizados por la llamada a pack. 3. Inmediatamente despus, los compon entes el GUI son mostrados con la llamada a setVisible (o show). Tcnicamente, l a llamada a setVisible es insegura porque los componentes ya han sido realizados por la llamada a pack. Sin embargo, como el programa no ha hecho visible el GUI todava, es sumamente contrario a que una llamada a paint ocurra antes de que r etorne setVisible. 4. El thread principal no ejecuta cdigo GUI despus de llama r a setVisible. Esto significa que el cdigo del GUI se mueve del thread princip al al thread de despacho de eventos, y el ejemplo es, en la prctica, de thread seguro. Un GUI de un applet puede contruirse y mostrarse en el mtodo init: Los navegadores existentes no dibujan el applet hasta despus de que hayan sido llam ados los mtodos init y start. As, construir el GUI en el mtodo init del apple t es seguro, siempre que no llames a show() o setVisible(true) sobre el objeto a pplet actual. Por supuesto, los applets que usan componentes Swing deben ser imp lementados como subclases de JApplet, y los componentes deben ser aadidos al pa nel de contenido del JApplet, en vez de directamente al JApplet. Al igual que pa ra cualquier applet, nunca deberamos realizar inicializacin que consuma mucho tiempo en los mtodos init o start; en su lugar deberamos arrancar un thread qu e realice las tareas que consuman tiempo.

Los siguientes mtodos de JComponent son seguros para llamarlos desde cualquier thread: repaint, revalidate, e invalidate. Los mtodos repaint y revalidate envi an peticiones para que el thread de despacho de eventos llame a paint y validate , respectivamente. El mtodo invalidate slo marca un componentes y se requiere la validacin de todos sus ancestros. Oyentes que pueden ser modificados desde c ualquier thread Es siempre seguro llamar a los mtodos addListenerTypeListener y removeListenerTypeListener. Las operaciones de aadir/eliminar no tienen ningn efecto en el despacho de eventos, Cmo Ejecutar Cdigo en el Thread de Despacho de Eventos La mayor parte del trabajo de post-inicializacin de un GUI naturalm ente ocurre en el thread de despacho de eventos. Una vez que el GUI es visible, la mayora de los programas son conducidos por eventos como acciones de botones o clicks del ratn, que siempre son manejados por el thread de despacho de event os. Sin embargo, algunos programas necesitan realizar algn trabajo de GUI no co nducido por eventos, despus de que el GUI sea visible. Aqu tenemos algunos eje mplos: Programas que deben realizar una operacin de inicializacin larga antes de poder ser usados: Esta clase de programas generalmente debera mostrar algn GUI mientras est ocurriendo la inicializacin, y luego actualizar o cambiar el GUI. La inicializacin no debera ocurrir en el thread de despacho de eventos; s i no el repintado y el despacho de eventos se pararan. Sin embargo, despus de la inicializacin el cambio/actualizacin del GUI debera ocurrir en el thread d e despacho de eventos por razones de seguridad con los threads. Programas cuyo G UI debe actualizarse como resultado de eventos no-AWT: Por ejemplo, supongamos q ue un programa servidor quiere obtener peticiones de otros programas que podran estar ejecutndose en diferentes mquinas. Estas peticiones podran venir en cu alquier momento, y resultan en llamadas a algunos de los mtodos del servidor en algn mtodo thread desconocido. Cmo puede el mtodo actualizar el GUI? Ejecu tando el cdigo de actualizacin del GUI en el thread de despacho de eventos. La clase SwingUtilities proporciona dos mtodos para ayudarnos a ejecutar cdigo e n el thread de despacho de eventos:

invokeLater: Pide que algn cdigo se ejecute en el thread de despacho de evento s. Este mtodo retorna inmediatamente, sin esperar a que el cdigo sea ejecutado . invokeAndWait: Acta igual que invokeLater, excepto en que este mtodo espera a que el cdigo se ejecute. Como regla, deberamos usar invokeLater en vez de es te mtodo. Para ms informaicn sobre el uso de invokeLater y invokeAndWait, y o tros trucos para esciribir programas multi-threads, puedes ver Cmo usar Threads .

Swing Ms Caractersticas y Conceptos Swing Esta leccin ha explicado algunos de los mejores conceptos que necesitars conoc er para construir GUIs Swing -- el rbol de contenidos, el control de distribuci n, el manejo de eventos, el dibujado, y los threads. Adems, hemos tocado tpic os relacionados, como los bordes. Esta seccin explica algunas caractersticas S wing que no se han explicado todava: q Caractersticas que Proporciona JCompone nt q q q q q Iconos Actions Aspecto y Comportamiento Conectable Soporte de Tecnologas Asisti vas Modelos de Datos y Estados Separados Caractersticas que ProporcionaJComponent Excepto los contenedores de alto nivel , todos los componentes que empiezan con J descienden de la clase JComponent. Ob tienen muchas caractersticas de esta clase, como la posibilidad de tener bordes , tooltips, y Aspecto y Comportamiento configurable. Tambin heredan muchos mto dos de conveniencia. Para ms detalles, sobre lo que proporciona la clase JCompo nent puedes ver La clase JComponent Iconos Muchos componentes Swing -- principal mente los botones y las etiquetas -- pueden mostrar imgenes. Estas imgenes se especifican como objetos Icon. Puedes ver Cmo usar Iconos para ver instruccione s y una lista de ejemplos que usa iconos. Actions Con objetos Action, el API Swi ng proporciona un soporte especial para compartir datos y estados entre dos o m s componentes que pueden generar eventos action. Por ejemplo, si tenemos un bot n y un tem de men que realizan la misma funcin, podramos considerar la utili zacin de un objeto Action para coordinar el texto, el icono y el estado de

activado de los dos componentes. Para ms detalles, puedes ver Cmo usar Actions . Aspecto y Comportamiento Conectable Un sencillo programa puede tener uno o var ios aspectos y comportamientos. Se puede permitir que el usuario determine el as pecto y comportamiento, o podemos determinarlos programticamente. Puedes ver C mo seleccionar el Aspecto y Comportamiento para ms detalles. Soporte para Tecno logas Asistivas Las tecnologas asisticas como los lectores de pantallas pueden usar el API de accesibilidad para obtener informacin sobre los componentes Swi ng. Incluso si no hacemos nada, nuestro programa Swing probablemente funcionar correctamente con tecnologas asistivas, ya que el API de accesibilidad est con struido internamente en los componentes Swing. Sin embargo, con un pequeo esfue rzo extra, podemos hacer que nuestro programa funcione todava mejor con tecnolo gas asistivas, lo que podra expandir el mercado de nuestro programa. Puedes ve r Cmo Soportar Tecnologas Asistivas para ms detalles. Mdelos de Datos y Esta dos Separados La mayora de los componentes Swing no-contenedores tienen modelos . Por ejemplo, un botn (JButton) tiene un modelo (ButtonModel) que almacena el estado del botn -- cul es su mnemnico de teclado, si est activado, seleccion ado o pulsado, etc. Algunos componentes tienen mltiples modelos. Por ejemplo, u na lista (JList) usa un ListModel que almacena los contenidos de la lista y un L istSelectionModel que sigue la pista de la seleccin actual de la lista. Normalm ente no necesitamos conocer los modelos que usa un componente. Por ejemplo, casi todos los programas que usan botones tratan directamente con el objeto JButton, y no lo hacen en absoluto con el objeto ButtonModel. Entonces Por qu existen modelos separados? Porque ofrecen la posibilidad de trabajar con componentes ms eficientemente y para compartir fcilmente datos y estados entre componentes. U n caso comn es cuando un componente, como una lista o una tabla, contiene mucho s datos. Puede ser mucho ms rpido manejar los datos trabajando directamente co n un modelo de datos que tener que esperar a cada peticin de datos al modelo. P odemos usar el modelo por defecto del

componente o implementar uno propio. Para ms informacin sobre los modelos, pue des visitar las pginas individuales de cada componente o La Anatoma de un Prog rama Basado en Swing que describe algunos modelos personalizados usados por el p rograma creado en esa seccin.

Swing La Anatoma de un Programa Basado en Swing Esta seccin mustra un programa Swing, llamado Converter, que tiene un UI grfic o. Puedes ver cmo est implementado este programa mirando el cdigo fuente que puedes encontrar en los ficheros Converter.java y ConversionPanel.java. Sin emba rgo, no habla sobre lneas individuales de cdigo. Se concentra en cmo el progr ama Converter usa las caractersticas GUI proporcionadas por la plataforma Java. Si te pierdes cuando lees el cdigo fuente de Converter, puedes refrescar tu me moria en la pgina Una Ruta Rpida por el Cdigo de una Aplicacin Swing. Conver ter es una aplicacin que convierte medidas de distancias entre unidades mtrica s y amricanas. Para ejecutarlo, debes compilar los siguientes ficheros fuente: Converter.java, ConversionPanel.java, ConverterRangeModel.java, FollowerRangeMod el.java, DecimalField.java, FormattedDocument.java, y Unit.java. Una vez compila do, puedes ejecutarlo llamando al intrprete con la clase Converter. Si necesita s ayuda para compilar y ejecutar Converter, puedes ver Compilar y Ejecutar un Pr ograma Swing. Aqu tenemos un grfico comentado del GUI de Converter: "JFrame", "JPanel (ConversionPanel)" (x2 apuntado a los paneles que dicen "Metri c System" and "U.S. System"), "JTextField (DecimalField)" (x2), JSlider (x2), JC omboBox (x2)] Esta seccin describe las siguientes caractersitcas de Converter: q Componentes Swing q q q q El rbol de Contenidos Control de Distribucin y Bordes Modelos Separados Aspect o y Comportamiento Conectable

q Manejo de Eventos Componentes Swing Cmo se ve en la figura anterior, Converter tiene los siguient es componentes visibles: q 1 JFrame q 2 JPanel personalizados q 2 JTextField per sonalizados q 2 JSliders q 2 JComboBoxes El JFrame es el contenedor de alto nive l, slo proporciona la ventana de la aplicacin. Todos los otros componentes de la aplicacin estn contenidos en JFrame. Excepto el contenedor de alto nivel, t odos los componentes visibles de Converter descienden de JComponent. La clase JC omponent proporciona muchas caractersticas, como soporte para bordes y accesibi lidad. Los dos JPanel personalizados usan bordes para soportar ttulos (por ejem plo, "Metric System") y para dibujar recuadros a su alrededor. El rbol de Conte nidos 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 (DecimalFi eld) Este diagrama muestra tres componentes no etiquetados en el figura anterior

porque no dibujan nada observable en la pantalla.: q 1 JPanel que sirve para el panel de contenidos q 2 JPanel personalizados que contienen un campo de texto y un deslizador Estos tres componentes existen para afectar a la distribucin. Hac en esto simplificando la distribucin o aadiendo bordes "vacos" que aaden esp acio para la distribucin. El agrupamiento de componentes -- tanto en contenedor es visibles como en invisibles -- tambien proporciona ayuda para las tecnologas asistivas. Por ejemplo, agrupar un campo de texto y un deslizador en su propio contenedor le ofrece a las tecnologas asisitivas la informacin de que el campo de texto y el deslizador estn estrechamente relacionados. Bajo el panel de con tenidos hay dos ConversionPanel. Uno de ellos contiene los componentes relaciona dos con las ditancias mtricas, y el otro hace lo mismo con las distancias ameri canas. Cada ConversionPanel contiene 3 componentes visibles: un campo de texto, un deslizador y un combo box. El campo de texto y el deslizador estn agrupados en un JPanel, principalmente para simplificar la distribucin. Control de Distri bucin y Bordes La siguiente figura muesta una versin coloreada de Converter. E n esta versin, cada contenedor tiene un color de fondo diferente, para que pued es ver fcilmente las partes de los contenedores que no estn cubiertas por otro s componentes. Observa que todos los contenedores son opacos; de otro modo, el c olor del fondo podra no ser pintado automticamente. Converter create cinco objetos controladores de distribucin -- un ejemplar de G ridLayout, y cuatro de BoxLayout. El primer JPanel (el panel de contenidos perso nalizado) usa GridLayout para hacer que los ConversionPanels tengan exactamente el mismo tamao. El cdigo configura el GridLayout para que ponga los Conversion Panels en una sla columna (dos filas), con cinco pixels entre ellos. El JPanel se inicializa para tener un borde vaco que aade cinco pixels

entre el panel y los lados del frame. Cada ConversionPanel tiene un borde compue sto. El exterior es un borde con ttulo y el interior es un borde vaco. El bord e titulado dibuja una recuadro especfico del aspecto y comportamiento alrededor del ConversionPanel y sita dentro el ttulo del panel. El borde vaco pone alg n espacio ms entre el ConversionPanel y sus contenidos. Cada ConversionPanel u sa un controlador BoxLayout para situar sus contenidos, que son un JPanel y un J ComboBox, en un fila. Seleccionando el alineamineto Y tanto del panel como del c ombo box, el programa alinea la parte superior del panel con la perte superior d el combo box. El JPanel que agrupa al campo de texto y al deslizador est implem entado con una subclase sin nombre de JPanel. Esta subclase sobreescribe los mt odos getMinimumSize, getPreferredSize, y getMaximumSize para que devuelvan el mi smo 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 e stn controlados por diferentes controladores de distribucin. Necesitamos crear una subclase de JPanel, en vez de llamar a los mtodos setXxxxSize, porque la a ltura preferida de los componentes se determina en tiempo de ejecucin, por el c ontrolador de distribucin. El JPanel que agrupa el campo de texto y el deslizad or usa un controlador BoxLayout de arriba-a-abajo para que el campo de texto se situe encima del deslizador. El JPanel tambin tiene un borde vaco que aade un poco de espacio a su derecha entre l y el combo box. Modelos Separados Este pr ograma 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 doc umento. El modelo de documento analiza el valor que el usuario introduce en el c ampo de texto. Tambin formatea el nmero para que parezca bonito. Hemos tomado prestado este modelo de documento, sin cambiarlo, del ejemplo presentado en Crea r y Validar y un Campo de Texto. Los otros dos modelos personalizados son modelo s de datos de deslizador. Esto asegura que el dato mostrado por la aplicacin es t en un slo lugar -en el modelo del deslizador superior. El modelo del desliza dor superior es un ejemplar de una clase personalizada llamada ConverterRangeMod el. El deslizador inferior usa una segunda clase personalizada, FollowerRangeMod el, que reenva todas las peticiones para obtener un conjunto de datos al modelo del deslizados superior. Todos los modelos de datos de deslizador deben impleme ntar el interface BoundedRangeModel. Aprenderemos esto en la seccin del API de Cmo usar Sliders. La documentacin del BoundedRangeModel que tiene un clase de implementacin llamada DefaultBoundedRangeModel. La

documentacin del API de DefaultBoundedRangeModel muestra que es una implementac in de cdigo general de BoundedRangeModel. No usamos DefaultBoundedRangeModel p orque almacena los datos como enteros, y necesitamos almacenar datos en coma flo tante. As, implementamos ConverterRangeModel como una subclase de Object, compa rlo con el cdigo fuente de DefaultBoundedRangeModel (distribuido con las versi ones JFC 1.1y JDK 1.2), para asegurarnos que implementamos el modelo correctamen te. Implementamos FollowerRangeModel como una subclase de ConverterRangeModel. A specto y Comportamiento Conectable El programa Converter se configura a s mismo para usar el Aspecto y Comportamiento Java. Cambiando el valor de su variable L OOKANDFEEL, podemos hacer que use un Aspecto y Comportamiento diferente. Tres de sus encarnaciones estn dibujadas en Qu son el JFC y Swing?. Manejo de Evento s El programa Converter crea varios manejadores de eventos: Oyentes de Action Ca da combo box tiene un oyente de action. Siempre que el usuario selecciona una nu eva unidad de medida, el oyente de action notifica el modelo de deslizador relev ante y resetea los valores mximos de los dos deslizadores. Cada campo de texto tiene un oyente de action que es notificado cuando el usuario pulsa la tecla Ret urn para indicar que el tecleado ha terminado. Este oyente de action actualiza e l correspondiente modelo de deslizador para reflejar el valor del campo de texto . Oyente de Change Cada modelo de deslizador tiene un oyente de change personali zado. Siempre que el valor de un deslizador cambia, este oyente actualiza el cor respondiente campo de texto. No hemos tenido que registrar los deslizadores como oyentes de dus propios modelos, ya que lo hace Swing automticamente. En otras palabras, siempre que el programa selecciona un valor en un modelo de deslizador , ste se actualiza automticamente para reflejar el nuevo estado del modelo. El modelo para el deslizador inferior aade un oyente de cambio al modelo del desl izador 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 des lizador superior, se actualizan los valores del deslizador y del campo de texto inferior. No es necesario notificar al deslizador superior los cambios en el des lizador inferior, ya que el modelo del deslizador inferior reenvia las peticione s de seleccin de datos al modelo del deslizador superior.

Oyentes de Window Un oyente de window en el frame hace que se salga de la aplica cin cuando se cierre la ventana. Casi todos los oyentes del programa Converter estn implementados en clases internas annimas --clases sin nombre definidas de ntro de otras clases. Aunque las clases internas podran parecer difciles de le er, al principio, realmente hacen el cdigo mucho ms fcil de comprender, una v ez que las has utilizado. Manteniendo una implementacin de un menejador de even tos cerca de donde se registra el manejador de eventos, las clases internas te a yudan y ayudan a los que te siguen a encontrar fcilmente la implementacin comp leta del manejador de eventos. Puedes ver Usar Adaptadores y Clases Internas par a Manejar Eventos para ms informacin.

Swing Usar Componentes Swing Esta leccin describe cada componente Swing... Reglas Generales para el Uso de C omponentes Swing Empieza aqu para aprender las reglas generales del uso de comp onentes. La clase JComponent Excepto los contenedores de alto nivel, los compone ntes Swing descienden de la clase JComponent. Esta seccin te presenta las carac tersticas proporcionadas por la clase JComponent, y te ofrece trucos para aprov echarte de dichas caractersticas. Un ndice Visual de Componentes Swing Aqu ha y un grfico de cada componente Swing, desde los contenenedores de alto nivel y contenedores intermedios hasta los componentes regulares. Para ir a la pgina qu e describe un componente particular slo pulsa sobre el grfico. Crear Contenedo res de Alto Nivel Explica cmo crear ventanas y applets. Usar Contenedores Inter medios Swing Explica cmo usar contenedores intermedios para agrupar o aadir ca ractersticas a otros componentes. Usar Componentes Esta seccin explica los com ponentes que interactan con el usuario. Resolver Problemas Comunes con los Comp onentes Esta seccin explica soluciones a los problemas ms comunes relacionados con los componentes.

Swing Reglas Generales para el uso de Componentes Swing Esta pgina tiene informacin general sobre cmo escribir un programa que conten ga componentes Swing. Dos cosas importantes a tener en cuenta son evitar el uso de componentes de peso pesado que no sean Swing y poner nuestros componentes Swi ng dentro de un contenedor de alto nivel. El paquete Swing define dos tipos de c omponentes: q Contenedores de alto nivel (JFrame, JApplet, JWindow, JDialog) q C omponentes de peso ligero (Jcualquier-cosa, como JButton, JPanel, y JMenu) Los c ontenedores de alto nivel proporcionan el marco de trabajo en el que existen los componentes de peso ligero. Especficamente, un contenedor de alto nivel Swing proporciona un rea en el que los componentes de peso ligero Swing pueden dibuja rse a s mismos. Los contenedores de alto nivel Swing tambin proporcionan otras caractersticas Swing como el espacio para una barra de men, manejo avanzado d e eventos y dibujo, y soporte de accesibilidad. En general, todo componente Swin g debera tener un contenedor Swing de alto nivel por encima en el rbol de cont enidos. Por ejemplo, todo applet que contenga componentes Swing debera estar im plementado como una subclase de JApplet (que es una subclase de Applet). De form a similar, toda ventana principal que contenga componentes Swing debera ser imp lementada con un JFrame. Aqu tenemos una imagen del rbol de contentido de un G UI de un tpico programa Swing que implementa una ventana que contiene dos boton es, un campo de texto y una lista:

Aqu tenemos otra imagen del mismo GUI excepto en que ahora es un Applet ejecut ndose en un navegador: El panel de contenido de las figuras anteriores es el Contenedor normal que hay debajo de cada contenedor Swing. Un contenedor de alto nivel Swing es una subcla se Swing de un componente AWT de peso pesado. Los contenedores de alto nivel Swi ng le aaden las necesidades Swing -- incluyendo un panel de contenido -- a los componentes pesados del AGM. Aqu est el cdigo que construye el GUI mostrado e n las figuras anteriores: //Configura el JPanel,que contiene el campo de texto y la lista. JPanel panel = new JPanel(); panel.setLayout(new SomeLayoutManager()) ; panel.add(textField); panel.add(list); //topLevel es un ejemplar de JApplet o JFrame Container contentPane = topLevel.getContentPane(); contentPane.setLayout( new AnotherLayoutManager());

contentPane.add(button1); contentPane.add(button2); contentPane.add(panel); Nota :No se pueden aadir directamente los componentes a un componente de alto nivel: topLevel.add(something); //NO SE PUEDE HACER ESTO!!! En general, deberamos evitar el uso de componentes pesados en GUIs Swing (excep to los contenedores de alto nivel Swing que contienen el GUI, por supuesto). El problema ms obsevable cuando se mezclan componentes pesados y ligeros es que cu ando se solapan dentro de un contenedor, el componente de peso p