manual java swing

Upload: monickafer

Post on 17-Oct-2015

95 views

Category:

Documents


2 download

TRANSCRIPT

  • UI-SwingUtilizar los Paquetes JFC/Swingl Empezar con Swing

    Sobre el JFC y Swingm Compilar y Ejecutar programas Swing

    Compilar y Ejecutar programas Swing (JDK 1.2)n Compilar y Ejecutar programas Swing (JDK 1.1)n

    m

    Ejecutar Applets Swingm Una gira rpida por el cdigo de un programa Swingm

    l

    Caractersticas y Conceptos SwingHerencia de Componentes y Contenedores Swingm Control de Distribucinm Manejo de Eventosm Dibujom Threads y Swingm Ms Caractersticas Swingm Anatomia de un programa Swingm

    l

    Usar Componentes SwingReglas Generales del uso de Componentesm La clase JComponentm Indice Visual de Componentes Swingm Contenedores de Alto Nivel

    Cmo crear Framesn Cmo crear Dilogosn Cmo crear Appletsn Contenedores Intermediosn Cmo usar Paneln Cmo usar ScrollPanen Cmo usar SplitPanen Cmo usar TabbedPanen Cmo usar ToolBarn Cmo usar InternalFramen Cmo usar LayeredPanen

    m

    l

  • Cmo usar RootPanen Componentes Swing

    Cmo usar Buttonn Cmo usar ChekBoxn Cmo usar ColorChoosern Cmo usar ComboBoxn Cmo usar FileChoosern Cmo usar Labeln Cmo usar Listn Cmo usar Menun Cmo usar MonitorProgressn Cmo usar RadioButtonn Cmo usar Slidern Cmo usar Tablen Componentes de Texto

    Ejemplos de cada Componente de texton Reglas de uso de Componentes de texton Cmo usar TextFieldn Cmo usar EditorPane y TextPanen Sumario de Texton

    n

    Cmo usar ToolTipn Cmo usar Treesn

    m

    Problemas comunes con Componentesm Escribir Oyentes de Eventos

    Ejemplos de Manejo de Eventosm Reglas Generales para Escribir Oyentes de Eventosm Manejar Eventos

    Oyente de Actionn Oyente de Caretn Oyente de Changen Oyente de Componentn Oyente de Containern Oyente de Documentn

    m

    l

  • Oyente de Focusn Oyente de InternalFramen Oyente de Itemn Oyente de Keyn Oyente de ListSelectionn Oyente de Mousen Oyente de MouseMotionn Oyente de UnodableEditn Oyente de Windown

    Distribuir Componentes en un ContenedorUsar Controladores de Distribucin

    Reglas de uso de Controladores de Distribucinn Cmo usar BorderLayoutn Cmo usar BoxLayoutn Cmo usar CardLayoutn Cmo usar FlowLayoutn Cmo usar GridLayoutn Cmo usar GridBagLayout

    Especificar Restriccionesn El ejemplo explicadon

    n

    Crear un controlador de Distribucin Personalizadon Hacerlo sin controlador de Distribucin (Posicionamiento Absoluto)n Solucin de Problemas con la Distribucinn

    m

    l

    Trabajar con GrficosIntroduccin al Soporte de Graficos del AWTm Usar Grficos Primitivos

    Dibujar Formas Sencillasn Trabajar con Texton

    m

    Utilizar ImgenesCargar Imgenesn Dibujar Imgenesn

    m

    Realizar AnimacinCrear un Bucle de Animacinn

    m

    l

  • Animar Grficosn Mover una Imagen por la Pantallan Mostrar una Secuencia de Imgenesn Aumentar el rendimiento y la aparaciencia de una Animacinn

    Solucin de Problemas con los Graficosm Usar Otras Caractersticas de Swing

    Cmo usar Actionm Cmo soportar tecnologas de accesibilidadm Cmo usar Iconosm Cmo seleccionar el Aspecto y Comportamientom Cmo usar Threadsm Cmo usar Timerm

    l

    Convertir a SwingPor qu convertir a Swing?m Cmo convertir mis programas a Swing?m Recursos de Conversin

    Repuestos Swing para Componentes SWTn Trucos de Conversinn Algunos ejemplos de Conversinn Solucin de Problemas de Conversinn

    m

    l

  • Swing

    Crear un GUI usando JFC/SwingEsta seccin explica como crear un Interface Grfico de Usuario (GUI) paraaplicaciones y applets, usando los componentes Swing. Los componentes Swing,que forman parte de JavaTM Foundation Classes (JFC), se pueden usar tanto con elJDK 1.1 como con el JDK 1.2.

    Empezar con Swing es una leccin para empezar rpidamente. Primero ofrececonocimientos sobre el JFC y Swing. Luego explica cmo compilar y ejecutarprogramas -- tanto applets como aplicaciones -- que usan componentes Swing.Finalmente muestra el cdigo de un programa sencillo.

    Caractersticas y Conceptos Swing ofrece la iformacin que necesitas parapoder usar componentes swing efectivamente. Por ejemplo, explica cmo losprogrmas Swing muestran sus GUIs, cmo manejan los eventos como laspulsaciones del ratn, y cmo pueden usar caractersticas como los bordes paraayudar a la distribucin. Finaliza con una explicacn de cmo se usan lascaractersticas y los conceptos en un programa real.

    Usar componentes Swing explica cmo usar cada uno de los componentesSwing.

    Escribir oyentes de eventos explica cmo manejar eventos en los programasSwing.

    Distribuir Componentes Dentro de un Contenedor explica cmo elegir uncontrolador de disposicin, cmo usar cada una de las clases de controladores dedistribucin proporcionadas por el entorno Java, cmo usar posicionamientoabsoluto en vez de un controlador de disposicin, y cmo crear nuestro propiocontrolador de distribucin.

    Usar otras Caractersticas Swing explica cmo usar actions, borders, icons, ytimers. Tambin nos ensea a crear programas multi-threads

    Convertir a Swing explica cmo convertir programas que usan el API del AWT 1.1para usar componentes Swing.

  • Swing

    Empezar con SwingEsta seccin ofrece una introduccin rpida al uso de paquetes Swing para grearun GUI de un programa. Primero explica lo que son Swing y JFC. Luego nos ayudaa obtener la versiones necesarias para compilar y ejecutar programas Swing.Despus muestra cmo ejecutar applets. Finalmente, nos lleva a una excursinsobre una aplicacin Swing sencilla.

    Si t ests ms interesado en aprender conceptos que en ejecutar programasahora mismo, puedes saltarle libremente esta leccin e ir a la siguiente leccin,Caractersticas y Conceptos. Puedes volver aqu cuando ests listo para empezar aprogramar.

    Sobre el JFC y Swing

    Esta leccin cuenta una pequea historia sobre JFC y Swing. Si hasdesarrollado programas usando componentes SWT, probablementeestars interesado en la descripcin de las diferencias entre loscomponentes ATW y los componentes Swing.

    Compilar y Ejecutar Programas SwingPara escribir programas usando los componentes Swing, primero debesdescargar las versiones apropidas del JDK y del JFC. Luego puedesseguir las instrucciones de esta seccin para compilar y ejecutar unapequea aplicacin Swing que te proporcionamos.

    Ejecutar Applets SwingSi ests interesado en escribir aplets swing, primero debers poderejecutarlos. Esta leccin proporciona dos applets, con instrucciones paraejecutarlos.

    Una Gira Rpida por el Cdigo de una Aplicacin Swing

    Esta seccin muestra el cdigo de una pequea aplicacin swing. Versque el cdigo que debe tener necesariamente una aplicacin Swing yaprenders algunas de las caractersitcas ms utilizadas de Swing

  • Swing

    Sobre el JFC y SwingEsta pgina responde cuatro preguntas:

    Qu son el JFC y Swing?l

    Qu versiones contienen el API Swing?l

    Qu paquetes Swing debera utilizar?l

    Que tienen de diferente los componentes Swing de los componentes AWT?l

    Qu son el JFC y Swing?

    JFC es la abreviatura de JavaTM Foundation Classes, que comprende ungrupo de caractersticas para ayudar a construir interfaces grficos deusuario (GUIs).Los componentes Swing

    Inlcuye todo desde botones hasta splitpanes o tablas. Puedes verimgenes de todos los componentes en ndice Visual deComponente Swing.

    Soporte de Aspecto y Comportamiento ConectableLe ofrece a cualquier componente Swing una amplia seleccin deaspectos y comportamientos. Por ejemplo, el mismo programapuede usar el Aspecto y Comportamiento Java o el Aspecto yComportamiento Windows. Esperamos mucho ms de los paquetesde Aspecto y Comportamiento -- incluyendo algo que use sonido enlugar de un 'look' visual.

    API de AccesibilidadPermite tecnologas asistivas como lectores de pantalla y displayBraille para obtener informacin desde el interface de usuario.

    Java 2D API (slo JDK 1.2 )Permite a los desarrolladores incorporar fcilmente graficos 2D dealta calidad, texto, e imgenes en aplicaciones y applets Java.

    Soporte de Drag&Drop (slo JDK 1.2)Proporciona la habilidad de arrastrar y soltar entre aplicaciones Javay aplicaciones nativas.

    Las tres primeras caractersitcas del JFC fueron implementadas sinningn cdigo nativo, tratando slo con el API definido en el JDK 1.1.

  • Cmo resultado, se convirtieron en una extensin del JDK 1.1. Estaversin fue liberada como JFC 1.1, que algunas veces es llamada'Versin Swing'. El API del JFC 1.1 es conocido como el API Swing.

    Nota: "Swing" era el nombre clave del proyecto que desarrolllos nuevos componentes. Aunque no es un nombre oficial,frecuentemente se usa para referirse a los nuevoscomponentes y al API relacionado. Est inmortalizado en losnombres de paquete del API Swing, que empiezan con"javax.swing."

    Esta seccin se concentra en los componentes Swing. Te ayudaremos aelegir los apropiados para tu GUI, te diremos cmo usarlos, y te daremosla informacin que necesites para usarlos de forma efectiva.Explicaremos el Aspecto y Comportamiento Conectable y el soporte deAccesibilidad cuando afecten a la forma de escribir programas Swing. Nocubre aquellas caractersitcas del JFC que slo aparecen en el JDK 1.2.Para informacin sobre ellas, puedes ver Grficos 2D y la Home Page delJFC.

    Los siguientes grficos muestran tres vistas de un GUI que usacomponentes Swing. Cada imagen muestra el mismo programa pero conun Aspecto y Comportamiento diferente. El programa, llamadoConverter, se explica en detalle al final de la siguiente leccin,Caractersticas y Conceptos Swing.

    Java Look & Feel CDE/Motif Look & Feel Windows Look & Feel

    Qu Versiones Contienen el API Swing?

    El API Swing se presenta en dos versiones:JDK 1.2l JFC 1.1 (para usar con JDK 1.1)l

    La versin que deberas usar depende de si necesitas usar JDK 1.1 o JDK1.2. Es ms sencillo usar JDK 1.2, ya que no necesitas aadir libreraspara poder usar el API Swing; el JFC construido dentro del JDK 1.2. Sinembargo, si necesitas usar el JDK 1.1, aadir el API Swing (usando JFC1.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 enJDK 1.2 y en la versin llamada 'JFC 1.1 (con Swing 1.1).' El cdigo deesta seccin, funciona, sin ninguna modificacin, en ambas versiones.

    Sun ha liberado muchas versiones del JFC 1.1, que estn identificadaspor la versin del API Swing que contienen. Por ejemplo, una versinanterior del JFC 1.1, fue llamada "JFC 1.1 (con Swing 1.0.3)." Lasiguiente tabla muestra algunas de las versiones importantes quecontienen el API Swing. La fuente en negrita indica las versionestpicamente usadas en productos comerciales.

    Versin del APISwingg

    Versin del JFC 1.1Correspondiente

    Versin del JDK 1.2Correspondiente Comentarios

    Swing 0.2 JFC 1.1(con Swing 0.2) ningunaLa primera verinpbica del JFC 1.1.

    Swing 1.0.3JFC 1.1(conSwing 1.0.3)

    ninguna

    La versin del JFC1.1 incluida en JavaPlug-in 1.1.1.Soportada para eluso en productoscomerciales.

    Swing 1.1Beta

    JFC 1.1(con Swing 1.1Beta)

    JDK 1.2 Beta 4

    La primera versindel JDK 1.2 que usalos mismos nombresde paquetes Swingque lacorrespondienteversin del JFC 1.1.

    Swing 1.1Beta 3

    JFC 1.1(con Swing 1.1Beta 3)

    JDK 1.2 RC1

    La primera versincon los nombresfinales de lospaquetes Swing.

  • Swing 1.1

    Nota: Este esel API cubiertopor estetutorial.

    JFC 1.1(conSwing 1.1)

    JDK 1.2 FCS

    La primera versinque contiene el APIfinal de Swing 1.1que est soportadapara el uso enproductoscomerciales. JavaPlug-in 1.1.2 yJava Plug-in 1.2proporciona soportepara applets paraJDK 1.1 + Swing 1.1y JDK 1.2,respectivamente.

    Qu Paquetes Swing Debera Utilizar?

    El API Swing es poderoso, flexible -- e inmenso. Por ejemplo, la versinJFC 1.1 tiene 15 paquetes pblicos: javax.accessibility, javax.swing,javax.swing.border, javax.swing.colorchooser,javax.swing.event, javax.swing.filechooser, javax.swing.plaf,javax.swing.plaf.basic, javax.swing.plaf.metal,javax.swing.plaf.multi, javax.swing.table, javax.swing.text,javax.swing.text.html, javax.swing.tree, y javax.swing.undo.

    Afortunadamente, la mayora de los programas slo usan un subconjuntode este API. Esta seccin ordena el API para t, ofreciendo el cdigo mscomn y guindote por los mtodos y clases que podras necesitar. Lamayora del cdigo de esta seccin usa slo uno o dos paquetes swing:

    javax.swingl javax.swing.event (no siempre es necesario)l

    Que tienen de diferente los componentes Swing de los componentes AWT?

    Si no te importan los componentes AWT, puedes saltarte esta secccin.Puedes obtener una introduccin ms general a los componentes Swingen Una ruta rpida por el cdigo de una aplicacin Swing yCaractersticas y Conceptos Swing.

    Los componentes AWT son aquellos proporcionados por las plataformasJDK 1.0 y 1.1. Aunque JDK 1.2 todava soporta componentes AWT,recomendamos encarecidamente el uso de componente Swing en sulugar. Puedes indentificar los componentes Swing porque sus nombresempiezan con J. Por ejemplo, la clase button del AWT se llama Button, yla clase buttn de Swing se llama JButton. Los componentes AWT estnen el paquete java.awt, mientras que los componentes Swing estn en

  • el paquete javax.swing.

    La mayor diferencia entre los componentes AWT y los componentesSwing es que stos ltimos estn implementados sin nada de cdigonativo. Esto significa que los componentes Swing pueden tener msfuncionalidad que los componentes AWT, porque no estn restringidos aldenominador comn -- las caractersticas presentes en cada plataforma.El no tener cdigo nativo tambin permite que los componentes Swingsean vendidos como aadidos al JDK 1.1, en lugar de slo formar partedel JDK 1.2.

    Incluso el ms sencillo de los componentes Swing tiene capacidades quevan ms all de lo que ofrecen los componentes AWT. Por ejemplo:

    Los botones y las etiquetas Swing pueden mostrar imgenes enlugar de o adems del texto.

    l

    Se pueden aadir o modificar fcilmente los bordes dibujadosalrededor de casi cualquier componente Swing. Por ejemplo, es fcilponer una caja alrededor de un contenedor o una etiqueta.

    l

    Se puede modificar fcilmente el comportamiento o la apariencia deun componente Swing llamando a mtodos o creando una subclase.

    l

    Los componentes Swing no tienen porque ser rectangulares. Porejemplo, los botones pueden ser redondos.

    l

    Las tecnologas asistivas como los lectores de pantallas puedenfcilmente obtener informacin desde los componentes Swing. Porejemplo, una herramienta puede fcilmente obtener el textomostrado en un botn o en una etiqueta.

    l

    Otra caractersitca Swing es que se puede especificar el Aspecto yComportamiento que utilice el GUI de nuestro programa. Por elcontrario, los componentes AWT siempre tienen el aspecto ycomportamiento de la plataforma nativa.

    Otra caracterstica interesante es que los componentes Swing con estadousan modelos para mantener el estado. Por ejemplo, un JSlider usa unobjeto BoundedRangeModel para contener su valor actual y un rangode valores legales. Los modelos se configuran automticamente, por esono tenemos que tratar con ellos, a menos que queramos tomar ventajade la potencia que pueden ofrecernos.

    Si ests acostumbrado a usar componentes AWT, necesitars tenercuidado con algunas reglas cuando uses componentes Swing:

    Como regla, los programas no deberan usar componentne de 'pesopesado' junto con componentes Swing. Los componentes de pesopesado incluyen todos los componentes AWT listos para usar (comoMenu y ScrollPane) y todos los componentes que desciendan delas clases Canvas y Panel del AWT. Esta restriccin existe porque

    l

  • cuando un componente Swing (u otro componente de 'peso ligero')se solapa con componentes de peso pesado, ste ltimo siempre sedibuja encima. Para ms informacin puedes ver MezclarComponentes de peso ligero y pesado, un artculo de 'The SwingConnection'.Los componentes Swing no son de thread seguro. Si modificas uncomponente Swing visible -- llamando a su mtodo setText, porejemplo -- desde cualquier lugar que no sea el manejador deeventos, necesitas seguir unos pasos especiales para hacer que lamodificacin se ejecute en el thread de despacho de eventos. Estono es ningn problema para la mayora de los programas Swing, yaque el cdigo que modifica los componentes normalmente seencuentra en los manejadores de eventos.

    l

    La herencia de contenidos de cualquier ventana o applet quecontenga componentes swing debe tener un contenedor de altonivel Swing como raz del rbol. Por ejemplo, una ventana principaldebera ser implementada como un ejemplar de JFrame en vez decomo un ejemplar de Frame.

    l

    No se aaden directamente los componentes a un contenedor dealto nivel como un JFrame. En su lugar, se aaden loscomponentes a un contenedor (llamado panel de contenido) que asu vez est contenido por el JFrame.

    l

    Convertir a Swing explica ms cosas sobre las diferencias entre loscomponentes Swing y los componentes AWT.

  • Swing

    Compilar y Ejecutar Programas SwingEsta seccin explica cmo compilar e ejecutar una aplicacin Swing. Lasinstrucciones de compilacin funcionan para todos los programas Swing -- appletsy aplicaciones. Si ests interesados en los applets Swing, deberas leer tambinEjecutar Applets Swing. Si no ests intesado en compilar y ejecutar programasSwing, puedes saltar directamente a Un Ruta Rpida por el Cdigo de unaAplicacin Swing, que te guiar a travs del cdigo de una sencilla aplicacin.

    Las instrucciones de esta seccin asumen que ya sabes escribir y compilarprogramas Java.

    Cmo se compila un programa Swing depende de si se est utilizando el JDK 1.1 oel JDK 1.2. Usar el JDK 1.2 es un poco ms sencillo porque tiene incluido la versinde Swing. Elige las instrucciones correspondientes a la versin que estsutilizando:

    JDK 1.2l

    JDK 1.1 + JFC/Swing Releasel

    Las instrucciones explican cmo ejecutar un programa sencillo, llamadoSwingApplication, 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 conel JDK 1.2.:

    Descargar la ltima versin del JDK 1.2, si no lo has hecho y.1.

    Crear un programas que use componentes Swing.2.

    Compilar el programa.3.

    Ejecutar el programa.4.

    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 Swing

    Puedes usar un programa sencillo que nosotros proporcionamos, llamadoSwingApplication. Por favor, descarga y guarda este fichero:SwingApplication.java. El nombre del fichero debe ser exactamente"SwingApplication.java" incluyendo las maysculas.

    Compilar un Programa que usa Componentes Swing

    El siguiente paso es compilar el programa. Compilar un programa Swingcon el JDK 1.2 es sencillo, ya que los paquetes Swing forman parte delJDK 1.2. Aqu tenemos un ejemplo:

    javac -deprecation SwingApplication.java

    Si no puedes compilar SwingApplication.java, ser probablementeporque ests usando un compilador del JDK 1.1 en vez de uno del JDK1.2, o porque ests usando una versin beta del JDK 1.2. Deberas poderejecutar los programas de esta seccin sin cambiarlos si te hasactualizado a la versin ms reciente del JDK 1.2.

    Si debes usar el JDK 1.2 Beta 4, por alguna razn, aqu puedes ver cmocambiar SwingApplication.java para usar los antiguos nombres depaquetes:

    //import javax.swing.*; //comment out this line import com.sun.java.swing.*;//uncomment this line

  • Puedes ver Nombres de Paquetes Swing para ms informacin sobre losdistintos nombres de paquetes.

    Ejecutar el ProgramaUna vez que el programa se ha compilado satisfactoriamente, podemosejecutarlo.

    Asumiendo que nuestro programa usa un Aspecto y Comportamientoestndard -- como el Aspecto y Comportamiento Java, o Windows oCDE/Motif -- podemos usar el intrpre del JDK 1.2 para ejecutar elprogramas sin aadir nada al path de clases. Por ejemplo:

    java SwingApplication

    Si se usa un Aspecto y Comportamiento no estndard, deberemosasegurarnos de que su paquete est incluido en el path de clases. Porejemplo:

    Solaris: java -classpath .:/home/me/lnfdir/newlnf.jar SwingApplication Win32: java-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 conel JDK 1.2 y JFC/Swing:

    Descargar la ltima versin del JDK, si no lo has hecho ya.1.

    Descargar la ltima versin del JFC 1.1.2.

    Crear un programa que use componentes Swing.3.

    Compilar el programa.4.

    Ejecutar el programa.5.

    Descargar la ltima Versin del JDK 1.1Puedes descargar gratis la implementacin de referencia del JDK 1.1desde java.sun.com. Slo tienes que ir a la pgina apropiada para tuplataforma -- Solaris o Win32.

    Descargar la ltima versin de JFC/Swing

    Puedes desacargar la ltima versin del JFC 1.1 en la Home Page delJFC. Esta seccin describe la versin Swing 1.1 del JFC 1.1.

    Crear un Programa que use Componentes Swing

    Puedes usar un programa sencillo que nosotros proporcionamos, llamadoSwingApplication. Por favor, descarga y guarda este fichero:SwingApplication.java. El nombre del fichero debe ser exactamente"SwingApplication.java" incluyendo las maysculas.

    Compilar un Programa que use Componentes Swing

    El siguiente paso es compilar el programa. Aqu puedes ver unaexplicacin general de cmo compilar una aplicacin Swing con el JDK1.1:

    Anota dnde se encuentra tu copia del JFC 1.1 (Swing 1.1). Elarchivo de clases Swing swing.jar, est en el directorio superior deesta versin. Podras querer crear una variable de entorno llamadaSWING_HOME que contenga el path del directorio superior de la

    1.

  • versin del JFC 1.1.

    Nota: No descomprimas el archivo swing.jar!

    Anota dnde est instalada tu versin del JDK. Necesitas esto parapoder encontrar las versiones apropiadas de las clases del JDK y elintrprete. Podras querer crear una variable de entorno llamadaJAVA_HOME que contenga el path del directorio superior de laversin del JDK.

    Las clases del JDK estn en el directorio lib del JDK, en un ficherollamado classes.zip. No descomprimas este fichero!. El intrpreteJava est en el directorio bin del JDK.

    2.

    Compila la aplicacin especificando un classpath que incluya elfichero swing.jar, el fichero classes.zip, y el directorio quecontenga las clases del programa (normalmente "."). Asegurate deque el fichero classes.zip y el compilador utilizado sonexactamente de la misma versin del JDK!.

    3.

    El siguiente ejemplo muestra cmo compilar SwingApplication en unsistema UNIX. Asume que has configurado las variables de entornoJAVA_HOME y SWING_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 comoste:

    javac -classpath .:/home/me/swing-1.1/swing.jar: /home/me/jdk1.1.7/lib/classes.zipSwingApplication.java

    Aqu puedes ver un ejemplo de compilacin sobre Win32:

    %JAVA_HOME%\bin\javac -deprecation -classpath.;%SWING_HOME%\swing.jar;%JAVA_HOME%\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\lib\classes.zip SwingApplication.java

    Nota: Si no puedes compilar SwingApplication.java,probablemente ser debido a que no tienes los ficheroscorrectos en el classpath o a que ests usando una versin delJFC 1.1 que tiene un API Swing antiguo. Deberas poderejecutar los programas de esta seccin sin cambiarlos si te hasactualizado a la versin ms reciente del JFC 1.1.

    Antes de la Beta 3 de Swing 1.1, el API Swing usaba nombresde paquetes diferentes. Aqu puedes ver cmo modificar

  • SwingApplication.java para usar los antiguos nombres depaquetes:

    //import javax.swing.*; //comment out this line importcom.sun.java.swing.*; //uncomment this line

    Puedes ver Nombres de Paquetes Swing para ms informacinsobre los distintos nombres de paquetes.

    Ejecutar el ProgramaUna vez que el programa se ha compilado satisfactoriamente, podemosejecutarlo.

    Asegurate de que el classpath del intrprete no slo incluye lo quenecesites para compilar el fichero, sino que tambin debe incluir elfichero para el Aspecto y Comportamiento que use el programa. ElAspecto y Comportamiento Java, que es el valor por defecto, est en elfichero swing.jar. El Aspecto y Comportamiento Windows est enwindows.jar, y el Aspecto y Comportamiento CDE/Motif est enmotif.jar. No ests limitado a estas opciones deAspecto-y-Comportamiento; puedes usar cualquier otro Aspecto yComportamiento diseado para usarse con el API de Swing 1.1.

    Esta aplicacin usa el Aspecto y Comportamiento Java, por eso slonecesitamos swing.jar en el path de clases. As, el comando paraejecutarlo sera similar al comando para compilarlo. Slo hay quesustituir java por javac, y eliminar el sufijo .java. Por ejemplo, enUNIX:

    java -classpath .:/home/me/swing-1.1/swing.jar: /home/me/jdk1.1.7/lib/classes.zipSwingApplication

    Aqu hay un ejemplo de ejecucin de una aplicacin que usa el Aspecto yComportamiento Windows:

    %JAVA_HOME%\bin\java -classpath .;%SWING_HOME%\swing.jar;%JAVA_HOME%\lib\classes.zip;%SWING_HOME%\windows.jar SomeClass

    Mientras ests desarrollando tu aplicacin puedes simplificar el path declases usando swingall.jar, que incluye todas las clases de la versinJFC 1.1. Por eso en lugar de poner swing.jar y windows.jar en tu pathde clases, por ejemplo, puedes poner slo swingall.jar.

    Importante: Evita usar swingall.jar en tu aplicacin final,contiene informacin usada por desarrolladores, as cmo lospaquetes de Aspecto y Comportamiento que usa una aplicacintpica. Puedes disminuir el tamao usando slo el ficheroswing.jar adems de los arhivos de Aspecto y

  • Comportamiento que necesites.

  • Swing

    Ejecutar un Applet SwingSe pueden ejecutar applets Swing en cualquier navegador que tenga instalado elJava Plug-in. Otras opciones son utilizar un navegador que sea complatible con elJDK 1.1 y que pueda encontrar las clases Swing, o un navegador que seacompatible con el JDK 1.2. Actualmente, el nico navegador compatible 1.2disponible es la utilidad AppletViewer proporcionada con el JDK 1.2. Para obtenerinformacin sobre como configurar los navegadores compatibles 1.2 para quetabajen 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 otro applet swing, es queste ltimo debe descender de la clase JApplet, en vez de hacerlo directamente dela clase Applet. Para ms informacin sobre los applets puedes ver Introduccin alos Applets

    Puedes ver una caja debajo de este prrafo que contiene el texto: "You aresuccessfully running a Swing applet"? Si es as, tu navegador est configuradocorrectamente.

    Nota: Como el applet anterior utiliza Java Plug-in 1.1.1, es una versinSwing 1.0.3 del applet. Para ejecutar la versin Swing 1.1 Beta 3 delapplet, podemos utilizar el AppletViewer para verHelloSwingApplet.html, especificando swing.jar en el path de clasesdel AppletViewer.

    Puedes encontrar el cdigo fuente del applet enHelloSwingApplet.java, y el cdigo HTML para incluir el applet viendoel cdigo de sta misma pgina. La mala noticia es que el cdigo HTMLpara incluir el applet es un poco enrevesado. La buena noticia es que sepuede generar el cdigo HTML para una sencilla etiqueta automticamente. Puedes ver la documentacin del Java Plug-in paraobtener detalles sobre cmo descargar un conversor HTML gratis.

    Aqu puedes ver un applet ms complejo, con mltiples ficheros declases y un fichero de imagen. El cdigo del applet est enAppletDemo.java. Tambin utiliza el fichero ../images/middle.gif.

    El resto de esta pgina ofrece instrucciones paso a paso para ejecutar losapplets anteriores.

  • Paso a Paso: Ejecutar un Applet Basado en SwingEncontrar un navegador compatible 1.1 1,2, o descargar el JavaPlug-in dentro de un navegador compatible. Asegurate de quetienes la ltima versin tanto del navegador como del plug-in, yaque las ltimas versiones tienden a corregir errores que hacen queSwing funcione mejor. Los dos navegadores Java 1.1 son HotJavabrowser y el Applet Viewer (appletviewer), que se distribuye conel JDK. Una versin 1.2 del Appletviewer se distribuye en el JDK1.2. El Java Plug-in lo soportan varias versiones de NetscapeNavigator e Internet Explorer; puedes ver la Documentacin delJava Plug-in para obtener ms detalles.

    1.

    Si ests utilizando un navegador compatible 1.1 sin el Java Plug-in,determina cmo cargar el fichero Swing JAR en tu navegador.Puedes ver Configurar el Path de Clases del Navegador para ver unejemplo de cmo poner un fichero JAR de Swing en el path declases del Appletviewer. Puedes ver Make Your Browser Swing enThe Swing Connection para ver cmo hacer lo mismo con InternetExplorer y Netscape Navigator.

    2.

    Apunta a esta pgina.3.

  • Swing

    Una Ruta Rpida por el Cdigo de una AplicacinSwingEsta pgina te lleva a travs del cdigo del programa SwingApplication. Lasiguiente leccin, Caractersticas y Conceptos Swing, proporciona explicacionescompletas sobre los tpicos introducidos en esta seccin. Tambin proporciona, unejemplo mayor y ms realista, que puedes usar para ampliar y probar tusconocimientos 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 encontrarel programa completo en SwingApplication.java.

    Esta pgina explica el programa en detalle, incluyendo los siguientes aspectos:Importar paquetes Swingl

    Elegir el Aspecto y Comportamientol

    Configurar el Contenedor de alto nivell

    Configurar botones y etiquetasl

    Aadir Componentes a los Contenedoresl

    Aadir Bordes alrededor de los Componentesl

    Manejar Eventosl

    Tratar con los problemas de Threadsl

    Soportar Tecnologas Asistivasl

    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 JDK1.2 usaban nombres de paquetes diferentes. Puedes verNombres de Paquetes Swing para ms detalles.

    Los programas Swing tambin necesitan clases de los paquetesprincipales del AWT:

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

    Elegir el Aspecto y Comportamiento

    Aqu puedes ver el cdigo que utiliza SwingApplication para seleccionarsu aspecto y comportamiento:

    public static void main(String [] args) { try { UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); } catch (Exception e){ } ..//Crea y muestra el GUI... }

    El cdigo anterior, esencialmente dice, "No me importa si el usuario aelegido un aspecto y comportamiento -- utiliza el aspecto ycomportamiento multi-plataforma." Esta aproximacin dictatorial tienesentido cuando el program ha sido diseado con un aspecto ycomportamiento particular en mente. El aspecto y comportamientomulti-plataforma es conocido como Aspecto y Comportamiento Java (conel nick "Metal").

    Para ms informacin sobre cmo especificar el aspecto ycomportamiento, puedes ver la pgina Cmo Seleccionar el Aspecto yComportamiento

    Configurar el Contenedor de Alto Nivel

    Todo programa que presente un GUI Swing contiene al menos uncontenedor Swing de alto nivel. Para la mayora de los programas, loscontenedores de alto nivel Swing son ejemplares de JFrame, JDialog, o(para los applets) JApplet. Cada objeto JFrame implementa unaventana secundaria. Cada objeto JApplet implementa un rea depantalla de un applet dentro de una ventana del navegador. Uncontenedor de Alto Nivel Swing porporciona el soporte que necesitan loscomponentes Swing para realizar su dibujado y su manejo de eventos.

    El ejemplo SwingApplication tiene un slo contenedor de alto nivel, unJFrame. Cuando el usuario cierra el frame, la aplicacin finaliza. Aquest el cdigo que configura y muestra el frame:

    public class SwingApplication { ... public static void main(String[] args) { ... JFrameframe = 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 upthe frame, and show it. frame.addWindowListener(new WindowAdapter() { publicvoid windowClosing(WindowEvent e) { System.exit(0); } }); frame.pack();frame.setVisible(true); } }

    Para ms informacin sobre los contenedores de alto nivel puedes verLos Componentes Swing y el rbol de Herencia de Contenedores

    Configurar los Botones y las Etiquetas

    Como la mayora de los GUIs, el ejemplo de SwingApplication contieneun botn y una etiqueta. (Al contrario que la mayora de los GUIs, estoes todo lo que tiene SwingApplication). Aqu podemos ver el cdigoque inicializa el botn:

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

    La primera lnea crea el botn, La segunda lnea selecciona la letra "i"como mnemnico que el usuario puede utilizar para simular un click delbotn. Por ejemplo, en el Aspecto y Comportamiento Metal, teclear Alt+iresulta en un click del botn. La tercera lnea registra un manejador deeventos para el click del botn. Podremos ver el cdigo del manejador deeventos en Menajear Eventos.

    Aqu podemos 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 initialization code:final JLabel label = new JLabel(labelPrefix + "0 "); ... label.setLabelFor(button);...//in the event handler for button clicks: label.setText(labelPrefix + numClicks);

    El cdigo anterior es bastante conocido, excepto la lnea que invoca almtodo setLabelFor. Este cdigo existe slo para indicar a lastecnologas asistivas que la etiqueta describe el botn. Para msinformacin, puedes ver Supporting Assistive Technologies.

    Finalmente, aqu est el cdigo que inicializa el panel:

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

    Para ms informacin sobre los componentes Swing como los botones ylas etiquetas, puedes ver Usar Componentes Swing

    Aadir Componentes a los Contenedores

    SwingApplication agrupa la etiqueta y el botn en un contenedor (unJPanel) antes de aadir los componentes al frame. Aqu est el cdigo

  • que inicializa el panel:

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

    La primera lnea de cdigo crea el panel. La segunda le aade un borde;explicaremos los bordes ms tarde.

    La tercera lnea de cdigo crea un controlador de distribucin que fuerzael contenido del panel a dibujarse en una sla columna. La ltima lneaaade el botn y la etiqueta al panel. Aadir el botn y la etiqueta alpanel significa que estn controlados por el controlador de distribucindel panel. Especficamente, el controlador de distribucin de uncontenedor determina el tamao y la posicin de cada componente quehaya sido aadido al contenedor.

    Los conceptos de los controladores de distribucin se describen enControladores de Distribucin. Para aprender cmo usar controladores dedistribucin individuales, puedes ver la leccin Distribuir ComponentesDentro de un Contenedor.

    Aadir Bordes Alrededor de los Componentes

    Aqu est, de nuevo, el cdigo que aade el borde al JPanel:

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

    Este borde simplemente proporciona un espacio en blanco alrededor delpanel de contenidos -- 30 pixels extras en la parte superior, izquierda yderecha y 10 pixels extras en la parte inferior. Los bordes son unacaractersitcas que JPanel de la clase Component.

    Los conceptos de los bordes se describen en Control de la distribucin yen Dibujo

    Manejar EventosEl ejemplo SwingApplication contiene dos manejadores de eventos.Uno maneja las pulsaciones del botn (eventos action) y otro maneja loseventos de cerrar ventana:

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

    Puedes leer sobre el manejo de eventos Swing en Manejo de Eventos yen la leccin Escribir Oyentes de Eventos.

  • Tratar con Problemas de Threads

    El programa SwingApplication es de thread seguro. Una vez que suGUI es visible, en el manejador de eventos slo ocurre manipulacin GUI(actualizar la etiqueta). Como el manejador de eventos se ejecuta en elmismo thread que realiza todo el manejo de eventos y pintado de laaplicacin, no existe la posibilidad de que dos threads intenten manipularel 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 threadsseguros en Swing.

    Soportar Tecnologas Asistivas

    El soporte para tecnologas asistivas -- dispositivos como lectores depantalla que proporcionan formas alternativas de acceder a lainformacin de un GUI -- ya est incluido en cada componente Swing. Elnico cdigo que existen en SwingApplication que maneja el soportede tecnologas asistivas es este:

    label.setLabelFor(button);

    Adems, la siguientes lneas seleccionan la informacin que puede serutilizada 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 sobrecmo asegurarte de que tu programa funciona bien con herramientasque usan el API de accesibilidad para pedir componentes.

  • Swing

    Caractersticas y Conceptos SwingEsta leccin presenta las caractersticas de Swing y explica todos los conceptos quenecesitas para poder utilizar los componentes Swing de forma efectiva. Al final deest leccin diseccionamos un programa Swing, como revisin de todo lo que hasaprendido.

    Los Componentes Swing y el rbol de ContenedoresEsta seccin muestra todos los componentes Swing y te cuenta comocombinarlos, en general, para crear un GUI. Swing proporciona muchoscomponentes GUI estndards como botones, listas, mens, y reas detexto. Tambin incluye contenedores como ventanas y barras deherramientas.

    Control de la Distribucin

    Los Contenedores usan controladores de ditribucin para determinarel tamao y la posicin de los componentes que contienen. Los bordesafectan a la distribucin de un GUI Swing haciendo los componentes msgrandes. Tambin puedes usar componentes invisibles que afecten a ladistribucin.

    Manejo de EventosEl Manejo de Eventos es la forma en que los programas responden alos eventos externos, como una pulsacin de usuario, Los programasSwing realizan todo su dibujado y menejo de eventos en el thread dedespacho de eventos.

    DibujadoDibujado significa el dibujo del componente en la pantalla. Aunque essencillo personalizar el dibujado de un componente, la mayora de losprogramas lo ms complicado que hacen es personalizar el borde delcomponente.

    Threads y Swing

    Si haces algo a algn componente visible que podra afectar 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 demanejo de eventos. Sin embargo, otros programas necesitan usar elmtodo invoekLater para ejecutar las llamadas al componenterelacionado desde el thread de despacho de eventos.

    Ms Caractersticas y Conceptos Swing

    Esta seccin presenta todava ms caractersticas y conceptos Swing, conenlaces a dnde encontrar ms informacin sobre ellas. Los tpicosincluyen, las caractersitcas de la clase JComponent, iconos, actions,soporte de Aspecto y Comportamiento Conectable, Tecnologas Asistivasy modelos separados.

    La Anatoma de un Programa Swing

    Esta seccin desmenuza una aplicacin Swing, llamada 'Converter' pararevisar cmo funcionan los programas Swing.

  • Swing

    Los Componentes Swing y el rbol de ContenidosEsta seccin presenta algunos de los componentes ms utilizados de Swing yexplica como los componentes de un GUI entran juntos en un contenedor. Parailustrarlo, usaremos el programa SwingApplication presentado en Una RutaRpida por el Cdigo de una Aplicacin Swing. Y aqu est su aspecto de nuevo:

    SwingApplication crea cuatro componentes Swing muy utilizados:un frame, o ventana principal (JFrame)l un panel, algunas veces llamado pane (JPanel)l un botn (JButton)l una etiqueta (JLabel)l

    El frame es un contenedor de alto nivel. Existe principalmente para proporcionarespacio para que se dibujen otros componentes Swing. Los otros contenedores dealto nivel ms utilizados son los dilogos (JDialog) y los applets (JApplet).

    El panel es un contenedor intermedio. Su nico propsito es simplificar elposicionamiento del botn y la etiqueta. Otros contenedores intermedios, como lospaneles desplazables, (JScrollPane) y los paneles con pestaas (JTabbedPane),tpicamente juegan un papel ms visible e interactivo en el GUI de un programa.

    El botn y la etiqueta son componentes atmicos -- componentes que existen nopara contener otros componentes Swing, sino como entidades auto-suficientes querepresentan bits de informain para el usuario. Frecuentemente, los componentesatmicos tambin obtienen entrada del usuario. El API Swing proporciona muchoscomponentes atmicos, incluyendo combo boxes (JComboBox), campos de texto(JTextField), y tablas (JTable).

    Aqu podemos ver un digrama con el rbol de contenidos de la ventanamostrada por SwingApplication. Este digrama muestra todos los contenedorescreados o usados por el programa, junto con los componentes que contienen.

  • Observa que si aadimos una ventana -- por ejemplo, un dilogo -- la nuevaventana tendra su propio rbol de contenidos, independiente del mostrado en estafigura.

    JFrame (un contenedor de algo nivle) | ...

    | panel de contenido | JPanel | +----------------+

    | | JButton JLabelComo muestra la figura, incluso el programa Swing ms sencillo tiene mltiplesniveles en su rbol de contenidos. La raz del rbol de contenidos es siempre uncontenedor de alto nivel. Este contenedor proporciona espacio para que suscomponentes Swing descendentes se dibujen a s mismo.

    Truco: Para ver el rbol de contenidos de cualquier frame o dilogo,pulsa el borde para seleccionarlo y pulsa Control-Shift-F1. Se escribiruna lista con el rbol de contenidos en el stream de salida estndard.

    Todo contenedor de alto nivel contiene indirectamente un contenedor intermedioconocido como panel de contenido. Para la mayora de los programas nonecesitas 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 oindirectamente, todos los componentes visibles en el GUI de la ventana. La granexcepcin a esta regla es que si el contenedor de alto nivel tiene una barra demen, 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 delmtodo add. Este mtodo tiene al menos un argumento -- el componente a aadir.Algunas veces se requiere un argumento adicional para proporcionan informacinde distribucin. Por ejemplo, la ltima lnea del siguiente cdigo de ejemploespecifica que el panel debera estar en el centro de su contenedor (el panel decontenido).

    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 losComponentes Swing.

  • Swing

    Control de DistribucinLas siguientes figuras muestran los GUIs de cinco programas, cada uno de ellosmuestra cinco botones. Los botones son idnticos, y el cdigo de los programas escasi idntico. Entonces por qu parecen tan diferentes? Porque usan diferentescontroladores de distribucin para controlar el tamao y posicin de los botones.

    Control de Distribucin es el proceso de determinar el tamao y posicin de loscomponentes. Por defecto, cada contenedor tiene un controlador de distribucin-- un objeto que realiza el control de la distribucin de los componentes dentro delcontenedor. Los componentes pueden proporcionarle al controlador de disposicinsus preferencias en cuanto a tamao y alineamiento, pero la ltima palabra la tieneel controlador de disposicin.

    La plataforma Java suministra cinco controladores de disposicin comunmenteutilizados: BorderLayout, BoxLayout, FlowLayout, GridBagLayout, yGridLayout. Estos controladores de distribucin estn diseados para mostrarmltiples componentes a la vez, y se han visto en la figura anterior. Una sextaclase proporcionada, CardLayout, es un controlador de disposicin de propsitogeneral usado en combinacin con otros controladores de distribucin. Puedesencontrar detalles sobre cada uno de estos seis controladores, incluyendo clavespara 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. Algunoscontroladores como BorderLayout requiere que especifiquemos la posicinrelativa del componente en el contenedor, usando un argumento extra para elmtodo add. Ocasionalmente, un controlador de distribucin comoGridBagLayout requiere elaborados procesos de configuracin. Sin embargo,muchos controladores de distribucin simplemente sitan los componentes en elorden en que fueron aadidos a su contenedor.

    Todos esto probablemente suena ms complicado de lo que s. Si quieres puedescopiar el cdigo de nuestros ejemplos de Usar Componentes Swing o buscar elcontrolador de distribucin individual en Usar Controladores de Distribucin.Generalmente, slo tendrs que seleccionar el controlador de distribucin de dostipos de contenedores: paneles de contenido (que usan BorderLayout pordefecto) y JPanel (que usan FlowLayout por defecto).

    El resto de esta seccin describe algunas de las tareas ms comunes de ladistribucin:

    Seleccionar el Controlador de Distribucinl

    Proporcionar Consejos sobre un Componentel

    Poner Espacio entre Componentesl

    Cmo Ocurre el Control de Distribucinl

    Seleccionar el Controlador de Distribucin

    Podemos cambiar fcilmente el controlador de distribucin que usa uncontenedor. Slo se debe llamar al mtodo setLayout del contenedor.Por ejemplo, aqu est el cdigo que hace que un panel useBorderLayout:

    JPanel pane = new JPanel();pane.setLayout(new BorderLayout());Aunque recomendamos que uses controladores de distribucin, se puederealizar la distribucin sin ellos. Seleccionando una propiedad dedistribucin del contenedor a nulo, podemos hacer que el contenedor nouse ningn controlador de distribucin. Con este esquema, llamadoposicionamiento absoluto, podemos especificar el tamao y posicinde cada componente dentro del contenedor. Una desventaja delposicionamiento absoluto es que no se ajusta bien cuando seredimensiona el contenedor de alto nivel. Tampoco se ajusta bien a lasdiferencias entres usuarios y sistemas, como los diferentes tamaos defuente.

    Proporcionar Consejos sobre un Componente

  • Algunas veces necesitamos personalizar el tamao que un componenteproporciona al controlador de distribucin del contenedor, para que elcomponente se vea bien. Se puede hacer esto proporcionando lostamaos mnimo, preferido y mximo del componente. Tambinpodemos llamar a los mtodos de seleccin de tamao del componente-- setMinimumSize, setPreferredSize, y setMaximumSize -- opodemos crear una subclase del componente que sobreescriba losmtodos apropiados -- getMinimumSize, getPreferredSize, ygetMaximumSize. Actualmente, el nico controlador de distribucin enla plataforma Java que presta atencin a la peticin de tamao mximodel componente es BoxLayout.

    Adems de proporcionar preferencias de tamao, podemos especificarpreferencias de alineamiento. Por ejemplo, podemos especificar que losbordes superiores de dos componentes deberan estar alineados. Seseleccionan los consejos de alineamiento llamando a los mtodossetAlignmentX y setAlignmentY del componente, o sobreescribiendolos mtodos, getAlignmentX y getAlignmentY del componente.Realmente BoxLayout es el nico controlador de distribucin que prestaatencin a los consejos de alineamiento.

    Poner Espacio entre Componentes

    Tres factores influyen en la cantidad de espacio entre los componentesvisibles de un contenedor:El controlador de distribucin

    Algunos controladores de distribucin ponen automticamenteespacio entre los componentes; otros no. Algunos permiten inclusoespecificar la cantidad de espacio entre los componentes. Puedesver Distribuir Componentes dentro de un Contenedor sobre elsoporte de espaciado de cada controlador de distribucin.

    Componentes invisibles.Se pueden crear componentes de peso ligero que no realicendibujo, pero que ocupen espacio en el GUI. Frecuentemente se usanlos componentes invisibles en contenedores controlados porBoxLayout. Puedes ver Cmo usar BoxLayout para ver ejemplosde uso de componentes invisibles.

    Bordes vacosNo importa cual sea el controlador de distribucin, podemos afectarla aparente cantidad de espacio entre componentes aadiendolesbordes. Los mejores candidatos para los bordes vacos son los quetpicamente no tienen bordes, como los paneles y las etiquetas.Algunos otros componentes, como paneles desplazables, nofuncionan bien con bordes en algunas implementaciones del

  • Aspecto y Comportamiento, debido a la forma en que implementansu cdigo de dibujo. Para ms informacin sobre los bordes puedesver Cmo usar Bordes.

    Cmo Ocurre el Control de Distribucin

    Aqu hay un ejemplo de secuencia de control de distribucin para unframe (JFrame).

    Despus de que el GUI est construido, se llama al mtodo packsobre el JFrame. Esto especifica que el frame debera ser de sutamao preferido.

    1.

    Para encontrar el tamao preferido del frame, el controlador dedistribucin aade el tamao de los lados del frame al tamaopreferido del componente directamente contenido por el frame. Estoes la suma del tamao preferido del panel de contenido, ms eltamao de la barra de men del frame, si existe.

    2.

    El controlador de disposicin del panel de contenido es responsablede imaginarse el tamao preferido del panel de contenido. Pordefecto, este controlador de disposicin es un objetoBorderLayout. Sin embargo, asumamos que lo hemosreemplazado con un objeto GridLayout que se ha configurado paracrear dos columnas. Lo interesante de gridlayout es que fuerza aque todos los componentes sean del mismo tamao, e intentahacerlos tan anchos como la anchura preferida del componente msancho, y tan altos como la altura preferida del componente msalto.

    Primero, el controlador gridlayout pregunta el panel de contenidopor su insets -- el tamao del borde del panel de contenido, siexiste. Luego, el controlador de gridlayout le pregunta a cadacomponente del panel de contenido sus tamaos preferidos,anotando la mayor anchura preferida y la mayor altura preferia.Luego calcula el tamao preferido del panel de contenido.

    3.

    Cuando a cada botn se le pide su tamao preferido, el botnprimero comprueba si el usuario ha especificado un tamaopreferido. Si es as, reporta este tamao. Si no es as, le pregunta asu Aspecto y Comportamiento el tamao preferido.

    4.

    El resultado final es que para determinar el mejor tamao de un frame,el sitema determina los tamaos de los contenedores en la parte inferiordel rbol de contenidos. Estos tamaos filtran el rbol de contenidos,eventualmente determinan el tamao total del frame. De forma similarocurren los clculos cuando se redimensiona el frame.

    Para ms informacin sobre control de distribucin, puedes ir a DistribuirComponentes Dentro de un Contenedor.

  • Swing

    Manejo de EventosCada vez que el usuario teclea un caracter o pulsa un botn del ratn, ocurre unevento. Cualquier puede ser notificado del evento. Todo lo que tiene que hacer esimplementar el interface apropiado y ser registrado como un oyente de evento delevento fuente apropiado. Los componentes Swing puede generar muchas clases deevento. Aqu hay unos pocos ejemplos:

    Accin que resulta en el evento Tipo de oyenteEl usuario pulsa un botn, presiona Returnmientras teclea en un campo de texto, o elige untem de men.

    ActionListener

    El usuario elige un frame (ventana principal). WindowListenerEl usuario pulsa un botn del ratn mientras elcursor est sobre un componente. MouseListener

    El usuario mueve el cursor sobre un componente. MouseMotionListenerEl componente se hace visible. ComponentListenerEl componente obtiene obtiene el foco del teclado. FocusListenerCambia la tabla o la seleccin de una lista. ListSelectionListener

    Cada evento est representado por un objeto que ofrece informacin sobre el eventoe identifica la fuente. Las fuentes de los eventos normalmente son componentes, perootros tipos de objetos tambin pueden ser fuente de eventos. Como muestra lasiguiente figura, cada fuente de evento puede tener varios oyentes registrados.Inversamente, un slo oyente puede registrarse con varias fuentes de eventos.

    event event object /----> event listenersource ---------------------------> event listener \----> event listener

    Descripcin: Mltiples oyentes pueden ser registrados para ser notificados de eventos de un tipo particular sobre una fuente particular.Cuando queramos detectar los eventos de un componente determinado, primerodebemos chequear la seccin "Cmo se usa" el componente. Esta seccin ofreceejemplos de manejo de eventos de los que querrs utilizar. Por ejemplo, Cmo crearFrames ofrece un ejemplo de escritura de un oyente de window que sale de laaplicacin cuando se cierra el frame.

    Cmo Implementar un Manejador de Eventos

  • Todo manejador de eventos requiere tres partes de cdigo:Donde se declare la clase del manejador de eventos, el cdigoespecifica que la clase o implementa un interface de oyente, odesciende una clase que implementa un interface de oyente. Porejemplo:

    public class MyClass implements ActionListener {

    1.

    El cdigo que registra un ejemplar de la clase de manejo de eventosde un oynete sobre uno o ms componentes. Por ejemplo:

    someComponent.addActionListener(instanceOfMyClass);

    2.

    La implementacin de los mtodos del interface oyente. Por ejemplo:

    public void actionPerformed(ActionEvent e) { ...//code that reacts to the action...}

    3.

    Un escenario de manejo de eventos tpico ocurre con los botones(JButton). Para detectar cuando el usuario pulsa un botn de la pantalla (opulsa la tecla equivalente), un programa debe tener un objeto queimplementa el interface ActionListener. El programa debe registrar esteobjeto como un oyente de actin del botn (la fuente del evento), usando elmtodo addActionListener. Cuando el usuario pulsa el botn de lapantalla, ste dispara el evento action, Esto resulta en una llamada almtodo actionPerformed del oyente de action, el nico mtodo delinterface ActionListener). El nico argumento del mtodo es un objetoActionEvent que ofrece informacin sobre el evento y su fuente.

    ActionEventbutton ----------------------------> action listener

    Descripcin: Cuando el usuario pulsa un botn, 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 quepuede hacer el cdio algo ms confuso -- hasta que hayas usado las clasesinternas. Para ms informacin sobre el uso de clases internas, puedes verUsar Adaptadores y Clases Internas para Manejar Eventos.

    Para ms informacin sobre la implementacin de manejo de eventos,puedes ver Escribir Oyentes de Eventos.

    Los Threads y el Manejo de EventosEl cdigo de manejo de eventos se ejecuta en un slo threadm el threadde despacho de eventos. Esto asegura que todo manejador de eventos se

  • terminar de ejecutar antes de ejecutar otro. Por ejemplo, el mtodoactionPerformed del ejemplo anterior se ejecuta en el thread de manejode eventos. El cdigo de dibujo tambin se realiza en el thread de despachode eventos. Esto significa que mientras se est ejecutando el mtodoactionPerformed, el GUI del programa est congelado -- no se dibujarnada ni se responder a las pulsaciones del ratn, por ejemplo.

    Importante: El cdigo de manejo de eventos debera ejecutarcada pulsacin! De otro modo, el rendimiento de tu programa severa empobrecido. Si necesitas hacer una operacin de largaoperacin como resultado de un evento, hazlo arrancando unnuevo thread (o de otro modo envindo una peticin a otrothread) para realizar la operacin. Para obtener ayuda sobre leuso de threads, puedes ver Cmo usar Threads.

  • Swing

    DibujoPodras no necesitar la informacin de esta seccin, en absoluto. Sin embargo, situs componentes parece que no se dibujan correctamente, entender los conceptosde esta seccin podra ayudarte a ver qu hay errneo. De igual modo, necesitarsentender esta seccin si creas cdigo de dibujo personalizado para un componente.

    Cmo funciona el dibujoCuando un GUI Swing necesita dibujarse a s mismo -- la primera vez, oen respuesta a la vuelta de un ocultamiento, o porque necesita reflejarun cambio en el estado del programa -- empieza con el componente msalto 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 hechoms eficiente mediante el manejador de dibujo de Swing y el cdigo dedoble buffer.

    Los componentes Swing generalmente se redibujan a s mismos siempreque es necesario. Por ejemplo, cuando llamamos al mtodo setText deun componente, el cmponente debera redibujarse automticamente as mismo, y si es necesario, redimensionarse. Si no lo hace as es unbug. El atajo es llamar al mtodo repaint sobre el componente parapedir que el componente se ponga en la cola para redibujado. Si senecesita cambiar el tamao o la posicin del componente pero noautomticamente, deberamos llamar al mtodo revalidate sobre elcomponente antes de llamar a repaint.

    Al igual que el cdigo de manejo de eventos, el cdigo de dibujo seejecuta en el thread del despacho de eventos. Mientras se estmanejando un evento no ocurrir ningn dibujo. De forma similar, si laoperacin de dibujado tarda mucho tiempo, no se manejar ningnevento durante ese tiempo.

    Los programas slo deberan dibujarse cuando el sistema de dibujo se lodiga. La razn es que cada ocurrencia de dibujo de un propiocomponente debe ser ejecutado sin interrupcin. De otro modo, podranocurrir resultados imprecedibles. como que un botn fuera dibujadomedio pulsado o medio liberado.

    Para acelerar, el dibujo Swing usa doble-buffer por defecto -- realizadoen un buffer fuera de pantalla y luego lanzado a la pantalla una vez

  • finalizado. Podra ayudar al rendimiento si hacemos un componenteSwing opaco, para que el sistema de dibujo de Swing pueda conocer loque no tiene que pintar detrs del componente. Para hacer opaco uncomponente Swing, se llama al mtodo setOpaque(true) sobre elcomponente.

    Los componentes no-opacos de Swing puede parecer que tienencualquier forma, aunque su rea de dibujo disponible es siemprerectangular. Por ejemplo, un botn podra dibujarse a s mismodibujando un octgono relleno. El componente detrs del botn, (sucontenedor, comunmente) sera visible, a travs de las esquinas de loslados del botn. El botn podra necesitar incluir cdigo especial dedeteccin para evitar que un evento action cuando el usuario pulsa enlas esquinas del botn.

    Un Ejemplo de DibujoPara ilustrar el dibujado, usaremos el programa SwingApplication, quese explic en Una Ruta Rpida a travs del Cdigo de una AplicacinSwing. Aqu podemos ver el GUI de SwingApplication:

    Y aqu su rbol de contenidos:

    JFrame (a top-level container) | ...

    | content pane

    | JPanel | +----------------+

    | | JButton JLabelAqu est lo que sucede cuando se dibuja el GUI de SwingApplication:

    El contenedor de alto nivel, JFrame, se dibuja as s mismo.1. El panel de contenido primero dibuja su fondo, que es un rectngulo2.

  • slido de color gris. Luego le dice al JPanel que se dibuje el mismo.El rectngulo del panel de contenido realmente no aparece en elGUI finalizado porque est oscurecido por el JPanel.

    Nota: Es importante que el panel de contenido sea opaco. De otromodo, resultar en dibujados confusos. Cmo el JPanel es opaco,podemos hacer que sea el panel de contenido (sustituyendosetContentPane por el cdigo existente getContentPane().add).Esto simplifica considerablemente el rbol de contenidos y eldibujado, eliminado un contenedor innecesario.

    El JPanel primero dibuja su fondo, un rectngulo slido de colorgris. Luego dibuja su borde. Esl borde es un EmptyBorder, que notendr efecto excepto para incrementar el tamao del JPanelreservando algn espacio extra en los laterales del panel.Finalmente, el panel le pide a sus hijos que se dibujen a s mismos.

    3.

    Para dibujarse a s mismo, el JButton dibuja su rectngulo defondo si es necesario y luego dibuja el texto que contiene. Si elbotn tiene el foco del teclado, significa que cualquier cosa que seteclee va directamente al botn para su procesamiento, luego elbotn realiza algn dibujado especfico del Aspecto yComportamiento para aclarar que tiene el foco.

    4.

    Para dibujarse a s misma, la JLabel dibuja su texto.5.

    De este modo, cada componente se dibuja a s mismo antes de que lohaga cualquier componente que contenga, Esto asegura que el fondo deun JPanel, por ejemplo, slo se dibuja cuando no est cubierto por unode los componentes que contiene. La siguiente figura ilustra el orden enque cada componente que desciende de JComponent se dibuja a smismo:

    1. fondo(si es opaco)

    2. dibujopersonalizado

    (si existe)

    3. borde(si existe)

    4. hijos(si existen)

    .............

    .............

    .............

    .............

    .............

    .............

    .............

    ....().......

    .............

    .............

    .............

    .............

    =============

    =...()......==...........=

    =...........=

    =...........=

    =============

    =============

    =...()......==.---------.=

    =.|JButton|.==.---------.=

    =============

    Para ms informacin sobe el dibujado, puedes ver la leccin Trabajarcon Grficos.

  • Swing

    Threads y SwingEsta pgina explica como usar el API Swing de forma segura con threads. Sinuestro programa es un applet, lo ms seguro es construir su GUI en el mtodoinit. Si nuestro programa es una aplicacin con el siguiente patrn comnestaremos seguros:

    //Thread-safe examplepublic class MyApplication { public static void main(String[] args) { JFrame f = new JFrame(...); ...//Add components to the frame here... 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 handlers such as actionPerformed(). ...

    }Sin embargo, si nuestro programa crea threads que realizan tareas que afectan alGUI, o manipulan un GUI ya visible en respuesta a algn evento del AWT, sigueleyendo!La Regla de los Threads

    Los componentes 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 operaciones estn garantizadas como seguras ante los threads.Cmo Ejecutar Cdigo en el Thread de Despacho de Eventos

    Si necesitamos acceder al UI desde fuera del cdigo del despachador deeventos o de dibujo, podemos usar los mtodos invokeLater oinvokeAndWait.

    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 threadtiles como SwingWorker o Timer.

    La Regla de los Threads

    La Regla de los Threads es la siguiente:

    Regla: Una vez que se haya realizado un componente Swing,todo el cdigo que pudiera afectar o depender del estado deese componente debera ejecutarse en el thread de despachode eventos.

    Esta regla podra sonar espeluznante, pero para la mayora de losprogramas sencillos, no tenemos que preocuparnos de los threads. Antesde entrar en detalles sobre cmo escribir cdigo Swing, definiremos dostrminos: realizado y thread de despacho de eventos.

    Realizado significa que el mtodo paint del componente haya sido opodra ser llamado. Un componente Swing que sea una ventana de altonivel se realiza habiendo llamado a uno de estos mtodos sobre ella:setVisible(true), show, o (lo que podra sorprendernos) pack. Una vezque una ventana se ha realizado, todos los componentes que contieneestn realizados. Otra forma de realizar un componente es aadirlo a uncomponente que ya est realizado.

    El thread de despacho de eventos es el thead que ejecuta el cdigo dedibujo y de despacho de eventos. Por ejemplo los mtodos paint yactionPerformed se ejecutan automticamente en el thread dedespacho de eventos. Otra forma de ejecutar cdigo en el thread dedespacho 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 queafecte a un componente Swing realizado debe ejecutare en el thread dedespacho de eventos:Unos pocos mtodos de threads seguros.

    En la Documentacin del API Swing, los mtodos de threadsseguros estn marcados con este texto:

    Este mtodo es seguro ante los threads, aunque muchosmtodos Swing no lo son. Por favor lea Threads andSwing para ms informacin.

    Un GUI de una aplicacin frecuentemente puede ser construido ymostrado en el thread principal.

    Mientras que no se haya realizado ningn componente (Swing o de

  • otro tipo) en el entorno de ejecucin actual, est construir ymostrar un GUI en el thread principal de una aplicacin. Paraayudarnos a ver por qu, aqu hay un anlisis del thread seguro dethread-safe example. Para refrescar nuestra memoria, aqu estnlas lneas ms importantes del ejemplo:

    public static void main(String[] args) { JFrame f = new JFrame(...); ...//Add components to the frame here... f.pack(); f.setVisible(true); //Don't do any more GUI work here.}

    El ejemplo construye el GUI en el thread principal. En general,podemos construir (pero no mostrar) un GUI en cualquierthread, mientras que no hagamos llamadas que se refieran oafecten a los componentes ya realizados.

    1.

    Los componentes en el GUI son realizados por la llamada apack.

    2.

    Inmediatamente despus, los componentes el GUI sonmostrados con la llamada a setVisible (o show).Tcnicamente, la llamada a setVisible es insegura porque loscomponentes ya han sido realizados por la llamada a pack.Sin embargo, como el programa no ha hecho visible el GUItodava, es sumamente contrario a que una llamada a paintocurra antes de que retorne setVisible.

    3.

    El thread principal no ejecuta cdigo GUI despus de llamar asetVisible. Esto significa que el cdigo del GUI se mueve delthread principal al thread de despacho de eventos, y elejemplo es, en la prctica, de thread seguro.

    4.

    Un GUI de un applet puede contruirse y mostrarse en el mtodoinit:

    Los navegadores existentes no dibujan el applet hasta despus deque hayan sido llamados los mtodos init y start. As, construir elGUI en el mtodo init del applet es seguro, siempre que no llamesa show() o setVisible(true) sobre el objeto applet actual.

    Por supuesto, los applets que usan componentes Swing deben serimplementados como subclases de JApplet, y los componentesdeben ser aadidos al panel de contenido del JApplet, en vez dedirectamente al JApplet. Al igual que para cualquier applet, nuncadeberamos realizar inicializacin que consuma mucho tiempo en losmtodos init o start; en su lugar deberamos arrancar un threadque realice las tareas que consuman tiempo.

  • Los siguientes mtodos de JComponent son seguros parallamarlos desde cualquier thread: repaint, revalidate, einvalidate.

    Los mtodos repaint y revalidate envian peticiones para que elthread de despacho de eventos llame a paint y validate,respectivamente. El mtodo invalidate slo marca un componentesy se requiere la validacin de todos sus ancestros.

    Oyentes que pueden ser modificados desde cualquier threadEs siempre seguro llamar a los mtodos addListenerTypeListenery removeListenerTypeListener. Las operaciones deaadir/eliminar no tienen ningn efecto en el despacho de eventos,

    Cmo Ejecutar Cdigo en el Thread de Despacho de EventosLa mayor parte del trabajo de post-inicializacin de un GUI naturalmenteocurre en el thread de despacho de eventos. Una vez que el GUI esvisible, la mayora de los programas son conducidos por eventos comoacciones de botones o clicks del ratn, que siempre son manejados porel thread de despacho de eventos.

    Sin embargo, algunos programas necesitan realizar algn trabajo de GUIno conducido por eventos, despus de que el GUI sea visible. Aqutenemos algunos ejemplos:Programas que deben realizar una operacin de inicializacinlarga antes de poder ser usados:

    Esta clase de programas generalmente debera mostrar algn GUImientras est ocurriendo la inicializacin, y luego actualizar ocambiar el GUI. La inicializacin no debera ocurrir en el thread dedespacho de eventos; si no el repintado y el despacho de eventosse pararan. Sin embargo, despus de la inicializacin elcambio/actualizacin del GUI debera ocurrir en el thread dedespacho de eventos por razones de seguridad con los threads.

    Programas cuyo GUI debe actualizarse como resultado deeventos no-AWT:

    Por ejemplo, supongamos que un programa servidor quiere obtenerpeticiones de otros programas que podran estar ejecutndose endiferentes mquinas. Estas peticiones podran venir en cualquiermomento, y resultan en llamadas a algunos de los mtodos delservidor en algn mtodo thread desconocido. Cmo puede elmtodo actualizar el GUI? Ejecutando el cdigo de actualizacin delGUI en el thread de despacho de eventos.

    La clase SwingUtilities proporciona dos mtodos para ayudarnos aejecutar cdigo en el thread de despacho de eventos:

  • invokeLater: Pide que algn cdigo se ejecute en el thread de despachode eventos. Este mtodo retorna inmediatamente, sin esperar a que elcdigo sea ejecutado.invokeAndWait: Acta igual que invokeLater, excepto en que estemtodo espera a que el cdigo se ejecute. Como regla, deberamos usarinvokeLater en vez de este mtodo.

    Para ms informaicn sobre el uso de invokeLater y invokeAndWait, y otrostrucos para esciribir programas multi-threads, puedes ver Cmo usar Threads.

  • Swing

    Ms Caractersticas y Conceptos SwingEsta leccin ha explicado algunos de los mejores conceptos que necesitarsconocer para construir GUIs Swing -- el rbol de contenidos, el control dedistribucin, el manejo de eventos, el dibujado, y los threads. Adems, hemostocado tpicos relacionados, como los bordes. Esta seccin explica algunascaractersticas Swing que no se han explicado todava:

    Caractersticas que Proporciona JComponentl

    Iconosl

    Actionsl

    Aspecto y Comportamiento Conectablel

    Soporte de Tecnologas Asistivasl

    Modelos de Datos y Estados Separadosl

    Caractersticas que ProporcionaJComponent

    Excepto los contenedores de alto nivel, todos los componentes queempiezan con J descienden de la clase JComponent. Obtienen muchascaractersticas de esta clase, como la posibilidad de tener bordes,tooltips, y Aspecto y Comportamiento configurable. Tambin heredanmuchos mtodos de conveniencia. Para ms detalles, sobre lo queproporciona la clase JComponent puedes ver La clase JComponent

    Iconos

    Muchos componentes Swing -- principalmente los botones y las etiquetas-- pueden mostrar imgenes. Estas imgenes se especifican comoobjetos Icon. Puedes ver Cmo usar Iconos para ver instrucciones y unalista de ejemplos que usa iconos.

    Actions

    Con objetos Action, el API Swing proporciona un soporte especial paracompartir datos y estados entre dos o ms componentes que puedengenerar eventos action. Por ejemplo, si tenemos un botn y un tem demen que realizan la misma funcin, podramos considerar la utilizacinde un objeto Action para coordinar el texto, el icono y el estado de

  • activado de los dos componentes. Para ms detalles, puedes ver Cmousar Actions.

    Aspecto y Comportamiento Conectable

    Un sencillo programa puede tener uno o varios aspectos ycomportamientos. Se puede permitir que el usuario determine el aspectoy comportamiento, o podemos determinarlos programticamente.Puedes ver Cmo seleccionar el Aspecto y Comportamiento para msdetalles.

    Soporte para Tecnologas Asistivas

    Las tecnologas asisticas como los lectores de pantallas pueden usar elAPI de accesibilidad para obtener informacin sobre los componentesSwing. Incluso si no hacemos nada, nuestro programa Swingprobablemente funcionar correctamente con tecnologas asistivas, yaque el API de accesibilidad est construido internamente en loscomponentes Swing. Sin embargo, con un pequeo esfuerzo extra,podemos hacer que nuestro programa funcione todava mejor contecnologas asistivas, lo que podra expandir el mercado de nuestroprograma. Puedes ver Cmo Soportar Tecnologas Asistivas para msdetalles.

    Mdelos de Datos y Estados Separados

    La mayora de los componentes Swing no-contenedores tienen modelos.Por ejemplo, un botn (JButton) tiene un modelo (ButtonModel) quealmacena el estado del botn -- cul es su mnemnico de teclado, si estactivado, seleccionado o pulsado, etc. Algunos componentes tienenmltiples modelos. Por ejemplo, una lista (JList) usa un ListModel quealmacena los contenidos de la lista y un ListSelectionModel que siguela pista de la seleccin actual de la lista.

    Normalmente no necesitamos conocer los modelos que usa uncomponente. Por ejemplo, casi todos los programas que usan botonestratan directamente con el objeto JButton, y no lo hacen en absolutocon el objeto ButtonModel.

    Entonces Por qu existen modelos separados? Porque ofrecen laposibilidad de trabajar con componentes ms eficientemente y paracompartir fcilmente datos y estados entre componentes. Un caso comnes cuando un componente, como una lista o una tabla, contiene muchosdatos. Puede ser mucho ms rpido manejar los datos trabajandodirectamente con un modelo de datos que tener que esperar a cadapeticin de datos al modelo. Podemos usar el modelo por defecto del

  • componente o implementar uno propio.

    Para ms informacin sobre los modelos, puedes visitar las pginasindividuales de cada componente o La Anatoma de un Programa Basadoen Swing que describe algunos modelos personalizados usados por elprograma creado en esa seccin.

  • Swing

    La Anatoma de un Programa Basado en SwingEsta seccin mustra un programa Swing, llamado Converter, que tiene un UI grfico.Puedes ver cmo est implementado este programa mirando el cdigo fuente quepuedes encontrar en los ficheros Converter.java y ConversionPanel.java. Sinembargo, no habla sobre lneas individuales de cdigo. Se concentra en cmo elprograma Converter usa las caractersticas GUI proporcionadas por la plataforma Java.Si te pierdes cuando lees el cdigo fuente de Converter, puedes refrescar tu memoriaen la pgina Una Ruta Rpida por el Cdigo de una Aplicacin Swing.

    Converter es una aplicacin que convierte medidas de distancias entre unidadesmtricas y amricanas. Para ejecutarlo, debes compilar los siguientes ficheros fuente:Converter.java, ConversionPanel.java, ConverterRangeModel.java,FollowerRangeModel.java, DecimalField.java, FormattedDocument.java, yUnit.java. Una vez compilado, puedes ejecutarlo llamando al intrprete con la claseConverter. Si necesitas ayuda para compilar y ejecutar Converter, puedes verCompilar y Ejecutar un Programa Swing.

    Aqu tenemos un grfico comentado del GUI de Converter:

    "JFrame", "JPanel (ConversionPanel)" (x2 apuntado a los paneles que dicen "MetricSystem" and "U.S. System"), "JTextField (DecimalField)" (x2), JSlider (x2), JComboBox(x2)]

    Esta seccin describe las siguientes caractersitcas de Converter:Componentes Swingl

    El rbol de Contenidosl

    Control de Distribucin y Bordesl

    Modelos Separadosl

    Aspecto y Comportamiento Conectablel

  • Manejo de Eventosl

    Componentes Swing

    Cmo se ve en la figura anterior, Converter tiene los siguientescomponentes visibles:

    1 JFramel 2 JPanel personalizadosl 2 JTextField personalizadosl 2 JSlidersl 2 JComboBoxesl

    El JFrame es el contenedor de alto nivel, slo proporciona la ventana de laaplicacin. Todos los otros componentes de la aplicacin estn contenidos enJFrame.

    Excepto el contenedor de alto nivel, todos los componentes visibles deConverter descienden de JComponent. La clase JComponent proporcionamuchas caractersticas, como soporte para bordes y accesibilidad. Los dosJPanel personalizados usan bordes para soportar ttulos (por ejemplo,"Metric System") y para dibujar recuadros a su alrededor.

    El rbol de ContenidosLa 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 contenidosl 2 JPanel personalizados que contienen un campo de texto y undeslizador

    l

    Estos tres componentes existen para afectar a la distribucin. Hacen estosimplificando la distribucin o aadiendo bordes "vacos" que aaden espaciopara la distribucin. El agrupamiento de componentes -- tanto encontenedores visibles como en invisibles -- tambien proporciona ayuda paralas tecnologas asistivas. Por ejemplo, agrupar un campo de texto y undeslizador en su propio contenedor le ofrece a las tecnologas asisitivas lainformacin de que el campo de texto y el deslizador estn estrechamenterelacionados.

    Bajo el panel de contenidos hay dos ConversionPanel. Uno de ellos contienelos componentes relacionados con las ditancias mtricas, y el otro hace lomismo con las distancias americanas.

    Cada ConversionPanel contiene 3 componentes visibles: un campo detexto, un deslizador y un combo box. El campo de texto y el deslizador estnagrupados en un JPanel, principalmente para simplificar la distribucin.

    Control de Distribucin y Bordes

    La siguiente figura muesta una versin coloreada de Converter. En estaversin, cada contenedor tiene un color de fondo diferente, para que puedesver fcilmente las partes de los contenedores que no estn cubiertas porotros componentes. Observa que todos los contenedores son opacos; de otromodo, el color del fondo podra no ser pintado automticamente.

    Converter create cinco objetos controladores de distribucin -- un ejemplarde GridLayout, y cuatro de BoxLayout.

    El primer JPanel (el panel de contenidos personalizado) usa GridLayoutpara hacer que los ConversionPanels tengan exactamente el mismotamao. El cdigo configura el GridLayout para que ponga losConversionPanels en una sla columna (dos filas), con cinco pixels entreellos. 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 compuesto. El exterior es un bordecon ttulo y el interior es un borde vaco. El borde titulado dibuja unarecuadro especfico del aspecto y comportamiento alrededor delConversionPanel y sita dentro el ttulo del panel. El borde vaco ponealgn espacio ms entre el ConversionPanel y sus contenidos.

    Cada ConversionPanel usa un controlador BoxLayout para situar suscontenidos, que son un JPanel y un JComboBox, en un fila. Seleccionandoel alineamineto Y tanto del panel como del combo box, el programa alinea laparte superior del panel con la perte superior del combo box.

    El JPanel que agrupa al campo de texto y al deslizador est implementadocon una subclase sin nombre de JPanel. Esta subclase sobreescribe losmtodos getMinimumSize, getPreferredSize, y getMaximumSize paraque devuelvan el mismo valor: 150 pixels de ancho y la altura preferida. Ases como se asegura de que los dos grupos de texto-deslizador tienen lamisma anchura, incluso aunque estn controlados por diferentescontroladores de distribucin. Necesitamos crear una subclase de JPanel, envez de llamar a los mtodos setXxxxSize, porque la altura preferida de loscomponentes se determina en tiempo de ejecucin, por el controlador dedistribucin.

    El JPanel que agrupa el campo de texto y el deslizador usa un controladorBoxLayout de arriba-a-abajo para que el campo de texto se situe encima deldeslizador. El JPanel tambin tiene un borde vaco que aade un poco deespacio a su derecha entre l y el combo box.

    Modelos Separados

    Este programa usa tres modelos personalizados. El primero es un modelo dedatos para el campo de texto. Los modelos de datos de texto son conocidoscomo modelos de documento. El modelo de documento analiza el valor que elusuario introduce en el campo de texto. Tambin formatea el nmero paraque parezca bonito. Hemos tomado prestado este modelo de documento, sincambiarlo, 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 aplicacin est en un slo lugar --en el modelo del deslizador superior. El modelo del deslizador superior es unejemplar de una clase personalizada llamada ConverterRangeModel. Eldeslizador inferior usa una segunda clase personalizada,FollowerRangeModel, que reenva todas las peticiones para obtener unconjunto de datos al modelo del deslizados superior.

    Todos los modelos de datos de deslizador deben implementar el interfaceBoundedRangeModel. Aprenderemos esto en la seccin del API de Cmousar Sliders. La documentacin del BoundedRangeModel que tiene un clasede implementacin llamada DefaultBoundedRangeModel. La

  • documentacin del API de DefaultBoundedRangeModel muestra que esuna implementacin de cdigo general de BoundedRangeModel.

    No usamos DefaultBoundedRangeModel porque almacena los datos comoenteros, y necesitamos almacenar datos en coma flotante. As,implementamos ConverterRangeModel como una subclase de Object,comparlo con el cdigo fuente de DefaultBoundedRangeModel(distribuido con las versiones JFC 1.1y JDK 1.2), para asegurarnos queimplementamos el modelo correctamente. ImplementamosFollowerRangeModel como una subclase de ConverterRangeModel.

    Aspecto y Comportamiento Conectable

    El programa Converter se configura a s mismo para usar el Aspecto yComportamiento Java. Cambiando el valor de su variable LOOKANDFEEL,podemos hacer que use un Aspecto y Comportamiento diferente. Tres de susencarnaciones estn dibujadas en Qu son el JFC y Swing?.

    Manejo de EventosEl programa Converter crea varios manejadores de eventos:Oyentes de Action

    Cada combo box tiene un oyente de action. Siempre que el usuarioselecciona una nueva unidad de medida, el oyente de action notifica elmodelo de deslizador relevante y resetea los valores mximos de los dosdeslizadores.

    Cada campo de texto tiene un oyente de action que es notificado cuandoel usuario pulsa la tecla Return para indicar que el tecleado haterminado. Este oyente de action actualiza el correspondiente modelo dedeslizador para reflejar el valor del campo de texto.

    Oyente de ChangeCada modelo de deslizador tiene un oyente de change personalizado.Siempre que el valor de un deslizador cambia, este oyente actualiza elcorrespondiente campo de texto. No hemos tenido que registrar losdeslizadores como oyentes de dus propios modelos, ya que lo haceSwing automticamente. En otras palabras, siempre que el programaselecciona un valor en un modelo de deslizador, ste se actualizaautomticamente para reflejar el nuevo estado del modelo.

    El modelo para el deslizador inferior aade un oyente de cambio almodelo del deslizador superior, Este oyente dispara un evento decambio al oyente de cambio del modelo del deslizador inferior. El efectoes que cuando cambia el valor del deslizador superior, se actualizan losvalores del deslizador y del campo de texto inferior. No es necesarionotificar al deslizador superior los cambios en el deslizador inferior, yaque el modelo del deslizador inferior reenvia las peticiones de seleccinde datos al modelo del deslizador superior.

  • Oyentes de WindowUn oyente de window en el frame hace que se salga de la aplicacincuando se cierre la ventana.

    Casi todos los oyentes del programa Converter estn implementados enclases internas annimas --clases sin nombre definidas dentro de otrasclases. Aunque las clases internas podran parecer difciles de leer, alprincipio, realmente hacen el cdigo mucho ms fcil de comprender, una vezque las has utilizado. Manteniendo una implementacin de un menejador deeventos cerca de donde se registra el manejador de eventos, las clasesinternas te ayudan y ayudan a los que te siguen a encontrar fcilmente laimplementacin completa del manejador de eventos. Puedes ver UsarAdaptadores y Clases Internas para Manejar Eventos para ms informacin.

  • Swing

    Usar Componentes SwingEsta leccin describe cada componente Swing...

    Reglas Generales para el Uso de Componentes Swing

    Empieza aqu para aprender las reglas generales del uso decomponentes.

    La clase JComponent

    Excepto los contenedores de alto nivel, los componentes Swingdescienden de la clase JComponent. Esta seccin te presenta lascaractersticas proporcionadas por la clase JComponent, y te ofrecetrucos para aprovecharte de dichas caractersticas.

    Un ndice Visual de Componentes SwingAqu hay un grfico de cada componente Swing, desde loscontenenedores de alto nivel y contenedores intermedios hasta loscomponentes regulares. Para ir a la pgina que describe un componenteparticular slo pulsa sobre el grfico.

    Crear C