0 calificaciones0% encontró este documento útil (0 votos)
105 vistas
Curso - Java
Este documento presenta un curso sobre Java Standard Edition (J2SE). El curso cubre 7 temas principales sobre los fundamentos de Java como clases, objetos, herencia, excepciones, entrada/salida, acceso a datos y interfaces gráficas. El curso fue elaborado por 4 profesores y se imparte en el Instituto Universitario de Tecnología "Dr. Federico Rivero Palacio" en Caracas, Venezuela.
Descarga como PDF, TXT o lee en línea desde Scribd
0 calificaciones0% encontró este documento útil (0 votos)
105 vistas
Curso - Java
Este documento presenta un curso sobre Java Standard Edition (J2SE). El curso cubre 7 temas principales sobre los fundamentos de Java como clases, objetos, herencia, excepciones, entrada/salida, acceso a datos y interfaces gráficas. El curso fue elaborado por 4 profesores y se imparte en el Instituto Universitario de Tecnología "Dr. Federico Rivero Palacio" en Caracas, Venezuela.
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 140
Curso de J ava Standard Edition J 2SE 1
Dr. Federico Rivero Palacio
INSTITUTO UNIVERSITARIO DE TECNOLOGA DR. FEDERICO RIVERO PALACIO DEPARTAMENTO DE I NFORMTI CA
CURSO
J J a a v v a a S ST TA AN ND DA AR RD D E ED DI IT TI IO ON N J J 2 2 S S E E
Caracas, 2006
Curso de J ava Standard Edition J 2SE 2 Java Standad Edition J2SE
Elaborado por: - Prof. Castaeda, Marbella - Prof. Hidalgo, Erika - Prof. Ramos, Darwin - Prof. Rivas, Ronel
Docentes del Departamento de Informtica del Instituto Universitario de Tecnologa Dr. Federico Rivero Palacio. Caracas, 2005
Curso de J ava Standard Edition J 2SE 3
C CO ON NT TE EN NI ID DO O D DE EL L C CU UR RS SO O
Tema I. Fundamentos de Java Tema II. Clases, objetos y paquetes Tema III. Herencia, clases abstractas e interfaces Tema IV. Excepciones Tema V. Entrada/Salida Tema VI. Tecnologas de acceso a datos Tema VII. Interfaces Grficas Apndice 1. Herramientas y Utilidades de Desarrollo
Curso de J ava Standard Edition J 2SE 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . TEMA I : Fundament os de Java
OBJ ETI VOS: Describir la Plataforma J ava y las caractersticas del lenguaje de programacin J ava. Realizar la declaracin e inicializacin de variables simples u objetos en J ava. Describir el funcionamiento de los operadores y estructuras de control en J ava.
CONTENIDO: Orgenes del Lenguaje El lenguaje de programacin J ava Caractersticas del Lenguaje J ava vs C/C++ La plataforma J ava Los tipos de datos de J ava Identificadores Operadores de J ava Estructuras de Control
4 Curso de J ava Standard Edition J 2SE 5 1 1. . O OR R G GE EN NE ES S D DE EL L L LE EN NG GU UA AJ J E E
La creacin y desarrollo de los lenguajes de programacin se rige por dos factores bsicos: el perfeccionamiento del arte de programar y agregar cambios al mbito de la computacin.
El lenguaje de programacin J ava no es una excepcin, ya que se genera partiendo del extenso legado de C y C++, y agrega refinamiento y caractersticas que reflejan el estado actual de la programacin. Este lenguaje fue concebido por J ames Gosling, Patrick Naughton, Chris Warth, Ed Frank y Mike Sheridan para Sun Microsystems, en 1991. Se le llam inicialmente Oak pero despus en 1995, se renombr como J ava.
La razn ms importante para la creacin de este lenguaje era la necesidad de crear un lenguaje independiente de la plataforma y que se pudiera usar para crear software incorporable en dispositivos electrnicos, como televisores, hornos microondas, neveras, etc. En la bsqueda de una solucin, se trabaj en un lenguaje porttil de plataforma cruzada que generase cdigos que se pudiesen ejecutar en distintos CPU para diversos ambientes.
Como se puede observar la motivacin inicial de J ava no era la Internet, pero a pesar de esto, el mismo est fuertemente ligado a la red, ya que mientras se elaboraban los detalles de J ava, apareci un factor que jugara un papel crucial en el futuro de este lenguaje: La World Wide Web. El equipo de desarrolladores de J ava observ que este nuevo entorno presentaba los mismos requerimientos que ellos perseguan cubrir con J ava: programas de cdigo pequeo, confiable, seguro e independiente de la plataforma. Si el mundo Web no hubiese tomado forma a la vez que se estaba implementado J ava, J ava podra haber sido un lenguaje til pero dedicado a la programacin de dispositivos electrnicos para el consumo.
2 2. . E EL L L LE EN NG GU UA AJ J E E D DE E P PR RO OG GR RA AM MA AC CI I N N J J A AV VA A
J ava es en esencia un lenguaje de programacin orientado a objetos. Sin embargo, J ava no es solo un lenguaje de programacin, sino que tambin define una plataforma en la que las aplicaciones pueden ser desarrolladas y ejecutadas.
La mayora de las caractersticas bsicas de J ava provienen de C y C++. Esto se hizo intencionalmente, a fin de hacer atractivo al lenguaje para el gran nmero de programadores de C y C++. J ava provee un ambiente de programacin poderoso y lgicamente consistente, que contiene los mejores elementos del pasado y le agrega nuevas caractersticas necesarias para ambientes en lnea. Uno de los aspectos centrales de la filosofa del diseo en C, C++ y J ava, es que el programador ejerce el control; excepto por las restricciones que impone el ambiente Internet.
El diseo de J ava es tal que, es multiplataforma en cdigo fuente y la forma binaria compilada. Esto es posible, ya que J ava compila su cdigo fuente en un bytecode intermedio e independiente de la plataforma. Este bytecode es interpretado usando un intrprete especfico de la plataforma, es decir la Mquina Virtual de J ava (J ava Virtual Machine J VM) en tiempo de ejecucin del programa.
El lenguaje de programacin J ava permite desarrollar bsicamente dos tipos de programas: aplicaciones y applets. Una aplicacin es un programa autnomo que puede ejecutarse en una computadora, bajo el sistema operativo de esa computadora. Un applet es un pequeo programa J ava que puede se embebido en una pgina HTML. Aunque, se pueden desarrollar programas de consola, esta no es su orientacin.
Curso de J ava Standard Edition J 2SE 6 3 3. . C CA AR RA AC CT TE ER R S ST TI I C CA AS S D DE EL L L LE EN NG GU UA AJ J E E
A continuacin se presentan las principales caractersticas que han convertido a J ava en un lenguaje sumamente popular.
- Simple: J ava es bastante fcil de aprender, dado que tiene la sintaxis de C/C++. Es muy fcil que un programador experimentado la domine, ya que solo se necesita una comprensin apropiada de los conceptos de programacin orientada a objetos. Adems de su similitud con C/C++, J ava tiene otra caracterstica que lo hace simple, y es que J ava hace un esfuerzo por no tener caractersticas sorprendentes. En J ava hay un nmero reducido de formas claras para abordar una tarea dada.
- Orientado a Objetos: J ava no se cre para ser compatible en cdigo fuente con otros lenguajes. Esto otorg a los desarrolladores de J ava la libertad de disear un lenguaje partiendo de cero. El resultado de esto fue una aproximacin limpia, til y pragmtica a los objetos, en un lenguaje puramente orientado a objetos. El modelo de objetos J ava es simple y fcil de ampliar, mientras los tipos simples permanecen como no objetos de alto rendimiento.
- Portable: J ava, usa un conjunto optimizado de instrucciones, diseado para ser ejecutado por una Mquina Virtual, que es emulada por el sistema en tiempo de ejecucin de J ava. Este conjunto de instrucciones se conoce como BYTECODE, que representa la salida de un compilador de J ava. Esto significa que el sistema de tiempo de ejecucin de J ava es un Intrprete de BYTECODE. Debido a esto, slo el sistema de tiempo de ejecucin de J ava tiene que ser implementado para cada plataforma, y una vez que este paquete existe para un sistema, cualquier programa J ava puede correr en l.
- Interpretado y de Alto Rendimiento: J ava fue diseado para ser un lenguaje interpretado, a fin de solucionar los aspectos relacionados con la descarga a travs de la Internet. Ejecutar programas de J ava en diferentes entornos es una tarea simple debido a que estos programas (BYTECODE) son Interpretados por una Mquina Virtual J ava. A pesar de que el BYTECODE de J ava es interpretado, est diseado de tal forma que fcil de traducir a cdigo mquina nativo para alto rendimiento.
- Seguro: Una de las principales caractersticas de J ava, es que la ejecucin de un programa J ava est limitada al entorno de ejecucin J ava, por lo que no se proporciona acceso a partes restringidas del computador. Esto lo garantiza la caracterstica de ser un lenguaje interpretado, ya que el sistema de tiempo de ejecucin puede contener un programa y evitar que produzca efectos colaterales fuera del sistema, obedeciendo al hecho que la Mquina Virtual controla la ejecucin de cada programa J ava.
- Robusto: Siendo un lenguaje estrictamente tipificado, J ava verifica el cdigo del programador en tiempo de compilacin, y adems en tiempo de ejecucin. J ava da una alta prioridad a la capacidad de generar programas confiables, a fin de enfrentar las extraordinarias demandas provenientes del entorno multiplataforma de Internet.
- Multihilo: J ava fue diseado para cumplir el requisito del mundo real de crear programas env red interactivos. Para conseguir esto, J ava proporciona la programacin multihilo, que permite escribir programas que realicen varias cosas a la vez. El intrprete J ava permite la sincronizacin de multiprocesos, que permite la construccin de programas interactivos, que se ejecuten eficientemente. Curso de J ava Standard Edition J 2SE 7 - Distribuido: J ava fue diseado para el entorno distribuido de Internet, por lo que trabaja con el protocolo TCP/IP. J ava incorpora capacidades para el envo de mensajes que haca posible que los objetos en computadoras separadas ejecutaran procedimientos en forma remota. Esta caracterstica le proporciona una abstraccin nica para la programacin Cliente-Servidor.
- Dinmico: En J ava el cdigo puede ser enlazado dinmicamente en forma segura. Esto es posible por las grandes cantidades de data en tiempo de ejecucin que procesan los programas de J ava, que es usada para la verificacin y resolucin de accesos a objetos en tiempo de ejecucin. Esta caracterstica es importante para la robustez del entorno de applets, y hace posible actualizar dinmicamente pequeos bits del BYTECODE en un sistema en plena ejecucin.
4 4. . J J A AV VA A v vs s C C/ / C C+ ++ +
Comparado con C++, J ava es considerado un lenguaje puramente orientado a objetos, debido a que los programas J ava requieren necesariamente el uso de objetos y no como en C++, en donde se pueden escribir programas hbridos. En J ava no existen funciones ni variables globales; todas las interfaces con data de objetos deben ser definidas en las bibliotecas de clases.
J ava es robusto considerando sus tcnicas de administracin de memoria, ya que administra la asignacin y liberacin de memoria de forma automtica. A diferencia de C/C++ en donde el programador debe asignar y liberar manualmente la memoria dinmica.
Los desarrolladores de J ava aadieron la caracterstica de la recoleccin automtica de basura. En C/C++ una fuente complejidad en muchas aplicaciones es la administracin de almacenamiento, que significa asignacin y liberacin de memoria. La recoleccin de basura que efectivamente significa liberacin peridica de memoria que no est siendo referenciada, asegura que J ava no solo facilita la programacin, sino ayuda a reducir drsticamente los errores en tiempo de ejecucin.
J ava omite muchas caractersticas de difcil comprensin de C++. Estas caractersticas omitidas consisten principalmente en la sobrecarga de operadores, la herencia mltiple y las conversiones automticas extensivas.
La mayor diferencia entre J ava y C/C++, es la caracterstica de J ava de ser Multiplataforma. En C/C++ es imposible ejecutar el mismo archivo objeto en diversas plataformas. El diseo de J ava es tal que es multiplataforma tanto el cdigo fuente como el cdigo binario.
5 5. . L LA A P PL LA AT TA AF FO OR RM MA A J J A AV VA A
Una plataforma se define como el entorno de hardware y/o software sobre el cual se ejecutan los programas. La plataforma J ava es una plataforma de slo software, que se ejecuta sobre cualquier otra plataforma basada en hardware. J ava posee tres grandes plataformas: la J 2SE (J ava 2 Platform Standard Edition), la J 2EE (J ava 2 Platform Enterprise Edition) y la J 2ME (J ava 2 Platform Micro Edition).
La J ava 2 Platform Standard Edition J 2SE (Plataforma J ava 2 Edicin Estndar) es un conjunto de especificaciones que describen el ambiente de desarrollo de aplicaciones J ava. Est ser la plataforma a estudiar en este curso.
Curso de J ava Standard Edition J 2SE 8 En la siguiente grfica se describe la plataforma J 2SE:
Grfico 1. Plataforma J ava 2 Edicin Estndar
El J 2SDK (Equipo Estndar de Desarrollo - SDK), es un ambiente de desarrollo para construir aplicaciones, applets, y componentes usando el lenguaje de programacin J ava. El J ava 2 SDK, incluye un conjunto de herramientas y utilidades de desarrollo as como tambin el ambiente de ejecucin J ava.
5 5. .1 1. . H HE ER RR RA AM MI I E EN NT TA AS S Y Y U UT TI I L LI I D DA AD DE ES S D DE E D DE ES SA AR RR RO OL LL LO O
Es un conjunto de herramientas para desarrollar y probar programas escritos en el lenguaje J ava y ejecutarlos en la plataforma J ava. Estn diseadas para ser usadas desde la lnea de comandos. Generalmente se agrupan en las siguientes categoras:
- Bsicas: herramientas fundamentales del SDK que se usan para crear y construir aplicaciones. Algunas de las herramientas bsicas que usaremos en este curso se describen a continuacin:
SOLARIS LINUX WINDOWS OTRO
J AVA RUNTI ME ENVI RONMENT - J RE A AP PI I Ncleo Integracin Interfaces de Usuario T TE EC CN NO OL LO OG G A AS S D DE E D DE ES SP PL LI I E EG GU UE E J ava Web Start J ava Plug-in MQUI NA VI RTUAL DE J AVA J ava HotSpot Client VM J ava HotSpot Server VM HERRAMI ENTAS/ UTI LI DADES DE DESARROLLO Bsicas Plug-in RMI Seguridad IDL y RMI-IIOP Internacionalizacin J J 2 2S SD DK K Componentes
Componentes a utilizar
Plataformas Curso de J ava Standard Edition J 2SE 9 H HE ER RR RA AM MI I E EN NT TA A C CO OM MA AN ND DO O F FU UN NC CI I N N Compilador (javac) javac myProg.java Genera el cdigo binario de uno o varios programas J ava. Depurador (jdb) jdb myProg Permite verificar la semntica de la aplicacin. Lanzador de aplicacin (java) java myProg Invoca a la Mquina Virtual de J ava para que ejecute la aplicacin. Documentador (javadoc) javadoc myProg.java Evala la declaracin y los comentarios de un conjunto de programas y produce un conjunto de pginas HTML que describen las clases, interfaces, constructores, atributos y mtodos.
- RMI : herramientas que te permiten crear aplicaciones que interactan entre redes, tales como la Web.
- Internacionalizacin: herramientas que te permiten crear aplicaciones que puedan ser adaptadas a cualquier idioma y regin. El estudio de estas herramientas esta fuera del alcance de este curso.
- Seguridad: herramientas que te permiten establecer polticas de seguridad en tu sistema operativo y crear aplicaciones que puedan trabajar dentro del alcance de estas polticas y permitir, de forma segura, el acceso a tu aplicacin desde sitios remotos. El estudio de estas herramientas esta fuera del alcance de este curso.
- I DL y RMI -I IOP: herramientas utilizadas para crear aplicaciones que usen el estndar OMG IDL y CORBA/IIOP.
- J ava Plug-in: utilidades para usar en conjunto con el J ava Plug-in.
5 5. .2 2. . E EL L A AM MB BI I E EN NT TE E E EN N T TI I E EM MP PO O D DE E E EJ J E EC CU UC CI I N N D DE E J J A AV VA A J J R RE E
El J ava 2 Runtime Environment (Ambiente de Ejecucin de J ava - J RE), permite ejecutar aplicaciones escritas en J ava. Contiene la Mquina Virtual de J ava, las clases comprendidas en la API de J ava y las tecnologas de despliegue.
- La Mquina Virtual de J ava - J VM: La J ava Virtual Machine es una computadora abstracta implementada sobre una plataforma particular que interpreta el cdigo binario o BYTECODE y lo ejecuta en esa plataforma, limitando el acceso a otras partes del sistema. La J VM (J VM) se compone de las siguientes partes: o J ava HotSpot Client VM: diseado para ejecutar las aplicaciones en un ambiente de Cliente, reduciendo el tiempo de carga de una aplicacin y la paginacin de memoria. o J ava HotSpot Server VM: diseado para obtener las mximas velocidades de ejecucin en un ambiente de Servidor.
- La Interfaz de Programacin de Aplicaciones API: La Interfaz de Programacin de Aplicaciones J ava (API), es una conjunto de partes de software (clases e interfaces) organizada, coherente y consistente en paquetes. Estas clases, suelen agruparse de acuerdo al servicio que prestan: Curso de J ava Standard Edition J 2SE 10 o Ncleo (proveen el conjunto de paquetes esenciales para crear aplicaciones J ava, tales como: fundamentos del lenguaje, utilidades del lenguaje, procesos de E/S, comunicacin de redes, preferencias, colecciones, J NI, seguridad, XML, cifrado y componentes). o Integracin (proveen el conjunto de paquetes que te permiten crear aplicaciones que puedan invocar mtodos/procedimientos remotos, comunicarse con bases de datos y crear servicios de nombres y directorios). o Interfaces de Usuario: proveen el conjunto de paquetes para la creacin de aplicaciones con amigables interfaces graficas de usuario (AWT y Swing).
- Tecnologas de despliegue: estn representadas por la J ava Web Start y el J ava Plugin, que son tecnologas que permiten ejecutar aplicaciones J ava desde Internet.
6 6. . L LO OS S T TI I P PO OS S D DE E D DA AT TO OS S D DE E J J A AV VA A
En la base de cualquier lenguaje de programacin estn sus tipos de datos y operadores, y java no es la excepcin. Los tipos de datos son importantes en J ava, porque este es un lenguaje fuertemente tipeado. Esto significa que todas las expresiones tienen algn tipo cuya compatibilidad es verificada por el compilador.
J ava contiene dos categoras generales de tipos de datos incorporados: el orientado a objetos y el no orientado a objetos. Los tipos de J ava orientado a objetos son definidos por clases y los no orientados a objetos, son los que nosotros llamamos tipos de datos simples.
- Tipos de datos simples: Estos tipos de datos son tambin llamado elementales o primitivos y a partir de stos, pueden ser construidos otros tipos de datos. J ava especifica un rango estricto y un comportamiento para cada tipo simple, que deben soportar las implementaciones de la Mquina Virtual de J ava. Por ejemplo, una variable de tipo int es igual en todos los entornos de ejecucin. Esto permite que los programas sean transportables. Los tipos simples permitidos en J ava son:
TI PO SIGNI FICADO # BITS RANGO VALOR INICIAL boolean Representa valores true/false 16 true / false false char Carcter (Unicode) 16 0 a 65.536 \u0000 float Real de simple precisin 32 1,7e-308 a 1,7e+308 0.0f double Real de doble precisin 64 3,4e-38 a 3,4e+38 0.0 byte Enteros de 8 bits 8 -128 a 127 0 short Entero corto 16 -32.768 a 32.767 0 int Entero 32 -2.147.483.648 a 2.147.483.647 0 long Entero largo 64 -9.223.372.036.854.775.808 9.223.372.036.854.775.807 0L
o Conversiones implcitas de tipos: En la programacin es comn asignar un tipo de variable a otro. Por ejemplo se pudiese querer asignar un valor int a una variable float. int i; float f; i = 10; f = i;
Cuando se mezclan tipos compatibles en una asignacin, el valor del lado derecho es automticamente convertido al tipo del lado izquierdo. De modo que en el ejemplo anterior, el valor de i es convertido en float y luego asignado a f. Sin Curso de J ava Standard Edition J 2SE 11 embargo, no todos los tipos son compatibles, por lo que no todas las conversiones son compatibles. Por ejemplo, boolean e int no son compatibles.
En resumen, cuando un tipo de datos se destina a otro tipo de variables, se realiza una conversin de tipo automtica, si se cumplen dos condiciones: 1. Los dos tipos son compatibles. 2. El tipo destino es ms grande que el tipo de origen.
Cuando se cumplen estas dos condiciones, tiene lugar una conversin implcita. Por ejemplo, el tipo int siempre es suficientemente grande como para almacenar todos los valores byte. Un long a double es una conversin implcita que es automticamente desarrollada. No hay conversin implcita de los tipos numricos a char o boolean. Tampoco char y boolean son compatibles entre si. Sin embargo, un literal entero puede ser asignado a char.
BYTE SHORT INT LONG FLOAT DOUBLE 1byte 2bytes 4bytes 8bytes 4bytes 8bytes
- Tipos de datos orientados a objetos: Estos tipos de datos son clases construidas a partir de los tipos de datos simples. J ava especifica un conjunto de clases que permiten realizar programas J ava 100% orientados a objetos, y esto es lo que hace a los programas transportables. Los tipos orientados a objetos proporcionados en J ava, se encuentran almacenados en paquete java.lang, y stos son:
o Object: Object es la superclase de todas las dems clases, representa la clase ms arriba en la jerarqua de todos los objetos en J ava. Algunos de los mtodos que define la clase Object y que estn disponibles para todos los objetos son:
M M T TO OD DO O D DE ES SC CR RI I P PC CI I N N Object Clone() Throws Throwable Crea un nuevo objeto idntico al objeto que llama al mtodo. boolean equals(Object objeto) Devuelve true si el objeto que llama mtodo es equivalente a objeto. void finalize () throws Throwable Mtodo finalize() por omisin. El mtodo finalize es semejante a los destructores. final Class getClass() Obtiene un objeto Class que describe el objeto que declara el mtodo. String toString() Devuelve una cadena que describe al objeto.
o String: En muchos lenguajes de programacin, una cadena es un arreglo de caracteres. Este no es el caso de J ava. En J ava, las cadenas son objetos. Cuando se crea una cadena literal, realmente, se est creando un objeto String. Por ejemplo, el literal Hola, es elaborado automticamente, por J ava, dentro de un objeto String. Las cadenas simplemente se construyen como cualquier otro objeto, utilizando el operador new y llamando al constructor de la clase; en este caso la llamada se hace al constructor de String, el cual tiene dos formas: Sin parmetro y con un objeto String, como parmetro, para inicializar la cadena. Ejemplos de construccin de cadenas: String cad = new String (); String cad1 = new String (Hola); String cad2 = new String (cad1); String cad3 = Hola Mundo; Curso de J ava Standard Edition J 2SE 12
Algunos de los mtodos que define la clase String se presentan a continuacin:
M M T TO OD DO O D DE ES SC CR RI I P PC CI I N N boolean equals (String str) Devuelve true si la cadena invocada contiene la misma secuencia de caracteres que str. int length () Obtiene y retorna la longitud de la cadena char charAt (int index) Obtiene el carcter que se encuentra, dentro de la cadena, en la posicin index. Las cadenas se comienzan a numerar en 0. int compareTo (String str) Retorna un valor menor que cero si la cadena invocada es menor que str, y un valor mayor que cero si la cadena es mayor que str y cero si las cadenas son iguales. int indexOf (String str) Busca en la cadena invocada la subcadena especificada por str. Regresa el ndice de la primera correspondencia -1 en caso de falla. int lastIndexOf (String str) Busca en la cadena invocada la subcadena especificada por str. Regresa el ndice de la ltima correspondencia -1 en caso de falla.
o Character: representa la abstraccin orientada a objeto, del tipo de dato simple char. Algunos de los mtodos que define la clase Carcter se presentan a continuacin:
M M T TO OD DO O D DE ES SC CR RI I P PC CI I N N Static Boolean IsDefined(char Ch) Devuelve true si Ch est definido por Unicode, en caso contrario, devuelve false. Static Boolean IsDigit(char Ch) Devuelve true si Ch es un dgito, devuelve false. Static Boolean IsLetter(char Ch) Devuelve True si Ch es una letra, en caso contrario devuelve False. Static Boolean IsLetterOrDigit(char Ch) Devuelve True si Ch es una letra o un dgito, en caso contrario devuelve False. Static Boolean IsLowerCase(char Ch) Devuelve True si Ch es una letra minscula, en caso contrario devuelve False. Static Boolean IsSpace(char Ch) Devuelve True si Ch es un espacio en blanco, en caso contrario devuelve False. Static Boolean IsTitleCase(char Ch) Devuelve True si Ch es carcter de ttulo Unicode, en caso contrario devuelve False. Static Boolean IsUpperCase(char Ch) Devuelve True si Ch es una letra mayscula, en caso contrario devuelve False. Static char toLowerCase (char Ch) Devuelve la letra minscula equivalente a Ch Static char toTitleCase (char Ch) Devuelve la letra de ttulo equivalente a Ch Static char toUpperCase (char Ch) Devuelve la letra mayscula equivalente a Ch
Curso de J ava Standard Edition J 2SE 13 o Number: clase abstracta que define una superclase que es implementada por las clases que envuelven los tipos numricos int, long, float y double. Number tiene mtodos abstractos que devuelven el valor del objeto en cada uno de los tipos simple, es decir, doubleValue() devuelve el valor como un double. floatValue () devuelve el valor como un float y as sucesivamente. A continuacin se muestran estos mtodos:
M M T TO OD DO O D DE ES SC CR RI I P PC CI I N N public abstract int intValue() Devuelve el valor especificado como un int. Este mtodo puede involucrar redondeo. public abstract long longValue() Devuelve el valor especificado como un long. Este mtodo puede involucrar redondeo. public abstract float floatValue() Devuelve el valor especificado como un float. Este mtodo puede involucrar redondeo. public abstract double doubleValue() Devuelve el valor especificado como un double. Este mtodo puede involucrar redondeo. public short shortValue() Devuelve el valor especificado como un short. Este mtodo puede involucrar redondeo.
o Integer: esta clase es una envoltura para los tipos de datos simples int, short y byte. Los constructores para la clase Integer son:
Esta clase define las constantes MIN_VALUE y MAX_VALUE, que establecen el rango de valores que puede representar un objeto de esta clase. A continuacin se muestran estos mtodos:
M M T TO OD DO O D DE ES SC CR RI I P PC CI I N N boolean equals (Object objInteger) Devuelve true si el objeto Integer que lo llama es equivalente a objInteger static int parseInt (String) Devuelve un valor entero equivalente al nmero contenido en la cadena str. static int parseInt (String, int) Devuelve un valor entero equivalente al nmero contenido en la cadena str usando la base. static Integer valueOf (String) Devuelve un Integer que contiene el valor especificado por la cadena str. static Integer valueOf (String, int) Devuelve un Integer que contiene el valor especificado por la cadena str usando la base indicada. Todos estos mtodos arrojan la excepcin NumberFormatException
o Long: esta clase es una envoltura para los tipos de datos simples int, short y byte. Los constructores para la clase Long son: Long (int) Long (String) throws NumberFormatException
Esta clase define las constantes MIN_VALUE y MAX_VALUE, que establecen el rango de valores que puede representar un objeto de esta clase. A continuacin se muestran estos mtodos: Curso de J ava Standard Edition J 2SE 14
M M T TO OD DO O D DE ES SC CR RI I P PC CI I N N boolean equals (Object) Devuelve true si el objeto Long que lo llama es equivalente a objLong static long parseLong (String) Devuelve un valor long equivalente al nmero contenido en la cadena str. static long parseLong (String, int) Devuelve un valor long equivalente al nmero contenido en la cadena str usando la base indicada. static Long valueOf (String) Devuelve un Long que contiene el valor especificado por la cadena str. static Long valueOf (String, int) Devuelve un Long que contiene el valor especificado por el String usando la base int. Todos estos mtodos arrojan la excepcin NumberFormatException
o Double: esta clase es una envoltura para el tipo de dato simple double. Los constructores para la clase Double son:
Esta clase define las constantes MIN_VALUE y MAX_VALUE, que establecen el rango de valores que puede representar un objeto de esta clase. Igualmente define las constantes NaN (No es nmero), POSITIVE_INFINITY (Infinito Positivo) y NEGATIVE_INFINITY(Infinito Negativo). A continuacin se muestran estos mtodos:
M M T TO OD DO O D DE ES SC CR RI I P PC CI I N N boolean equals (Object objDouble) Devuelve true si el objeto Double que lo llama es equivalente a objDouble boolean isInfinite () Devuelve true si el objeto contiene un valor infinito. En caso contrario, devuelve false. static boolean isInfinite(float num) Devuelve true si num contiene un valor infinito. En caso contrario, devuelve false. boolean isNaN () Devuelve true si el objeto contiene un valor que no es nmero. En caso contrario, devuelve false. static boolean isNaN (float num) Devuelve true si num contiene un valor que no es un nmero. En caso contrario, devuelve false. static Double valueOf (String str) Devuelve un objeto Double que contiene el valor especificado por la cadena String static double parseDouble(String str)
Devuelve un valor double equivalente al nmero contenido en la cadena str. Todos estos mtodos arrojan la excepcin NumberFormatException
o Float: esta clase es una envoltura para el tipo de dato simple float. Los constructores para la clase Float son:
Curso de J ava Standard Edition J 2SE 15 Float (int) Float (double) Float (String) throws NumberFormatException
Esta clase define las constantes MIN_VALUE y MAX_VALUE, que establecen el rango de valores que puede representar un objeto de esta clase. Igualmente define las constantes NaN (No es nmero), POSITIVE_INFINITY (Infinito Positivo) y NEGATIVE_INFINITY(Infinito Negativo). A continuacin se muestran estos mtodos:
M M T TO OD DO O D DE ES SC CR RI I P PC CI I N N boolean equals (Object objFloat) Devuelve true si el objeto Float que lo llama es equivalente a objFloat boolean isInfinite () Devuelve true si el objeto contiene un valor infinito. En caso contrario, devuelve false. static Boolean isInfinite (float num) Devuelve true si num contiene un valor infinito. En caso contrario, devuelve false. boolean isNaN () Devuelve true si el objeto contiene un valor que no es nmero. En caso contrario, devuelve false. static Boolean isNaN (float num) Devuelve true si num contiene un valor que no es un nmero. En caso contrario, devuelve false. static Float valueOf (String str) Devuelve un objeto Float que contiene el valor especificado por la cadena String static float parseFloat (String str) Devuelve un valor float equivalente al nmero contenido en la cadena str. Todos estos mtodos arrojan la excepcin NumberFormatException
o Boolean: esta es una envoltura muy simple alrededor de valores boolean que slo es til cuando se quiere pasar una variable bolean por referencia. Esta clase contiene las constantes TRUE y FALSE, que definen un objeto Boolean true y false. A continuacin se muestran constructores de esta clase: Boolean (boolean ValorBoolean) Boolean (String CadenaBoolean)
En el primer constructor, la variable ValorBoolean tiene que ser true o false. En el segundo constructor, si CadenaBoolean contiene la cadena true (en maysculas o minsculas), entonces el nuevo objeto Boolean ser TRUE, en caso contrario ser FALSE. M M T TO OD DO O D DE ES SC CR RI I P PC CI I N N Boolean booleanValue() Devuelve el valor boolean equivalente al objeto Boolean equals(Boolean) Devuelve true si el objeto es equivalente al Objeto Bolean pasado por parmetro Static Boolean getBoolean(String) Devuelve true si la propiedad del sistema especificada por el String es true. En caso contrario, devuelve false. Int hashCode() Devuelve el cdigo hash del objeto String toString() Devuelve la cadena equivalente al objeto. Static Boolean valueOf(String) Devuelve true si String contiene la cadena true (en maysculas o minsculas), sino false. Curso de J ava Standard Edition J 2SE 16
o Arreglos Unidimensionales: En J ava los arreglos son considerados variables orientadas a objetos. Los elementos de los arreglos se indexan a partir de 0, para lo cual se debe utilizar un ndice entero. Debido a que los arreglos estn implementados como objetos: es posible asignar una variable de referencia de arreglo a otra y simplemente est intercambiando aquel objeto al cual la variable se refiere. Cada arreglo tiene asociado, una variable de instancia length, que posee el nmero de elementos que la variable es capaz de almacenar (tamao del arreglo). Para crear un arreglo, se deben seguir los siguientes pasos: declaracin, construccin e inicializacin. Declaracin de una arreglo: boolean booleans[]; int ints[]; byte bytes[]; float floats[]; short[] shorts; long longs[]; char chars[]; double[] doubles; Integer enteros []; Character [] caracteres; En la declaracin de un arreglo, los corchetes pueden ser colocados tanto antes como despus del nombre del arreglo. La declaracin de un arreglo no reserva espacio memoria, esto solo declara la variable.
Construccin de una arreglo: Los Arreglos son construidos a travs de la palabra reservada new. Cuando se construye un arreglo el tamao del mismo debe ser provisto. short arreglo[]; arreglo = new short[5]; double [] arr = new double [10];
Inicializacin de un arreglo: Cuando un arreglo es construido en J ava, sus elementos son inicializados automticamente con los valores por omisin, en caso de no haber una inicializacin explicita. int ints[] = new int []{10,20,30,40}; double [] reales = new double [3]; Todos los elementos del arreglo con 0.0d
J ava no permite desbordar los lmites de un arreglo en tiempo de ejecucin, cuando se intenta esto, se genera un mensaje de error representado por la excepcin ArrayIndexOutOfBoundsExeption, y termina la ejecucin del programa.
o Arreglos Multidimensionales: En J ava los arreglos multidimensionales son considerados como arreglos de arreglos. Como un arreglo bidimensional es un arreglo de arreglos, la variable de instancia length contendr el nmero de arreglos almacenados. La forma de obtener el nmero de elementos de uno de los arreglos es la siguiente: sample[2].length.
La forma general de Declarar un arreglo multiidimensional: tipo nombreArreglo[][]= new tipo[N Filas][N Columnas] ;
La forma de acceder una posicin del arreglo, es la siguiente: Arreglo [3] [5];
Los arreglos multidimensionales son inicializados colocando los valores iniciales de cada sub-arreglo dentro de su propio conjunto de corchetes: Curso de J ava Standard Edition J 2SE 17
tipo nombreArreglo [] = { {Valor1, Valor2, ... , Valor N }; {Valor1, Valor2, ... , Valor N }; . . . {Valor1, Valor2, ... , Valor N };
};
Cuando se reserva memoria para un arreglo multidimensional, slo se necesita especificar la memoria para la primera dimensin. Despus debe reservarse la memoria, separadamente, para las otras dimensiones restantes no es necesario reservar el mismo nmero de elemento para cada dimensin. Ejemplo:
int sample [][] = new [3][]; sample [0] = new int [2]; sample [1] = new int [4]; sample [2] = new int [3];
7 7. . I I D DE EN NT TI I F FI I C CA AD DO OR RE ES S
Los identificadores usados en J ava siguen reglas estndar: comienzan con una letra y pueden contener slo letras, nmeros, los caracteres underscore (_) y dlar ($). Adems no deben incluir espacios. No existe restriccin de longitud para los identificadores de J ava. Los identificadores en J ava son sensibles a maysculas y minsculas.
- Convencin de Nombres. Generalmente, la primera letra en el nombre de la variable o en el nombre de un mtodo est en minscula, mientras que la primera letra en un nombre de clase est en mayscula.
- Declaraciones. Las declaraciones de variables en J ava contienen el nombre del tipo y luego una lista de los nombres de las variables, donde los nombres de las variables son separados por comas. Todas las sentencias en J ava terminan con punto y coma. Es importante destacar que en J ava las variables pueden ser inicializadas en la sentencia de declaracin.
- Inicializacin. Al igual que ocurre en C++, J ava tambin permite la declaracin de variables en cualquier parte del cdigo del programa. A diferencia de C++, el compilador de J ava no permite usar la variable antes de su inicializacin. En el caso de C++, se genera un mensaje de advertencia, mientras que en J ava, se genera un error de compilacin. Esta es una ilustracin del intento de J ava por asegurar la portabilidad, dado que algunas plataformas permiten el uso de variables no inicializadas, mientras que otras plataformas no. Los datos miembros de una clase pueden no ser inicializados. Las variables de funcin deben inicializarse.
- Alcance y Bloques. Al igual que en C y C++, J ava tambin usa los caracteres { y } para marcar el inicio y el final del bloque de sentencia(s). Una variable declarada dentro del bloque slo puede usarse dentro de ese bloque o en cualquier bloque que est anidado en l. La variable no estar disponible una vez que el control del programa salga del bloque en el que fue declarada.
Curso de J ava Standard Edition J 2SE 18 8 8. . O OP PE ER RA AD DO OR RE ES S E EN N J J A AV VA A
J ava tiene seis clases generales de operadores: aritmticos, a nivel de bits, relacionales y lgicos. J ava tambin define algunos operadores adicionales que permiten controlar ciertas situaciones especiales.
- Operadores Aritmticos: Los operadores +, -,* y /, pueden ser aplicados a cualquier tipo de datos numricos, as como tambin, a los tipos char.
- Operadores de Bits: estos operadores insertan ceros o unos a la izquierda o derecha de las variables numricas a nivel de bits.
OPERADOR SIGNI FICADO USO >> SIGNED RIGHT SHIFT 1 >> 31 0 << UN-SIGNED LEFT SHIFT 1 << 31 2147483648 >>> UN-SIGNED RIGHT SHIFT -1 >>> 31 1
- Operadores Relacionales: El resultado de los operadores lgicos es un valor boolean.
OPERADOR SIGNI FICADO EJ EMPLO > MAYOR 1 > 2 FALSE >= MAYOR O IGUAL QUE 2 >= 2 TRUE < MENOR QUE 1 < 2 TRUE <= MENOR O IGUAL QUE 2 <= 1 FALSE == IGUAL A 1 == 2 FALSE = NO ES IGUAL A 1 != 2 TRUE
- Operadores Lgicos: El resultado de los operadores lgicos es un valor boolean.
OPERADOR SIGNI FICADO EJ EMPLO ! NEGACIN ! (FALSE) TRUE & CONJ UNCI N AND LGICO 1 & 1 TRUE ^ XOR 0 ^ 0 FALSE | DISYUNCIN OR LGICO 0 | 2 FALSE && AND EN CORTOCIRCUITO 1 && 1 TRUE | | OR EN CORTOCIRCUITO 0 || 2 FALSE
Curso de J ava Standard Edition J 2SE 19 La diferencia de usar &, l o &&, ll, es que los primeros operandos siempre evaluarn cada operando, mientras que las versiones de cortocircuito evaluarn el segundo operando slo cuando sea necesario.
- Operador instanceof: permite conocer si una variable de objeto est instanciada con un tipo de objeto especfico. La forma Genaro de este operador es como sigue:
variableObjeto instanceof ClaseObjeto
El resultado de la evaluacin de la expresin anterior, ser true si la variableObjeto, hace referencia a un objeto de la clase ClaseObjeto.
- Asignaciones Taquigrficas: J ava permite simplificar las declaraciones de asignacin.
- Precedencia de Operadores: La siguiente tabla muestra el orden de precedencia de mayor a menor para los operadores J ava. Note que la primera fila muestra elementos que, generalmente, no son considerados como operadores: parntesis, corchetes, y el operador punto. Recuerde que los parntesis permiten alterar la precedencia de una operacin.
Curso de J ava Standard Edition J 2SE 20 9 9. . E ES ST TR RU UC CT TU UR RA AS S D DE E D DE E C CO ON NT TR RO OL L
Las estructuras de control permiten realizar asignaciones, documentar el cdigo, as como tambin permiten tomar decisiones y realizar procesos repetidas veces, por lo que stas se clasifican en dos amplias categoras Condicionales e I terativas. Estas en J ava, son bsicamente las mismas sentencias que existen C/C++, solo con algunas consideraciones especiales.
- Comentarios: Los comentarios son sentencias que ayudan a explicar el cdigo. No son procesados por J ava, por lo cual no incrementarn el tamao del BYTECODE. Estos se expresan escribiendo frases precedidas por un doble //SLASH si el comentario es de una sola lnea o un conjunto de lneas encerradas por un bloque /* */.
- Asignacin: Las sentencias de asignacin se utilizan para dar un (nuevo) valor a una variable. Otra forma de verlo es como un mtodo para copiar datos desde un origen a un destino. J ava utiliza el signo igual (=) para est operacin.
- Condicionales: Son estructuras de decisin que hacen que el programa contine en una direccin cuando se encuentra una condicin en particular.
o Sentencia if else: Est es utilizada para ejecutar una sentencia en el caso que una condicin establecida sea verdadera, de lo contrario se podr ejecutar una sentencia distinta.
if (COND) { ... } else { ... }
o Sentencia switch: Esta sentencia permite realizar operaciones diferentes dependiendo del valor de una variable de tipo ordinal.
switch(var){ case valor1: { } case valor2: { }; break;
default: { } }
- I terativas: Tambin se denominan BUCLES y son aquellas sentencias de control que nos permiten ejecutar un grupo de sentencias hasta que se cumpla cierta condicin.
o Sentencia while: Ejecuta un grupo de instrucciones cero (0) o ms veces, MI ENTRAS una condicin dada sea cierta.
while (COND) { ... }
Curso de J ava Standard Edition J 2SE 21 o Sentencia do while: Ejecuta un grupo de instrucciones, MI ENTRAS una condicin dada sea cierta. La condicin es verificada despus de ejecutarse el conjunto de sentencias.
do { ... } while (COND);
o Sentencia for: Ejecuta un grupo de instrucciones repetidamente un nmero determinado de veces.
for (sentencia1; CONDI CI ON_DE_PARADA; sentencia2) { ... }
- Sentencia break: Las sentencia break ocasiona que el flujo de control salte a sentencia inmediatamente siguiente a la sentencia actual (rompe la ejecucin). La sentencia break se puede emplear tanto en las sentencias condicionales como en las iterativas.
- Sentencia continue: generalmente se utiliza la sentencia continue dentro de las iterativas, para saltar a otra sentencia. La sentencia continue solo puede ser llamada dentro de un bucle. Si se utiliza de la forma sencilla, la iterativa obvia hasta el final del cuerpo del bucle y evala nuevamente la condicin. I f se usa con etiquetas, la sentencia pasa a ejecutar la instruccin inmediatamente siguiente a la etiqueta utilizado con la sentencia continue.
Curso de J ava Standard Edition J 2SE 22 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . TEMA I I : Cl ases, Obj et os y Paquet es
OBJ ETI VOS: Escribir un programa simple en J ava que emplee Objetos, definiendo y agrupando apropiadamente las clases y paquetes.
CONTENIDO: Clases Objetos Paquetes Un programa J ava completo
22 Curso de J ava Standard Edition J 2SE 23
1 1. . C CL LA AS SE ES S
1 1. .1 1. . N NO OC CI I O ON NE ES S B B S SI I C CA AS S
La clase es ncleo de J ava. Es la construccin lgica sobre la que se construye el lenguaje J ava, ya que define la forma y la naturaleza de un objeto. La clase constituye la base de la Programacin Orientada a Objetos en J ava. Cualquier concepto que desee implementar en un programa J ava debe ser encapsulado en una clase. Dentro de una clase estn definidos los datos y los cdigos que actan sobre esos datos. Todas las actividades del programa J ava ocurren dentro de una clase, razn por la cual se dice que J ava es un lenguaje 100% orientado a objetos.
Una clase en J ava se define como: una plantilla que tiene las definiciones de variables o estados y mtodos o comportamientos que es comn a todos los objetos de un tipo en particular. J ava usa especificaciones de clase para construir objetos, que son instancias de una clase. De tal manera, una clase es bsicamente un juego de planos que especifican cmo construir un objeto. Es importante tener claro que una clase es una abstraccin lgica, por lo que hasta que un objeto de esa clase sea creado, no existir una representacin fsica de esa clase en memoria.
Los miembros de la clase, es decir los atributos y los mtodos son llamados respectivamente variables de instancia y mtodos de instancia; ya que estos representan el estado de un objeto, es decir que cada objeto de una clase contiene una copia propia de esas variables, separada a la de los otros objetos de la clase. Adems, existen las variables y mtodos de clase, los cuales pueden ser accedidos directamente de una clase sin instanciar, es decir que son comunes a todos los objetos de una clase por igual.
1 1. .2 2. . D DE EF FI I N NI I C CI I N N D DE E L LA AS S C CL LA AS SE ES S
Cuando se define una clase, se manifiesta su naturaleza y forma exacta. Esto se hace especificando los miembros de la clase, es decir las variables y los mtodos que operan en ella.
Una clase se define a travs de la palabra clave class. A continuacin se muestra la forma general de la definicin de una clase:
[acceso] [modif] class NombreClase [extends SuperClase] [implements Interfaces] { / / Variables miembro [acceso] [modif] tipo nombreVariable [= valorInicial];
/ / Mtodos miembro [acceso] [modif] tipo nombreMetodo([parametros]) [throws excepciones]{ // Cuerpo del mtodo };
};
C U E R P O
D E
L A
C L A S E
Curso de J ava Standard Edition J 2SE 24 - Componentes de la definicin de una clase
C CO OM MP PO ON NE EN NT TE ES S P PR RO OP P S SI I T TO O acceso De forma predeterminada todas las clases son friendly. Se puede establecer como modificador de acceso public abstract Opcional. La clase no se puede instanciar Modif. final Opcional. La clase no se puede derivar Class NombreClase Especifica el nombre de la clase extends SuperClase Opcional. Especifica el nombre de la SuperClase (Clase Padre) implements Interfaces Opcional. Especifica las Iinterfaces implementadas por la clase { cuerpo de la clase }; Implementacin de la clase, declaracin de variables y mtodos miembro Tabla 1. Componentes de la definicin de una clase
- Componentes de la definicin de variables miembro
[acceso] [modif] tipo nombreVariable [= valorInicial];
C CO OM MP PO ON NE EN NT TE ES S P PR RO OP P S SI I T TO O acceso Especifica el nivel de acceso de la variable (ver Tabla 4). static Indica la declaracin de una variable de clase. final Indica que la variable es una constante. transient Indica que la variable no es serializable. modif volatile Le indica al compilador que debe realizar ciertas optimizaciones. tipo Indica el tipo de la variable NombreVariable Indica el identificador de la variable valorInicial Especifica el valor inicial para esa variable Tabla 2. Componentes de la definicin de variables miembro
Cuando el sistema encuentra una clase por primera vez en un programa, crea una nica copia de todas las variables de clase que sern compartidas por todas las instancias (objetos) de la clase. Si una variable de clase es cambiada por un objeto de la clase, entonces el cambio de su valor se refleja en todas las dems instancias de la clase.
Curso de J ava Standard Edition J 2SE 25 - Componentes de la definicin de mtodos miembro
[acceso] [modif] tipo nombreMetodo([parametros]) [throws excepciones]{ // Cuerpo del mtodo };
C CO OM MP PO ON NE EN NT TE ES S P PR RO OP P S SI I T TO O acceso Especifica el nivel de acceso del mtodo (ver Tabla 4). static Indica la declaracin de un mtodo de clase abstract Indica que no se proporciona la implementacin del mtodo (funcin virtual) final Indica que la subclase no puede sobrescribir el mtodo native Indica que la implementacin de mtodo est escrita en otro lenguaje modif syncronized Indica que el mtodo necesita de un Monitor para ejecutarse tipo Indica el tipo de retorno del mtodo nombremetodo Indica el identificador del Mtodo parametros Especifica la lista de argumentos formales para el mtodo throws excepciones Da la lista de excepciones lanzadas por el mtodo Tabla 3. Componentes de la definicin de mtodos miembro
Ya que J ava es un lenguaje netamente orientado a objetos, cuando sea necesario implementar funciones para uso general, la forma de hacerlo es a travs de los mtodos de clase (static).
- Especificadores de acceso Podemos usar los especificadores de acceso a J ava para proteger las variables y mtodos de una clase mientras se declaran. La siguiente tabla presenta los niveles de accesos permitidos:
E ES SP PE EC CI I F FI I C CA AD DO OR R S SI I G GN NI I F FI I C CA AD DO O private Accesible slo dentro de la clase donde se define protected Accedida por la clase en donde est definida, sus subclases y las clases en el mismo paquete public Accesible desde cualquier parte friendly Accesible desde todas las clases presentes en el mismo paquete. Este es el modificador de acceso por omisin. Tabla 4. Especificadores de acceso
Curso de J ava Standard Edition J 2SE 26 - Ejemplo de la declaracin de una clase
public class Ejemplo { // Variables Miembro private int x; float Y; static char sc; static double sd;
1 1. .3 3. . C CL LA AS SE ES S E EJ J E EC CU UT TA AB BL LE ES S
Como ya se ha mencionado en J ava todo es una clase, por lo tanto la aplicacin (programa) tambin es una clase. Dicha clase tiene la caracterstica particular de poseer un mtodo de clase denominado main. Este mtodo es semejante a la funcin main() de un programa C++, razn por la cual, va a ser el primer mtodo en ejecutarse al correr un programa J ava.
public class NombreClase [extends SuperClase] [implements interfaz] { // Variables miembro ... // Mtodos miembro ... / / Mtodo main public static void main(String [ ] args) { // Cuerpo del mtodo };
};
Otra caracterstica importante de las clases ejecutables, es que la misma debe ser public y llamarse igual al archivo que la contiene, es decir el nombre del archivo fuente (archivo .java) debe ser el idntico al nombre de la clase. C U E R P O
D E
L A
C L A S E
Objeto VARIABLES DE CLASE Objeto sc sv Variables Objetos x y VARIABLES DE I NSTANCIA VARIABLES DE I NSTANCIA x y class Ejemplo {
} Curso de J ava Standard Edition J 2SE 27 2 2. . O OB BJ J E ET TO OS S
Usualmente, en un programa J ava, se crean muchos objetos a partir de diferentes clases y estos interactan entre ellos enviando mensajes. Despus de que el objeto completa el trabajo para el cual se cre, se recolecta como basura y sus recursos se liberaron, para el uso de otros objetos. El ciclo de vida de un objeto consiste tpicamente de los siguientes pasos: creacin de objetos, uso de los objetos creados y destruccin de los objetos.
2 2. .1 1. . C CR RE EA AC CI I N N D DE E O OB BJ J E ET TO OS S
Cuando se crea una clase se est creando un nuevo tipo de dato que se puede utilizar para declarar objetos de ese tipo. Sin embargo, para obtener objetos de una clase es necesario hacer dos pasos. En primer lugar, se debe declarar una variable del tipo de la clase. Esa variable no define un objeto, sino que es simplemente una variable que puede referirse a un objeto. En segundo lugar, se debe obtener una copia fsica y real del objeto y asignarla a la variable.
La creacin de un objeto es bsicamente la creacin de una instancia de una clase. Un objeto de una clase se crea mediante el operador new, como se muestra a continuacin:
Coordenadas plano = new Coordenadas ();
En realidad, en la sentencia dada se realizan tres acciones: la declaracin del objeto, la instanciacin del objeto y la inicializacin del mismo. La declaracin del objeto no necesita realizarse junto con la creacin del objeto. Pueden hacerse en pasos separados como se muestra a continuacin:
Coordenadas plano; plano = new Coordenadas();
Aqu la primera de las dos lneas es la declaracin del objeto, en donde Coordenadas representa a la clase y plano es la variable de referencia a los objetos. El operador new en J ava es llamado operador de instanciacin, el cual se usa para crear nuevos objetos. La inicializacin del objeto se hace usando Coordenadas(), que es la llamada a su constructor usado para inicializar el objeto.
- Constructores de una clase: Todas las clases en J ava tienen al menos un constructor para inicializar un objeto nuevo creado a partir de un tipo en particular. El nombre del constructor es el mismo que el nombre de la clase, no tiene tipo de retorno y debe ser pblico. J ava nos permite tener tantos constructores como queramos para una clase (sobrecarga del constructor). Mientras creamos nuestra propia clase, no necesitamos escribirle un constructor, ya que el sistema en tiempo de ejecucin proporciona un constructor por omisin para la clase si nosotros no desarrollamos ninguno. Este constructor por omisin, tiene una implementacin vaca.
public class Coordenada {
// Constructor predeterminado de la clase Coordenadas public Coordenada() { super(); };
// Constructor parametrizado de la clase Coordenadas public Coordenada(int x, int y) { Curso de J ava Standard Edition J 2SE 28 super(); setEjeX(x); setEjeY(y); };
}; Ejemplo de invocacin de los constructores: Coordenada plano1 = new Coordenada(); / / Constructor por omisin Coordenada plano2 = new Coordenada(20,25); / / Constructor parametrizado
2 2. .2 2. . U US SO O D DE E O OB BJ J E ET TO OS S
Una vez que se crea un objeto, nos gustara usarlo para realizar alguna tarea. Podemos necesitar alguna informacin del objeto, podemos querer cambiar su estado, o podemos querer usarlo para realizar alguna tarea. Hacemos estas cosas ya sea manipulando o visualizando sus variables o llamando a sus mtodos. En fin, el uso de los objetos est limitado a invocar a los mtodos miembros de la clase a la cual pertenecen, y a cambiar de referencia.
Objeto.Mtodo(parmetros);
Supongamos que la clase Coordenada, posee un mtodo para asignar y obtener la coordenada x, su implementacin e invocacin sera como sigue:
Coordenada OBJ = new Coordenada(); OBJ .setEjeX(12); int X = OBJ .getEjeX();
2 2. .3 3. . D DE ES ST TR RU UC CC CI I N N D DE E O OB BJ J E ET TO OS S ( (R RE EC CO OL LE EC CC C O ON N D DE E B BA AS SU UR RA A) )
Los objetos estn dinmicamente asignados en una seccin de memoria libre por medio del operador new. Como sabemos, la memoria no es infinita y la memoria libre puede agotarse. Por esta razn, un componente clave para cualquier esquema de asignacin dinmica de memoria, consiste en recobrar la memoria libre de objetos que no estn en uso, disponiendo de esta memoria para reasignaciones posteriores. En muchos lenguajes de programacin, el liberar memoria asignada con anterioridad se hace manualmente. Por ejemplo, en C++ se usa el operador delete para liberar memoria que estaba asignada. Sin embargo, J ava emplea un mtodo diferente: recoleccin de basura.
El sistema de recoleccin de basura de J ava, automticamente reclama objetos que aparecen transparentemente detrs de escena, sin ninguna intervencin del programador. Trabaja de la siguiente forma: cuando no existe una referencia a un objeto, se asume que ese objeto no se necesita ms y se recupera la memoria ocupada por ste. Esta memoria reciclada puede usarse entonces para una asignacin posterior.
La recoleccin de basura ocurre slo espordicamente durante la ejecucin de su programa. No ocurrir simplemente porque uno o ms objetos existan y no se usen. La recoleccin de basura se ejecuta, generalmente slo cuando se cumplen dos condiciones: que existan objetos para reciclar, y la necesidad de reciclarlos. Curso de J ava Standard Edition J 2SE 29
- El mtodo finalize (): De forma anloga a lo que eran los destructores en C++, en J ava existen los finalizadores. Estos mtodos se emplean, cuando un objeto necesita realizar una serie de acciones cuando es destruido. El finalizador de una clase se llama justo antes de la recoleccin de basura, por lo que los finalizadores son diferentes a los destructores. Es importante entender, que no se puede saber cundo (o inclusive si) el mtodo finalize() ser ejecutado.
public class Ejemplo {
protected void finalize() { // Cdigo de finalizacin }; };
3 3. . P PA AQ QU UE ET TE ES S
Un paquete es un contenedor que permite guardar el nombre de la clase en una forma de compartimientos. En muchas formas, un paquete es como un directorio, que permite guardar en forma segura una clase dentro de l. Es decir, que los paquetes son grupos de clases relacionadas almacenadas en una unidad, la cual ayuda a organizar el cdigo y proporciona otra capa de encapsulacin.
En programacin, los paquetes, son tiles para agrupar las piezas relacionadas de un programa. En J ava, un paquete sirve para dos propsitos: primero, suministra un mecanismo por el cual piezas relacionadas de un programa pueden ser organizadas como una unidad; as, un paquete proporciona la manera de nombrar una coleccin de clases. Segundo, un paquete participa en los mecanismos de control de acceso en J ava. Las clases definidas dentro de un paquete pueden hacerse privadas a ese paquete y no accesibles por cdigo fuera del paquete.
Es importante aclarar, que a los paquetes hay que considerarlos desde dos puntos de vista: el punto de vista lgico, en el cual los paquetes almacenan las declaraciones de las clases (archivos fuente de J ava); y el punto de vista fsico, en el cual los paquetes van a almacenar los archivos .class de las clases definidas dentro del paquete.
3 3. .1 1. . E ES SP PA AC CI I O OS S D DE E N NO OM MB BR RE ES S
En general, cuando nombra una clase, est asignando un nombre desde el espacio de nombre. Un espacio de nombre define una regin declaratoria. En J ava dos clases no pueden usar el mismo nombre desde el mismo espacio. As, dentro de un espacio de nombre dado, cada nombre de clase debe ser nico. Los paquetes suministran una manera de dividir el espacio de nombre, evitando problemas de duplicidad de nombres. Cuando una clase se define dentro de un paquete, el nombre de ese paquete se une a cada clase, con lo que se evita que los nombres choquen con otras clases del mismo nombre, pero que estn en otros paquetes. Si Para una clase, no se define un paquete, dicha clase pertenecer al paquete predeterminado de J ava y por ende al espacio de nombre predeterminado o global de J ava.
Curso de J ava Standard Edition J 2SE 30 3 3. .2 2. . D DE EF FI I N NI I C CI I N N D DE E P PA AQ QU UE ET TE ES S
Todas las clases en J ava pertenecen a algn paquete. Como se mencion anteriormente, cuando no se especifica algn paquete se usa el paquete predeterminado (o global). Adems, el paquete predeterminado no tiene nombre, lo que lo hace transparente.
Para crear un paquete, coloque un comando package como la primera sentencia del archivo fuente de J ava. Esto asegurar que cualquier clase declarada en ese archivo pertenecer a ese paquete particular. Debido a que un paquete define un espacio de nombre, los nombres de las clases que coloque dentro del archivo fuente, se convierten en parte de ese espacio del paquete. Una misma sentencia package se puede incluir en ms de un archivo fuente, por lo que no se impide que otras clases de otros archivos puedan formar parte de un mismo paquete. En las aplicaciones reales, los paquetes se suelen distribuir en muchos archivos fuente.
J ava usa el sistema de archivo para manejar los paquetes, con cada paquete almacenado en su propio directorio. Como el resto de J ava, los nombres de paquetes son sensibles a maysculas y minsculas. Es decir, el directorio en el cual es guardado un paquete debe ser el mismo del nombre del paquete.
package myPack;
Este paquete corresponder con un directorio en el sistema de archivos llama \myPack. Observe que se puede crear una jerarqua de paquetes dentro de paquetes separando los niveles con puntos.
package paq1.paq2.paq3;
Esta jerarqua de paquetes se debe reflejar en el sistema de archivos del sistema de desarrollo de J ava: \ paq1\ paq2\ paq3.
3 3. .3 3. . U UB BI I C CA AC CI I N N D DE E P PA AQ QU UE ET TE ES S
Como se explic, los paquetes son reflejados en directorios. Cmo sabe el sistema en tiempo de ejecucin de J ava dnde buscar los paquetes que usted cre? La respuesta tiene dos partes. Primero, por omisin: el sistema en tiempo de ejecucin de J ava busca en el directorio en curso como punto de partida. As, si sus archivos de clase estn en el directorio actual, o en un subdirectorio del directorio actual, ellos se encontrarn. Segundo, puede especificar una ruta o rutas de directorios, colocndola en la variable de entorno CLASSPATH. Dicha variable, controla la ubicacin particular que debe ser considerada por J ava como la raz de la jerarqua de paquetes.
Para configurar esta variable de entorno, desde la consola del sistema escribir lo siguiente: [set] CLASSPATH=.;CLASSPATH[;otros_directorios]
3 3. .4 4. . P PA AQ QU UE ET TE ES S Y Y A AC CC CE ES SO O A A M MI I E EM MB BR RO OS S
J ava proporciona muchos niveles de proteccin para permitir un control adecuado de la visibilidad de las variables y mtodos dentro de clases, subclases y paquetes. Las clases y los paquetes son dos medios de encapsular y contener el espacio de nombre y alcance de las variables y mtodos. J ava proporciona cuatro tipos de visibilidad para los miembros de clase. Visibilidad de los miembros de la clase segn su modificador de acceso.
Curso de J ava Standard Edition J 2SE 31
ESPECIFICADOR CLASE SUBCLASE PAQUETE MUNDO private Si No No No protected Si Si Si No public Si Si Si Si package Si No Si No Tabla 5. Paquetes y acceso a miembros
3 3. .5 5. . I I M MP PO OR RT TA AC CI I N N D DE E P PA AQ QU UE ET TE ES S
Dado que los paquetes existen y son un buen mecanismo para organizar de forma estructurada las clases, es fcil de ver por qu todas las clases incorporadas en J ava se almacenan en paquetes. No hay ninguna clase de J ava almacenada en el paquete por omisin.
De manera anloga, a lo que sera una directiva #include en C++, J ava incluye la sentencia import, para que se puedan ver ciertas clases o paquetes enteros. En un archivo fuente de J ava, las sentencias import tienen que ir inmediatamente despus de la sentencia package, si existe, y antes de las definiciones de las clases.
import paquete.clase; / / Importa una clase especfica import paquete.*; / / Importa todas las clases en un paquete
3 3. .6 6. . P PA AQ QU UE ET TE ES S D DE E R RE EL LE EV VA AN NC CI I A A
A continuacin estudiaremos los paquetes de mayor relevancia que proporciona la API de J ava.
- j ja av va a. .l la an ng g: : Este paquete se importa automticamente en todos los programas y contiene clases e interfaces que son fundamentales para la programacin en J ava. Es el paquete ms utilizado de J ava. java.lang incluye las siguientes clases:
Object Boolean SecurityManager String Character ClassLoader Number Class Proccess Long System Thread Integer Math ThreadGroup Double StringBuffer Throwable Flota Runtime Compiler
Nota: las clases en cursiva fueron vistas en los tipos de datos orientados a objetos (Tema I). En esta parte se estudiaran las clases resaltadas en negrita.
o Class: encapsula el estado de ejecucin de un objeto o interfaz. Los objetos del tipo Class se crean automticamente cuando se cargan las clases. Un objeto Class no se puede declarar de forma explcita. Generalmente, se obtiene un objeto Class llamando al mtodo getClass() definido en la clase Object. . Algunos de los mtodos que define la clase Class son: Curso de J ava Standard Edition J 2SE 32
M M T TO OD DO O D DE ES SC CR RI I P PC CI I N N static Class forName(String name) Devuelve un objeto Class dando su nombre completo. Class [] getInterfaces() Cuando se invoca sobre un objeto, devuelve una matriz de interfaces implementadas por la clase del objeto. Si se invoca sobre una interfaz, devuelve una matriz con sus interfaces Padre. String getName() Devuelve el nombre completo de la clase o interfaz del objeto que llama el mtodo Class getSuperclass() Devuelve la clase padre del objeto. Retorna null si el objeto es de tipo Object. Bolean isInterface() Devuelve trae si el objeto es una interfaz
o System: esta clase contiene un conjunto de mtodos y variables estticos. La entrada, salida y salida de error del intrprete de J ava se almacenan en las variables in, out y err. Veamos algunos de los usos ms comunes de la clase System:
M M T TO OD DO O D DE ES SC CR RI I P PC CI I N N static long currentTimeMillis () Devuelve la hora actual en milisegundos desde el 1 de enero de 1970 Static void exit(int codSalida) Detiene la ejecucin y devuelve el valor codSalida al proceso padre. El valor cero (0) indica que ha terminado correctamente. Static void gc() Inicia el sistema de recoleccin de basura Static void loadLibrary(String lib) Carga la biblioteca dinmica cuyo nombre est asociado con lib Static void runFinalization() Inicia la llamada a los mtodos finalize() de todos los objetos no utilizados y que todava estn sin recolectar
o Math: contiene todas las funciones en coma flotante que se utilizan en geometra y trigonometra, as como algunos mtodos de propsito general. Math define dos constantes double E = 2.72 y double PI = 3,14.. los mtodos definidos en la clase Math son:
M M T TO OD DO O D DE ES SC CR RI I P PC CI I N N static int abs(int arg) Devuelve el valor absoluto de arg static long abs(long arg) Devuelve el valor absoluto de arg. static float abs(float arg) Devuelve el valor absoluto de arg. static double abs(double arg) Devuelve el valor absoluto de arg. static double ceil(double arg) Devuelve el nmero completo ms pequeo mayor o igual que arg. static double floor(double arg) Devuelve el nmero completo ms grande menor o igual que arg. Curso de J ava Standard Edition J 2SE 33 static int max(int x, int y) Devuelve el mximo de x e y. static long max(long x, long y) Devuelve el mximo de x e y. static float max(float x, float y) Devuelve el mximo de x e y. static double max(double x, double y) Devuelve el mximo de x e y. static int min(int x, int y) Devuelve el mnimo de x e y. static long min(long x, long y) Devuelve el mnimo de x e y. static float min(float x, float y) Devuelve el mnimo de x e y. static double min(double x, double y) Devuelve el mnimo de x e y. static double rint(double arg) Devuelve el valor entero mas cercano de Arg static int round(float arg) Devuelve arg redondeado al int mas cercano static long round(float arg) Devuelve arg redondeado al long mas cercano
- j ja av va a. .u ut ti il l: : La biblioteca de J ava contiene un conjunto de clases de utilidades que se utilizan en los paquetes principales de J ava y que tambin estn disponibles para ser utilizados en cualquier programa escrito. Estas clases se utilizan para almacenar conjuntos de objetos, generar nmeros aleatorios, manipulacin de la fecha y hora y operaciones con cadenas. A continuacin se muestran las clases incluidas en java.util:
Date Stack Observable Random Dictionary Map Vector Properties HashTable
Nota: En esta parte solo se estudiaran las clases en negrita.
o Date: Representa una fecha y hora. Los mtodos ms importantes definos en la clase Date son lo siguientes:
M M T TO OD DO O D DE ES SC CR RI I P PC CI I N N Date() Inicializa el objeto con la fecha y hora actual Date(String fecha) Construye un objeto con la fecha y hora especificada. Date(int ao, int mes, int dia) Inicializa el objeto con la fecha pasada. El parmetro ao especifica el nmero de aos que han transcurrido de 1900. el parmetro mes establece el mes del ao comenzando en 0. El parmetro da establece el da del mes. Este constructor establece la hora del objeto a las 12:00:00 boolean after(Date fecha) Devuelve trae si el objeto Date contiene una fecha posterior a la especificada en fecha
Curso de J ava Standard Edition J 2SE 34 boolean befote(Date fecha) Devuelve trae si el objeto Date contiene una fecha anterior a la especificada en el parmetro boolean equals(Object fecha) Devuelve trae si el objeto Date contiene la misma fecha y hora que la especificada por parmetro int getDate() Devuelve el da del mes (1 31) int getDay() Devuelve el da de la semana (0 Domingo) Int getMonth() Devuelve el mes (0 - Enero) Int getYear() Devuelve el nmero de aos desde 1900. por lo tanto el ao actual ser este valor devuelto + 1900 int getHours() Devuelve la hora, en 24 horas int getMinutes() Devuelve los minutos Int getSeconds() Devuelve los segundos void setDate(int dia) Establece el da del mes void setMonth(int mes) Establece el mes void setYear(int ao) Establece el ao. El valor del ao se debe colocar restndole 1900 void setHours(int hora) Establece la hora (0 23) void setMinutes(int min) Establece los minutos (0 59) void setSeconds(int sec) Establece los segundos (0 59) Nota: no se puede establecer el da de la semana ya que ste depende del da del mes.
o Random: es un generador de nmeros pseudos-aleatorios. Se les llama as, porque son secuencias distribuidas uniformemente. Cuando se inicializa un objeto Random con un valor (semilla), se est definiendo el punto inicial de una secuencia aleatoria. Si se utiliza la misma semilla, para inicializar otro objeto Random se obtendr la misma secuencia aleatoria. Para generar distintas secuencias es necesario especificar distintas semillas. Algunos de los mtodos que define la clase Random son: o M M T TO OD DO O D DE ES SC CR RI I P PC CI I N N Random() Crea un generador de nmero que utiliza la hora actual como valor inicial. Random(long semilla) Permite especificar el valor inicial de la secuencia aleatoria. double nextDouble() Devuelve el siguiente nmero aleatorio double float nextFloat() Devuelve el siguiente nmero aleatorio float int nextInt() Devuelve el siguiente nmero aleatorio int long nextLong() Devuelve el siguiente nmero aleatorio long void setSeed(long semilla) Establece la semilla, es decir, el punto de inicio del generador de nmero aleatorios
o Vector: La clase Vector es bsicamente un arreglo de longitud variable de referencias a objetos, es decir, un Vector puede dinmicamente aumentar o disminuir su tamao. Los vectores se crean con un tamao inicial y cuando se Curso de J ava Standard Edition J 2SE 35 supera ese tamao, automticamente aumentan su tamao. Todos los vectores comienzan con una capacidad inicial. Algunos de los mtodos definidos en la clase Vector son los siguientes:
M M T TO OD DO O D DE ES SC CR RI I P PC CI I N N Vector() Este constructor crea un vector vaco con capacidad para 10 elementos. Vector(int N) Este constructor crea un vector vaco con capacidad para N elementos. Vector(int N, int incr) Este constructor crea un vector vaco con capacidad para N elementos y cuyo incremento es incr. El incremento especifica el nmero de elementos que se tienen que reservar cada vez que se aumenta el tamao del Vector, si no se especifica incr, entonces el Vector duplica su tamao cada vez que se reserva memoria para l. final void addElment(Object elm) Aade al Vector el objeto especificado por elm Final void insertElementAt(Object o, int pos) Aade el Objeto al Vector en la posicin indicada final int capacity() Devuelve la capacidad del Vector final int size() Devuelve el numero de elementos en el Vector final boolean contain(Object obj) Devuelve true si el objeto est en el Vector final Object elementAt(int pos) Devuelve el Objeto en la posicin especificada final Object firstElement() Devuelve el primer objeto en el Vector final Object lastElement() Devuelve el ultimo objeto en el Vector final bolean isEmpty() Devuelve true si el Vector est vaco final void removeAllElements() Elimina todos los elementos del Vector. Una vez ejecutado el tamao del Vector es cero. final void removeElement(Object o) Elimina la primera instancia del objeto en el Vector final void removeElementAt(int pos) Elimina el elemento de la posicin indicada final void setElementAt(Object o, int p) Coloca el objeto en la posicin indicada final int indexOf(Object element) Devuelve la posicin de la primera ocurrencia del elemento. Si el objeto no se encuentra devuelve -1
o Stack: Esta es una subclase de Vector, que implementa la abstraccin de una pila. Los mtodos que agrega la clase Snack son los siguientes:
M M T TO OD DO O D DE ES SC CR RI I P PC CI I N N Stack() Crea una pila vaca boolean empty() Devuelve true si la pila est vaca Object peek() Devuelve el elemento en el tope, pero no lo retira de la pila Object pop() Devuelve el elemento en el tope y lo extrae de la pila Object push(Object element) Introduce un elemento en la pila. Curso de J ava Standard Edition J 2SE 36
- j ja av va a. .n ne et t: : El paquete java.net, contiene todas las clases que permiten elaborar aplicaciones en J ava, capaces de operar en redes. El estudio de estas clases est fuera del alcance de este curso.
- j ja av va a. .i io o: : El paquete java.io, contiene todas las clases para realizar las operaciones de Entrada/Salida (E/S). El estudio de estas clases se realizar en el Tema V: Entrada/Salida.
- j ja av va a. .s sq ql l: : El paquete java.sql, suministra todas las clases que proporcionan la conectividad a bases de datos. El estudio de estas clases se realizar en el Tema VI: Tecnologas de acceso a datos.
- j ja av va a. .a aw wt t: : El paquete java.awt, proporciona las clases bsicas para el manejo de de interfaces grficas de usuario. El estudio de estas clases se realizar en el Tema VII: Interfaces Grficas.
- j ja av va ax x. .s sw wi in ng g: : El paquete javaxswing, proporciona todas las clases para realizar el manejo de interfaces grficas de usuario. El estudio de estas clases se realizar en el Tema VII: Interfaces Grficas. Curso de J ava Standard Edition J 2SE 37 4 4. . U UN N P PR RO OG GR RA AM MA A J J A AV VA A C CO OM MP PL LE ET TO O
/** * ARCHIVO....: Example.java * @autor.......: Prof. Ronel J . Rivas R. * @date........: 19/09/2005 * DESCRIPCIN: Archivo que contiene la especificacin de un ejemplo sobre: * paquetes, importacin de paquetes y clases, clases generales, * clases Ejecutables, objetos y referencias a objetos **/
package myPack;
import java.io.*; import java.util.Date;
/************************* ** CLASES DEL PAQUETE ** *************************/ // Clase para manejar la Hora class J Time { / / VARIABLES DE INSTANCIA private int hour, minutes, seconds;
/ / METODOS DE INSTANCI A public void setHour(int h) { this.hour = h; }; public int getHour(){ return this.hour; };
Curso de J ava Standard Edition J 2SE 38 public void setMinutes(int m) { this.minutes = m; }; public int getMinutes(){ return this.minutes; }; public void setSeconds(int s) { this.seconds = s; }; public int getSeconds(){ return this.seconds; }; };
/********************************** ** CLASE PRINCIPAL DEL PAQUETE ** ***********************************/ // Clase de Ejemplo public class Example { / / VARIABLES DE INSTANCIA private int day, month, year; private J Time time;
/ / CONSTRUCTORES public Example() { super(); setDate(12,2,2004); time = new J Time(); };
/ / METODOS DE INSTANCI A public void setDay(int d) { this.day = d; }; public int getDay(){ return this.day; }; public void setMonth(int m) { this.month = m; }; public int getMonth(){ return this.month; }; public void setYear(int y) { this.year = y; }; Curso de J ava Standard Edition J 2SE 39 public int getYear(){ return this.year; }; public void setDate(int d, int m, int y) { setDay(d); setMonth(m); setYear(y); }; public Date getDate(){ return new Date(getYear(),getMonth(),getDay()); }; public void setTime(int hour, int minutes, int seconds) { time = new J Time(hour,minutes,seconds); }; public J Time getTime() { return this.time; };
/ / METODO PRI NCI PAL public static void main(String [] args){ Example miEjemplo = new Example(); J Time hora;
miEjemplo.setDate(12,2,2004); miEjemplo.setTime(1,15,0); hora = miEjemplo.getTime();
Sytem.out.println("La Fecha Actual es: " + miEjemplo.getDate()); System.out.print("La Hora Actual es: " + hora.getHour() + "-"); System.out.println(hora.getMinutes() + "-" + hora.getSeconds());
hora = new J Time(3,0,0); Sytem.out.println("La nueva Hora es: " + hora); }; };
Curso de J ava Standard Edition J 2SE 40 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . TEMA I I I : Herenci a, Cl ases Abst ract as e I nt erf aces
OBJ ETI VOS: Manejar los conceptos de Herencia, clases abstractas, interfaces y polimorfismo. Escribir un programa en J ava, donde se reflejen los conceptos de herencia y polimorfismo.
CONTENIDO: Herencia Clases abstractas Interfaces
40 Curso de J ava Standard Edition J 2SE 41 1 1. . H HE ER RE EN NC CI I A A
1 1. .1 1. . F FU UN ND DA AM ME EN NT TO OS S
La herencia es considerada uno de los fundamentos de la programacin orientada a objetos, dado que permite crear una jerarqua de clasificaciones. Usando este concepto se puede definir una clase general que da la definicin de los rasgos comunes a un conjunto de clases relacionadas. Otras clases que aaden caractersticas que son nicas para ellas pueden heredar de esta clase general. En J ava, la clase que es heredada es llamada una superclase y la clase que hereda de otra, es llamada una subclase. Por lo tanto, una subclase es un tipo especial de la superclase. Aunque una superclase tenga una subclase, esto no significa que la superclase no pueda ser utilizada por s sola.
Slo puede haber una superclase para cualquier clase que se cree, ya que J ava no soporta la herencia mltiple, es decir varias superclases en una subclase. Sin embargo, se puede crear una jerarqua de herencia en la que una subclase llegue a ser una superclase de otra subclase. Ninguna clase puede ser superclase de s misma.
Para especificar que una clase hereda de otra, la clase que hereda debe usar en su declaracin la palabra clave extends despus del nombre de la clase. Esto implica que la subclase extiende la funcionalidad y caractersticas de la superclase. La forma general de declarar una clase que hereda de una superclase se muestra a continuacin:
class NombreSubClase extends NombreSuperClase { // Cuerpo de la clase };
1 1. .2 2. . A AC CC CE ES SO O A A M MI I E EM MB BR RO OS S Y Y H HE ER RE EN NC CI I A A
El siguiente programa es un ejemplo sencillo de herencia, donde se crea una superclase A y una subclase llamada B. //Crea una superclase class A { private int i; private int j; public void setIJ (int x, int y) { i = x; j = y; } public int getI () { return i; } }
//Crea una subclase que extiende o hereda de la clase A class B extends A { private int total; public void setTotal (int t) { total = t; } public int getTotal () { Curso de J ava Standard Edition J 2SE 42 return total; } public void sumar (){ setTotal ( getI() + j ); / / Error: j no es accesible aqu, por ser privada. } }
// Clase Ejecutable public class Acceso { public static void main (String args[]) { B subObj = new B(); subObj.setIJ (10, 12); subObj.sumar (); System.out.println (El total es + subObj.getTotal()); } }
Este programa no compila ya que la referencia a la variable j dentro del mtodo sumar () de la clase B provoca una violacin de acceso. Como j es una variable privada slo es accesible por los otros miembros de su propia clase. Aunque una subclase hereda todos los miembros de su superclase, no puede acceder a aquellos miembros de su superclase que hayan sido declarados private. Para solucionar esto es necesario implementar un mtodo de instancia pblico que tenga acceso al miembro privado.
1 1. .3 3. . R RE EF FE ER RE EN NC CI I A AR R O OB BJ J E ET TO OS S S SU UB BC CL LA AS SE E A A T TR RA AV V S S D DE E O OB BJ J E ET TO OS S S SU UP PE ER RC CL LA AS SE E
Una referencia al objeto de la superclase puede tener asignada una referencia a cualquier objeto de sus subclases. Cuando a una variable de referencia a superclase se le asigna la referencia a la subclase, el acceso ser slo a los miembros que estn definidos en la superclase; debido a que la superclase no conoce acerca de las caractersticas especiales aadidas por su subclase. El siguiente ejemplo ilustra este aspecto, usando las clases A y B del ejemplo anterior (sin error):
//Crea una superclase class A { private int i; private int j; public void setIJ (int x, int y) { i = x; j = y; } public int getI () { return i; } } //Crea una subclase que extiende o hereda de la clase A class B extends A { private int total; public void setTotal (int t) { total = t; } Curso de J ava Standard Edition J 2SE 43 public int getTotal () { return total; } public void sumar (){ setTotal ( getI() + getJ () ); } }
// Clase Ejecutable public class Acceso { public static void main (String args[]) { B subObj = new B(); A superObj = new A(); subObj.setIJ (10, 12); subObj.sumar (); System.out.println (El total es + subObj.getTotal()); // Asigna una referencia de B a una referencia de A superObj = subObj; superObj.setIJ (1, 5); / / Correcto: el mtodo setIJ () est definido en la superclase superObj.sumar(); / / Error: en la clase A no est definido un mtodo sumar() } }
Como B es una subclase de A, es posible asignar subObj a superObj. Slo el tipo de variable referencia determina los miembros que se pueden acceder, no el tipo de los objetos a los que se hace referencia. Por lo tanto, la referencia superObj no puede acceder al miembro sumar(), que slo est presente en la clase B.
1 1. .4 4. . E EL L M MO OD DI I F FI I C CA AD DO OR R S SU UP PE ER R
Al trabajar con herencia, es posible que tanto la superclase como la subclase proporcionen sus propios constructores, donde cada uno tiene la responsabilidad de inicializar su porcin del objeto.
Cuando la superclase y la subclase definen juntas constructores, ambos constructores deben ser ejecutados. En este caso debe usarse la palabra clave de J ava, super, que tiene dos formas generales. La primera llama un constructor superclase. La segunda es utilizada para acceder a un miembro de la superclase que ha sido ocultado por un miembro de una subclase.
- Uso de super para llamar constructores de superclase: Una subclase puede llamar al constructor de la superclase utilizando el modificador super de la siguiente forma: super (lista_de_parmetros); Aqu, lista_de_parmetros especifica los parmetros del constructor de la superclase. Si se utiliza el modificador super(), tiene que ser la primera sentencia ejecutada dentro del constructor de la subclase.
Cuando una subclase llama a super(), el constructor de la superclase inmediata ser llamado. As que, super() siempre se refiere a la superclase inmediatamente encima de la clase que llama. Esto se cumple incluso en una jerarqua multinivel. Cualquier forma del constructor definida por la superclase, puede ser llamada usando super(). Si se omite la Curso de J ava Standard Edition J 2SE 44 llamada a super(), se ejecutar automticamente el constructor predeterminado de la superclase.
//Crea una superclase class A { private int i; private int j; //Constructor con 2 parmetros A (int x, int y) { setIJ ( x, y); } //Constructor con 1 parmetro A (int x) { setIJ ( x, 1); } public void setIJ (int x, int y) { i = x; j = y; } public int getI () { return i; } public int getJ () { return j; } }
//Crea una subclase que extiende o hereda de la clase A class B extends A { private int total; //Constructor sin parmetros B () { super (1); //Invoca al constructor con 1 parmetro de la superclase setTotal (0); } //Constructor con 3 parmetros B (int n1, int n2, int n3) { super (n1, n2); //Invoca al constructor con 2 parmetros de la superclase setTotal (n3); } public void setTotal (int t) { total = t; }
Curso de J ava Standard Edition J 2SE 45 public int getTotal () { return total; } public void sumar () { setTotal ( getI() + getJ () ); } }
// Clase Ejecutable public class Acceso { public static void main (String args[]) { B obj1 = new B(); // Utiliza el constructor sin parmetros de la subclase y // el constructor con 1 parmetro de la superclase B obj2 = new B(2, 3, 0); // Utiliza el constructor con 3 parmetros de la subclase y // el constructor con 2 parmetros de la superclase obj1.sumar (); System.out.println (El total 1 es + obj1.getTotal()); obj2.sumar (); System.out.println (El total 2 es + obj2.getTotal()); } }
- Uso de super para acceso a miembros de la superclase: La segunda forma de utilizar super es parecida a la utilizacin de this, excepto que super siempre se refiere a la superclase de la subclase en la que se utiliza. Su formato es: super.miembro Donde miembro puede ser cualquier mtodo o variable de la superclase a la cual se desea hacer referencia. Esta forma es til cuando los miembros de la subclase sirven para ocultar los miembros que tienen el mismo nombre en la superclase y se quiere tener acceso a los miembros de la superclase.
// Crea una superclase class A { private int i; public void setI (int x) { i = x; } public int getI () { return i; } }
// Crea una subclase que extiende o hereda de la clase A class B extends A { private int i;
Curso de J ava Standard Edition J 2SE 46 //Constructor con 2 parmetros B (int n1, int n2) { super.setI (n1); // setI() de A (superclase) setI (n2); // setI() de B (subclase) } public void setI (int x) { i = x; // Este setI oculta al setI de la superclase A } public int getI () { return i; // Este getI oculta al getI de la superclase A } public void mostrar () { System.out.println (i de la superclase: + super.getI()); System.out.println (i de la subclase: + getI()); } } // Clase Ejecutable public class Acceso { public static void main (String args[]) { B obj = new B(1, 2); obj.mostrar (); } }
1 1. .5 5. . C CR RE EA AC CI I N N D DE E U UN NA A J J E ER RA AR RQ QU U A A M MU UL LT TI I N NI I V VE EL L
Como se mencion, es perfectamente aceptable usar una subclase como superclase de otra. Por ejemplo, dadas tres clases llamadas A, B y C. La clase C puede ser una subclase de B, que es una subclase de A. Cuando este tipo de situacin ocurre, cada subclase hereda todas las caractersticas encontradas en todas sus superclases. En este caso, C hereda todos los aspectos de B y A. Objeto de A
Objeto de B
Objeto de C Curso de J ava Standard Edition J 2SE 47 1 1. .6 6. . O OR RD DE EN N D DE E E EJ J E EC CU UC CI I N N D DE E L LO OS S C CO ON NS ST TR RU UC CT TO OR RE ES S
En una jerarqua de clases, los constructores son llamados en orden de derivacin, de superclases a subclases. Adems, como super() tiene que ser la primera sentencia que se ejecuta dentro del constructor de la subclase, este orden es el mismo tanto si se utiliza super() como si no. Si no se utiliza super() entonces se ejecuta el constructor por omisin o sin parmetros de cada superclase. El siguiente ejemplo ilustra el orden de ejecucin de los constructores:
// Clase A class A{ //Constructor por omisin de A A(){ System.out.println (Construyendo A); } } // Clase B - subclase de A y superclase de C class B extends A{ //Constructor por omisin de B B(){ System.out.println (Construyendo B); } } //Clase C - subclase de B class C extends B{ //Constructor por omisin de C C(){ System.out.println (Construyendo C); } } public class Acceso{ public static void main (String args[]){ C c = new C(); } } La salida del programa es la siguiente: Construyendo A Construyendo B Construyendo C
1 1. .7 7. . S SO OB BR RE ES SC CR RI I T TU UR RA A D DE E M M T TO OD DO OS S
En una jerarqua de clases, si un mtodo en la subclase tiene la misma fima (los mismos nombres de mtodos, tipos de argumentos, tipo de retorno y excepciones que arroja), que el mtodo en la superclase, entonces el mtodo en la superclase se dice que fue sobrescrito por el mtodo en la subclase. Cuando se invoca un mtodo sobrescrito desde la subclase, siempre se refiere al mtodo definido dentro de la subclase. La versin del mtodo que se encuentra en la superclase est oculto y puede ser accedido usando la palabra super dentro de la subclase.
En caso de que el mtodo en la superclase y la subclase tengan el mismo nombre pero sus firmas sean diferentes, entonces los mtodos se sobrecargan, ms no se sobrescriben; por lo tanto el Curso de J ava Standard Edition J 2SE 48 mtodo de la superclase no est oculto y es accesible directamente desde la subclase, sin usar la palabra super. Cuando se aplica sobrescritura, tanto para mtodos como para variables, no se puede hacer menos accesible de lo que era inicialmente, desde la superclase. Por ejemplo, si un mtodo en la superclase tiene acceso public, en la subclase slo puede aparecer como public. A continuacin, se presenta un cuadro que resume el uso de los modificadores de acceso cuando se trabaja con sobrescritura:
A AC CC CE ES SO O E EN N S SU UP PE ER RC CL LA AS SE E S SU UB BC CL LA AS SE E private private, package, protected, public package package, protected, public protected protected, public public public
1 1. .8 8. . U US SO O D DE EL L M MO OD DI I F FI I C CA AD DO OR R f fi in na al l
La palabra clave final tiene tres usos: con una variable, con un mtodo y con una clase. Cuando se usa con una variable, permite crear el equivalente de una constante con nombre. Cuando se usa con un mtodo, previene la sobrescritura del mtodo. Cuando se usa con una clase, previene que la clase se herede.
- Uso del modificador final para prevenir sobrescritura: Cuando se desea que un mtodo no sea sobrescrito, se usa el modificador final en la declaracin del mtodo. Al declarar un mtodo como final en la superclase, no es posible sobrescribirlo en la subclase; de ocurrir esto, se producir un error de compilacin. El uso del modificador final ayuda a eliminar la sobrecarga de costo asociado con la llamada del mtodo. Usualmente, el compilador de J ava resuelve la llamada a un mtodo dinmicamente en tiempo de ejecucin; lo que se denomina enlace tardo. Como los mtodos finales no pueden sobrescribirse, una llamada al mtodo final puede ser resuelta en tiempo de compilacin; lo que se denomina enlace temprano.
class A { private int x, y, w; public final int sumar () { setW ( getX() + getY() ); return w; } public int getX () { return x; } public int getY () { return y; } public void setW (int n) { w = n; } }
Curso de J ava Standard Edition J 2SE 49
class B extends A{ private int total; public int sumar () { setTotal (super.sumar()); / / Error de compilacin: mtodo final no puede ser sobrescrito int c = ( getTotal() + 5 ); return c; } public int getTotal () { return total; } public void setTotal (int t) { total = t; } }
- Uso del modificador final para prevenir herencia: El modificador final se utiliza en la declaracin de una clase para evitar que esta se herede. Cuando la clase se declara como final, J ava declara implcitamente todos los mtodos de la clase como final. No es posible declarar una clase abstracta como final, dado que la clase abstracta no est completa por s misma y espera que sus subclases proporcionen las implementaciones completas.
final class A{ private int x; public void setX (int n){ x = n; } public int getX (){ return x; } } class B extends A{ // Error de compilacin: no se puede heredar A ... }
Curso de J ava Standard Edition J 2SE 50 1 1. .9 9. . E EJ J E EM MP PL LO O C CO OM MP PL LE ET TO O D DE E H HE ER RE EN NC CI I A A Y Y S SO OB BR RE ES SC CR RI I T TU UR RA A D DE E M M T TO OD DO OS S
// Superclase Figura class Figura { private double dim1; private double dim2; // Constructor por omisin Figura (double a, double b) { setDim1 (a); setDim2 (b); } // Mtodos GETs y SETs public void setDim1 (double x) { dim1 = x } public double getDim1 () { return dim1; } public void setDim2 (double x) { dim2 = x } public double getDim2 () { return dim2; } // Mtodo para calcular el rea de la figura (No definido) public double area () { System.out.println (El rea de la figura no est definida); return 0; } } // Clase Rectangulo que extiende a Figura class Rectngulo extends Figura { Retangulo (double a, double b) { super (a, b); // Se inicializa el objeto usando el constructor de la superclase } // Sobrescribe el mtodo area para el rectngulo public double area () { System.out.println (Dentro del mtodo rea para un rectngulo); Return getDim1() * getDim2(); } }
Curso de J ava Standard Edition J 2SE 51 // Subclase Triangulo que extiende a Figura class Triangulo extends Figura { Triangulo (double a, double b) { super (a, b); // Se inicializa el objeto usando el constructor de la superclase } // Sobrescribe el mtodo rea para un tringulo public double area () { System.out.println (Dentro del mtodo rea para un tringulo); return getDim1() * getDim2() / 2 } }
// Clase Ejecutable public class EncontrarAreas { public static void main (String args[]) { Figura f = new Figura (10, 10); Rectangulo r = new Rectangulo (5, 5); Triangulo t = new Triangulo (4, 8); Figura figRef; FigRef = r; System.out.println (El rea es: + figRef.area()); FigRef =tr; System.out.println (El rea es: + figRef.area()); FigRef = f; System.out.println (El rea es: + figRef.area()); } }
La salida de este programa es la siguiente:
Dentro del mtodo rea para un rectngulo El rea es: 25 Dentro del mtodo rea para un tringulo El rea es: 16 El rea de la figura no est definida El rea es: 0
Curso de J ava Standard Edition J 2SE 52 2 2. . C CL LA AS SE ES S A AB BS ST TR RA AC CT TA AS S
2 2. .1 1. . M MO OD DI I F FI I C CA AD DO OR R A AB BS ST TR RA AC CT T
El modificador abstract puede usarse de dos formas, con una clase y con un mtodo. Cuando una clase tiene el modificador abstract en su declaracin, esta se denomina clase abstracta; lo que indica que la clase no puede ser instanciada (no se puede crear un objeto de la clase). Cuando el modificador abstract es usado en la declaracin de un mtodo, es llamado mtodo abstracto; en este caso, el modificador indica que la implementacin del mtodo no se proporciona en la clase. Los mtodos abs tractos slo pueden presentarse dentro de una clase abstracta. Si se incluye el modificador abstract en la declaracin de un mtodo, indica que la clase que herede de esa clase, tendr que proporcionar la implementacin para este mtodo; si no proporciona la implementacin, entonces esa subclase deber ser declarada como abstract.
2 2. .2 2. . C CL LA AS SE ES S Y Y M M T TO OD DO OS S A AB BS ST TR RA AC CT TO OS S
Una clase abstracta sirve para definir el comportamiento genrico de la clase. La clase abstracta tiene las definiciones de los mtodos, que proporcionan el comportamiento de la clase; tambin puede implementar algunos de los mtodos definidos en la clase, dando una implementacin parcial de su comportamiento.
Una clase abstracta no se puede instanciar, pero si se puede derivar. Tampoco es posible, declarar constructores abstractos o mtodos estticos abstractos.
La forma general de declarar una clase abstracta es la siguiente:
abstract class X { // Cuerpo de la clase
}
Las clases abstractas se usan cuando se quiere definir una superclase que declara la estructura de una abstraccin sin proporcionar una implementacin completa de cada mtodo. Usualmente, cuando una superclase es incapaz de brindar una implementacin significativa para un mtodo, pueden aplicarse dos soluciones: la primera, simplemente dar un mensaje que se imprima en la salida estndar; y la segunda, declarar el mtodo como abstracto.
La forma general de declarar un mtodo abstracto se da a continuacin:
abstract tipo nombreMtodo (lista_de_parmetros);
Como es evidente, el cuerpo del mtodo est ausente, lo que significa que la implementacin del mtodo no se proporciona en la clase, y por lo tanto, debe ser implementado por la subclase. Una clase abstracta puede contener cualquier cantidad de mtodos abstractos. Adems es posible que una clase abstracta no tenga ningn mtodo abstracto en ella. Cuando una clase es declarada como abstracta, no es necesario que la clase contenga mtodos abstractos, pero cuando existe al menos un mtodo abstracto dentro de la clase, esta debe ser declarada como abstract.
Curso de J ava Standard Edition J 2SE 53 2 2. .3 3 E EJ J E EM MP PL LO O D DE E C CL LA AS SE ES S Y Y M M T TO OD DO OS S A AB BS ST TR RA AC CT TO OS S. .
// Superclase Figura abstract class Figura { private double dim1; private double dim2; // Constructor Figura (double a, double b) { setDim1 (a); setDim2 (b); } // Mtodos GETs y SETs public void setDim1 (double x) { dim1 = x; } public double getDim1 () { return dim1; } public void setDim2 (double x) { dim2 = x; } public double getDim2 () { return dim2; } // Mtodo para calcular el rea de la figura (No implementado) abstract public double area () { System.out.println (El rea de la figura no est definida); return 0; } } // Clase Rectangulo que extiende a Figura class Rectngulo extends Figura { Retangulo (double a, double b) { super (a, b); // Se inicializa el objeto usando el constructor de la superclase } // Sobrescribe el mtodo area para el rectngulo public double area () { System.out.println (Dentro del mtodo rea para un rectngulo); Return getDim1() * getDim2(); } }
Curso de J ava Standard Edition J 2SE 54 // Subclase Triangulo que extiende a Figura class Triangulo extends Figura { Triangulo (double a, double b) { super (a, b); // Se inicializa el objeto usando el constructor de la superclase } // Sobrescribe el mtodo area para un tringulo public double area () { System.out.println (Dentro del mtodo rea para un tringulo); return getDim1() * getDim2() / 2; } }
// Clase Ejecutable class EncontrarAreas { public static void main (String args[]) { //Figura f = new Figura (10, 10); // Esto no es correcto Rectangulo r = new Rectangulo (5, 5); Triangulo t = new Triangulo (4, 8); Figura figRef; // Esto es correcto FigRef = r; System.out.println (El rea es: + figRef.area()); FigRef = t; System.out.println (El rea es: + figRef.area()); } }
La salida de este programa es la siguiente: Dentro del mtodo rea para un rectngulo El rea es: 25 Dentro del mtodo rea para un tringulo El rea es: 16
Curso de J ava Standard Edition J 2SE 55 3 3. . I I N NT TE ER RF FA AC CE ES S
Las interfaces son sintcticamente igual a las clases, pero sin variables de instancia y sin implementacin para los mtodos declarados en ella. La palabra clave interface permite especificar qu es lo que debe hacer la clase, pero no cmo lo hace. Una interfaz puede ser implementada por cualquier nmero de clases. Adems, una clase puede implementar cualquier nmero de interfaces. Una clase, que implementa una interfaz, debe implementar el conjunto completo de mtodos definidos por la interfaz. Las interfaces actan como sustitutos para implementar la herencia mltiple.
3 3. .1 1. . D DE EF FI I N NI I C CI I N N D DE E U UN NA A I I N NT TE ER RF FA AZ Z
El acceso es public o no se utiliza. Cuando no se utiliza ningn modificador de acceso, entonces se aplica el acceso por omisin y la interfaz est slo disponible para otros miembros del paquete en que ha sido declarada. Pueden existir variables en la declaracin de la interfaz; implcitamente estas sern de la forma final y static, lo que significa que no podrn ser cambiadas por la clase que las implemente y adems deben ser inicializadas con un valor constante. Todos los mtodos declarados en la interfaz son bsicamente mtodos abstractos, ya que no puede haber implementacin o cuerpo para ninguno de ellos. Si la interfaz es declarada como pblica, entonces todos los mtodos y variables en la interfaz tendrn acceso pblico.
3 3. .2 2. . I I M MP PL LE EM ME EN NT TA AC CI I N N D DE E U UN NA A I I N NT TE ER RF FA AZ Z
Una vez definida una interfaz, puede ser implementada por una o ms clases. Para implementar una interfaz, es necesario incluir la sentencia implements en la definicin de la clase y crear los mtodos definidos por la interfaz.
La forma general, de la implementacin de una clase, es la siguiente:
acceso class NombreClase [extends Superclase] [implements Interfaz1 [, Interfaz2] ] { // Cuerpo de la clase }
Si una clase implementa ms de una interfaz, las interfaces estn separadas con una coma. Si una clase implementa dos interfaces que declaran el mismo mtodo, la clase da slo una implementacin para el mtodo. Los mtodos que implementan una interfaz deben declarase como pblicos y deben corresponder exactamente, en firma, con los mtodos definidos en la interfaz.
Curso de J ava Standard Edition J 2SE 56 Ejemplo: El siguiente cdigo tiene la una clase que implementa la interfaz Contestadora:
class Telefono implements Contestadora { String mensLlamada; String mensGrabado = llame luego por favor;
public void guardarMensaje (String mens) { System.out.println (Mensaje dejado en llamada: + mens); mensLlamada = mens; } public String getMensaje () { System.out.println (Mensaje grabado: + mensGrabado); return (mensGrabado); }
}
3 3. .3 3. . I I M MP PL LE EM ME EN NT TA AC CI I N N P PA AR RC CI I A AL L
Si una clase incluye una interfaz, pero no implementa todos los mtodos definidos por esa interfaz, entonces esa clase tiene que ser declarada como abstract. Por ejemplo:
abstract class TeleFax implements Contestadora { String mensGrabado = llame en 3 horas; public String getMensaje () { System.out.println (Mensaje grabado de TeleFax: + mensGrabado); return (mensGrabado); } }
Como la clase TeleFax no implementa el mtodo guardarMensaje(String mens) tiene que ser declarada como abstracta. Cualquier clase que herede de TeleFax, tiene que implementar el mtodo guardarMensaje(String mens) o ser declarada como abstract.
3 3. .4 4. . V VA AR RI I A AB BL LE ES S E EN N U UN NA A I I N NT TE ER RF FA AZ Z
Es posible aplicar las interfaces para importar constantes compartidas en muchas clases, mediante una interfaz que declara las variables que son inicializadas con valores deseados. La clase que implementa la interfaz, incluir automticamente todos los nombres de variables como constantes. Si una interfaz no tiene ningn mtodo, entonces cualquier clase que incluye dicha interfaz no se tiene que preocupar de implementar nada; realmente, es como importar las variables constantes declaradas en la interfaz como variables final en la clase que la implementa.
interface Constantes { int A = 0; int B = 1; int C = 2; } class X implements Constantes { int determinarConstante () { Curso de J ava Standard Edition J 2SE 57 int ran = (int) (Math.random() * 100); if (ran < 30) return A; else if (ran < 60) return B; else return C; } }
class Y implements Constantes { void evaluarResultado (int res) { switch (res) { case A: System.out.println (Nmero bajo); break; case B: System.out.println (Nmero medio); break; case C: System.out.println (Nmero alto); break; } } public static void main (String args []) { X x = new X (); Y y = new Y (); y.evaluarResultado ( x.determinarConstante () ); } }
Ambas clases implementaron la interfaz Constantes, donde A, B y C son los enteros definidos. El valor de estas variables no puede ser cambiado por la clase que implementa la interfaz, pero los valores que inicializan estas variables estn disponibles para las clases que implementes la interfaz, como si cada clase las hubiese definido o heredado directamente.
3 3. .5 5. . J J E ER RA AR RQ QU U A A D DE E I I N NT TE ER RF FA AC CE ES S
Una interfaz puede heredar de otra interfaz usando la palabra clave extends. Esto es similar a la herencia de clases. Slo una interfaz puede heredar de otra interfaz; una clase no puede heredar de una interfaz. Cuando una clase implementa una interfaz que hereda de otra, tiene que implementar todos los mtodos definidos en la cadena de herencia de la interfaz.
interface A { void metodo1 (); void metodo2 (); } interface B extends A { void metodo3 (); void metodo4 (); } interface C extends B { void metodo4 (); void metodo6 (); } interface D { void metodo6 (); } Curso de J ava Standard Edition J 2SE 58 class PruebaInterfaz implements C, D { public void metodo1 () { System.out.println (Dentro de metodo1); } public void metodo2 () { System.out.println (Dentro de metodo2); } public void metodo3 () { System.out.println (Dentro de metodo3); } public void metodo4 () { System.out.println (Dentro de metodo4); } public void metodo6 () { System.out.println (Dentro de metodo6); } } public class InterfazDemo { public static void main (String args[]) { PruebaInterfaz obj = new PruebaInterfaz (); obj.metodo1 (); obj.metodo2 (); obj.metodo3 (); obj.metodo4 (); obj.metodo6 (); } }
La salida del programa es la siguiente: Dentro de metodo1 Dentro de metodo2 Dentro de metodo3 Dentro de metodo4 Dentro de metodo6
Tanto la interfaz B como la C declaran el mismo mtodo: metodo4 (); a pesar que la interfaz C hereda el metodo4 () definido en B. Esto es similar a la sobrescritura de mtodos en el caso de clases. La clase PruebaInterfaz implementa las interfaces C y D. La clase tiene que proporcionar la implementacin para los siguientes mtodos: metodo1 (), metodo2 (), metodo3(), metodo4() y metodo6(); debido a que la interfaz C declara implcitamente todos los mtodos anteriores, dado que hereda de las interfaces A y B. Tanto la interfaz C como la D declaran el mtodo: metodo6(), pero la clase tiene que dar slo una implementacin del mtodo; en caso contrario, ocurre un error de compilacin. Si la clase dejara de dar implementacin para alguno de los mtodos, esta tendra que ser declarada como abstract.
3 3. .6 6. . U US SO O D DE E I I N NT TE ER RF FA AC CE ES S C CO OM MO O R RE EF FE ER RE EN NC CI I A AS S
Se pueden tener una variable de tipo interfaz, que hagan referencia a una instancia de una clase que implementa la misma interfaz. Cuando se invoca un mtodo a travs de tal referencia, la versin correcta del mtodo invocado se basar en la instancia actual de la interfaz que es referenciada (se Curso de J ava Standard Edition J 2SE 59 elige dinmicamente, en tiempo de ejecucin). El manejo de interfaces a travs de referencia, es similar a la referencia de una superclase, para acceder a una subclase. A continuacin se muestra un programa que ilustra el poder polimrfico de una variable de referencia de interfaz:
class Telefono implements Contestadora { String mensLlamada; String mensGrabado = llame luego por favor;
public void guardarMensaje (String mens) { System.out.println (Mensaje dejado en llamada en Telefono: + mens); mensLlamada = mens; } public String getMensaje () { System.out.println (Mensaje grabado de Telefono: + mensGrabado + \n); return (mensGrabado); } }
class TelefonoCelular implements Contestadora { String mensLlamada; String mensGrabado = llame en 2 horas; public void guardarMensaje (String mens) { System.out.println (Mensaje dejado en llamada en TelefonoCelular: + mens); mensLlamada = mens; } public String getMensaje () { System.out.println (Mensaje grabado de TelefonoCelular: + mensGrabado + \n); return (mensGrabado); } }
class InterfazDemo { public static void main (String args[]) { String mens; Contestadora con = new Telefono(); mens = con.getMensaje(); System.out.pintln (Mensaje recibido: + mens) ; con.guardarMensaje(cita a las 11 am);
TelefonoCelular t2 = new Telefono2(); con = t2; mens = con.getMensaje(); System.out.pintln (Mensaje recibido: + mens) ; con.guardarMensaje(cita a las 2 pm); Curso de J ava Standard Edition J 2SE 60 } }
La salida del programa es la siguiente: Mensaje grabado en Telefono: llame luego por favor Mensaje recibido: llame luego por favor Mensaje dejado en llamada de Telefono: cita a las 11 am
Mensaje grabado de TelefonoCelular: llame en 2 horas Mensaje recibido: llame en 2 horas Mensaje dejado en llamada de TelefonoCelular: cita a las 2 pm
OBJ ETI VOS: Escribir programas en J ava, que manipulen los errores a travs de las excepciones definidas en el lenguaje. Crear y utilizar en programas J ava, excepciones definidas por el mismo, de acuerdo a las necesidades de cualquier problema.
CONTENIDO: Definicin de Excepcin Tipos de excepciones Manejo de excepciones J erarqua de excepciones Propagacin de excepciones Sobrescritura de mtodos y excepciones Definicin de excepciones propias
61 Curso de J ava Standard Edition J 2SE 62 1 1. . D DE EF FI I N NI I C CI I N N D DE E E EX XC CE EP PC CI I N N
Una de las verdades fundamentales al escribir programas es la ocurrencia inevitable de errores. Algunos lenguajes de programacin controlan y manejan estos errores de forma manual mezclando el cdigo de la aplicacin con el de verificacin y manejo de errores, lo que resultaba en un cdigo complejo, difcil de leer y de mantener.
Lenguaje C: void main() { int a=10; int b=0; double res=0; if (b) { res = a / b; printf(El resultado es: %g, res) } else { printf(Error Divisin por 0); } } Visual Basic: Private Sub Dividir () Dim a, b As Integer Dim res As Double a=0 b=0 res=0 On Error Goto 110 res = a / b print El resultado es: + CStr(res) halt(0) 110: print Error Divisin por 0 End Sub
J ava ofrece una elegante solucin a estos problemas con un mecanismo para el manejo de los errores en tiempo de ejecucin, conocida como manipulacin de Excepciones. Una excepcin es una condicin anormal que ocurre durante la ejecucin de un programa e interrumpe el flujo normal de sus instrucciones. En otras palabras, una excepcin es un error en tiempo de ejecucin. Una excepcin en J ava es un Objeto que describe una condicin excepcional, es decir, un error que se ha producido en un fragmento de cdigo. La gestin de excepciones de J ava evita todos los inconvenientes de la gestin de errores por validaciones y cdigos de error y, en el proceso, lleva a la gestin de errores en tiempo de ejecucin al mundo orientada a objetos.
public class ProgramaExcepciones { public static void main(String [] args) { int a=10; int b=0; double res=0; try { res = a / b; System.out.println(El resultado es: + res); } catch (Exception e) { System.out.println(Error Divisin por 0); } } }
La ventaja ms importante del manejo de excepciones, es que ste automatiza gran parte del cdigo para manejar aquellos errores en tiempo de ejecucin que previamente han sido determinados. Por ejemplo, en varios lenguajes de programacin (como Visual Basic), los cdigos de errores son retornados cuando un mtodo falla, y estos valores se deben revisar manualmente cada vez que se invoque al mtodo. Esta aproximacin es tediosa y propensa a error. El manejo de excepciones, controla los errores de lneas de flujo, lo que permite definir en un programa un bloque de cdigo, conocido como manejador de excepciones, que es ejecutado automticamente cuando ocurre un error. No es necesario comprobar manualmente el xito o falla de cada operacin o mtodo especfico; si ocurre un error, ste ser procesado por el manejador de excepciones. M A N E J A D O R
D E
E X C E P C I O N E S
Curso de J ava Standard Edition J 2SE 63 2 2. . T TI I P PO OS S D DE E E EX XC CE EP PC CI I O ON NE ES S E EN N J J A AV VA A
Las excepciones pueden ser generadas por el intrprete J ava o pueden ser generados por el propio cdigo. Las excepciones generadas por J ava estn relacionadas con errores fundamentales que violan las reglas del lenguaje o las restricciones del entorno de ejecucin. Las excepciones generadas manualmente se usan para informar de alguna condicin de error al mtodo que lo invoc.
Todos los tipos de excepciones en J ava son subclases de la clase Throwable (lanzable) o de una de sus subclases. Slo los objetos de esta clase, o de una de sus subclases, pueden ser lanzados al sistema en tiempo de ejecucin con la clusula throw; y slo esta clase o una de sus subclases puede ser un argumento en una clusula catch. Throwable contiene una copia de la pila de llamadas de mtodos y un mensaje que describe al objeto lanzado. La clase Throwable se encuentra en el paqueta java.lang. Las siguientes son subclases de Throwable:
- Error: los objetos de esta clase representan errores fatales en la J VM o fallas de enlace dinmico. No es normal para un programa tpico de J ava lanzar Error.
Grfico 1. J erarqua de la clase Error
La siguiente tabla describe las clases de error ms generales:
ERROR DESCRIPCIN LinkageError Se lanza cuando ocurre un error en tiempo de enlace ThreadDeath Se lanza cuando la ejecucin de un hilo falla VirtualMachineError Se lanza con un error interno de la Mquina Virtual de J ava
Throwable Error LinkageError ThreadDeath VirtualMachineError ClassCircularityError ClassFormatError ExceptionInitializeErr IncompatibleClassCh NoClassDefFormatErr UnsatisfiedLinkError VerifyError InternalError OutOfMemoryError StackOverflowError UnknownError AbstractMethodError IllegalAccessError InstantiantionError NoSuchFieldError NoSuchMethodError Curso de J ava Standard Edition J 2SE 64 - Exception: indica que existe algn problema, no necesariamente uno fatal, que puede ser manejado por un programa razonable. Todos los programas J ava probablemente lanzaran y capturaran Exception pero no Error.
Grfico 2. J erarqua de la clase Excepcin
La siguiente tabla describe las clases de excepcin ms generales:
EXCEPTION DESCRIPCIN ClassNotFoundException Es lanzada, cuando no se consigue un recurso o una clase solicitada CloneNotSupportedException Lanzado cuando se ejecuta el mtodo clone() de la clase Class RuntimeException Engloba una serie de errores en tiempo de ejecucin IllegalAccessException Engloba los errores de acceso InstantiationException Cuando ocurre un error en la instanciacin de una clase IOException Se lanza cuando ocurre un error de Entrada/Salida (E/S)
Throwable Exception ClassNotFoundException CloneNotSupportedException RuntimeException AritmeticException ArrayStoreException IllegalArgumentException ClassCastExcepcion IllegalMonitorStateException IllegalStateException IndexOutOfBoundsException NegativeArraySizeException SecurityException NullPointerException IllegalAccessException InstantiationException InterruptedException IOException IllegalThreadStateException NumberFormatException ArrayIndexOutOfBoundsExce StringIndexOutOfBoundsExce Curso de J ava Standard Edition J 2SE 65 3 3. . M MA AN NE EJ J O O D DE E E EX XC CE EP PC CI I O ON NE ES S E EN N J J A AV VA A
Cuando ocurre un error, se crea un objeto que representa la excepcin y se enva al sistema en tiempo de ejecucin. El sistema en tiempo de ejecucin busca un manejador de excepciones apropiado en la pila de llamadas hacia atrs, empezando con el mtodo en el que ocurri el error. Si un manejador de excepcin es elegido se dice que captura la excepcin. Si no se encuentra un manejador de excepcin apropiado, el sistema en tiempo de ejecucin y el programa J ava terminan.
Grfico 3. Manejo de Excepciones en J ava
El manejo de excepciones en J ava se realiza mediante cinco palabras claves: try, catch, throw, throws y finally. Bsicamente el funcionamiento es el siguiente:
- Las sentencias del programa que pueden generar una excepcin se incluyen dentro del bloque try.
- El cdigo puede capturar esta excepcin, usando cath, y tratarla de manera racional. - Para generar una excepcin se usa throw.
- Para especificar las excepciones que puede lanzar un mtodo se usa throws.
- Cualquier cdigo que se tenga que ejecutar antes de que termine un mtodo se introduce en un bloque finally.
Ocurre un ERROR No No Si Si Objeto Excepcin creado Termina el sistema en tiempo de ejecucin y el programa J ava Buscar hacia atrs en la pila de llamadas Objeto Excepcin entregado al sistema en tiempo de ejecucin Busc en toda la pila de llamadas? El sistema en tiempo de ejecucin examina la pila de llamadas empezando en el mtodo en que ocurri el error Manejador de Excepciones apropiado encontrado Dejar que el manejador capture la excepcin La Excepcin lanzada es del tipo del manejador? Curso de J ava Standard Edition J 2SE 66 Esta es la forma general de un bloque de cdigo con gestin de excepciones:
try { // bloque de cdigo } catch (tipoExcepcin e) { // Cdigo para manejar las excepciones para el tipoExcepcin
} finally { // bloque de cdigo que se ejecutara antes de que termine el try }
4 4. . R RE EQ QU UE ER RI I M MI I E EN NT TO O D DE E C CA AP PT TU UR RA A O O E ES SP PE EC CI I F FI I C CA AC CI I N N D DE E J J A AV VA A
En J ava, es necesario que un mtodo capture o especifique todas las excepciones verificadas que pueden ser lanzadas dentro del alcance del mtodo. Esto es:
- Capturar: un mtodo puede capturar una excepcin proporcionando un manejador apropiado para ese tipo de excepcin.
- Especificar: si un mtodo elige no capturar una excepcin debe especificar que puede lanzarla.
- Excepciones verificadas: son excepciones que el compilador verifica que sean capturadas o especificadas.
- Alcance del mtodo: las excepciones pueden ser lanzadas directamente usando throw; o indirectamente por la llamada a otros mtodos.
5 5. . J J E ER RA AR RQ QU U A A D DE E E EX XC CE EP PC CI I O ON NE ES S
Se debe capturar primero la excepcin ms especfica, y luego proceder a capturar las excepciones ms generales hasta alcanzar aquella que sea la ms genrica.
6 6. . P PR RO OP PA AG GA AC CI I N N D DE E E EX XC CE EP PC CI I O ON NE ES S
En la sintaxis declarativa de los mtodos, existe una seccin destinada a especificar cuales son las excepciones que dicho mtodo no manipula en su cuerpo y que puede lanzar a la pila de llamadas.
[acceso] [modif] tipo nombreMetodo([parmetros]) [throws exceptions] Curso de J ava Standard Edition J 2SE 67 Es posible que una excepcin no sea capturada en el alcance del mtodo. En tal caso, la excepcin se propagar en la pila de llamadas hasta encontrar un manejador de excepcin apropiado.
Grfico 4. Propagacin de Excepciones
Un mtodo sobrescrito en una subclase solo puede lanzar excepciones declaradas en la clase padre o hijos de las excepciones declaradas en la clase padre.
public class Base { public void metodo1 () throws IOException { }; } public class Derivada extends Base { public void metodo1 () throws FileNotFoundException { }; }
7 7. . D DE EF FI I N NI I E EN ND DO O N NU UE ES ST TR RA AS S P PR RO OP PI I A AS S E EX XC CE EP PC CI I O ON NE ES S
Las clases de excepcin generalmente tienen constructores pero no datos ni mtodos. Todo lo que hacen es llamar a los constructores de subclase. Por eso nosotros podemos crear nuestras propias excepciones y para ello creamos una clase que extienda de clase Exception.
public class MiExcepcion extends Exception { public MiExcepcion () { super(); } public MiExcepcion (String s) { super(s); } }
8 8. . E EJ J E EM MP PL LO O C CO OM MP PL LE ET TO O D DE E U UN N P PR RO OG GR RA AM MA A J J A AV VA A Q QU UE E M MA AN NE EJ J A A E EX XC CE EP PC CI I O ON NE ES S
/* * Ejemplo de un programa J ava con manejo de excepciones * Sumar n nmeros enteros */
Curso de J ava Standard Edition J 2SE 68 public class SumarEnteros { public static void main(String args[]) { int r = 0; try { for(int i=0; i<args.lenght; i++) r += Integer.parseInt(args[i]); } catch(ArrayIndexOutOfBoundsException e) { System.out.println(Formato: SumarEnteros n1 n2 nN); } catch(NumberFormatException e) { System.out.println(Error: Los argumentos deben ser enteros.); } finally { System.out.println(El resulado es + r); } } }
Curso de J ava Standard Edition J 2SE 69 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . TEMA V: Ent rada/Sal i da
OBJ ETI VOS: Escribir programas en J ava, que utilicen flujos de entrada y salida para interactuar con los usuarios. Crear y utilizar en programas J ava, que implementen la persistencia de datos, a travs de los flujos de archivo y de la serializacin de objetos.
CONTENIDO: Flujos Tipos de flujos Flujos predefinidos Entrada/Salida por consola Flujos de archivo Serializacin de objetos
69 Curso de J ava Standard Edition J 2SE 70 Desde el comienzo del curso se han estado utilizando (sin una explicacin formal) partes del Sistema de Entrada/ Salida (E/ S) de J ava, tales como System.out.println(). En este tema se estudiar el mtodo de J ava para manejar las entradas y salidas desde consola y archivos. Aunque solo se estudiar una porcin del extenso sistema, afortunadamente el mismo es coherente y consistente, por lo que una vez que se entiendan sus fundamentos, el resto del sistema es fcil de manejar.
1 1. . F FL LU UJ J O OS S ( (S ST TR RE EA AM MS S) )
Los programas J ava realizan procesos de E/S a travs de flujos. El programa establece una conexin con un dispositivo fsico para leer informacin de l o para escribir informacin en l, y la informacin se lee o escribe en forma serial.
Un flujo puede ser definido como una entidad lgica que produce o consume informacin, y est encadenado a un dispositivo fsico por el sistema de E/ S de J ava. Los flujos pueden ser dirigidos a cualquier dispositivo de E/S compatible. Todos los flujos se comportan de la misma manera, aunque los dispositivos fsicos reales a los que estn ligados difieran. As las mismas clases y mtodos de E/S pueden ser aplicadas a cualquier tipo de dispositivo, bien sea bien sea la entrada o salida estndar, la memoria, un archivo, una conexin de red, etc.
Grfico 1. Flujos de Entrada/Salida
2 2. . T TI I P PO OS S D DE E F FL LU UJ J O OS S
El paquete java.io tiene las clases necesarias para la utilizacin de flujos en J ava. Los flujos pueden ser clasificados de la siguiente manera:
- De acuerdo con el tipo de dato que utilizan: se pueden clasificar en flujos de caracteres (manipulan los datos como caracteres Unicode) y flujos de bytes (manipulan los datos como objetos).
- De acuerdo con el uso que se les d: se pueden clasificar en flujos consumidores (obtienen datos de una fuente) y flujos de procesamiento (utilizan funciones para la conversin, clasificacin y filtrado de datos obtenidos de los flujos).
Grfico 2. Clasificacin de Flujos en J ava DATOS Flujo de Salida PROGRAMA DISPOSITI V O F SICO DATOS PROGRAMA DISPOSITI V O F SICO Flujo de Entrada Flujos De Caracteres De Bytes Class Reader Class Writer Class InputStream Class OutputStream Curso de J ava Standard Edition J 2SE 71
Grfico 3. J erarqua de clases Reader y Writer
Grfico 4. J erarqua de clases InputStream y OutputStream
De las jerarquas de clases de flujos en J ava, es importante sealar que las clases que aparecen sombreadas representan las clases procesadoras (aaden caractersticas a la forma de recibir o enviar los datos de los dispositivos) y las otras son las clases consumidoras (definen de dnde o a dnde se estn enviando o recibiendo los datos, es decir al dispositivo que se conecta en flujo). La siguiente tabla explica la jerarqua de clases para los flujos de carcter:
OutputStream FileOutputStream PipedOutputStream FilterOutputStream ObjectOutputStream DataOutputStream PrintStream BufferedOutputStre am PushBackOuputStre am ByteArayOuputStream InputStream FileInputStream PipedInputStream ByteArrayInputStream StringBuferInputStream SequenceInputStream FilterInputStream ObjectInputStream DataInputStream LineNumberInputStrea BufferedInputStream PushBackInputStream Reader BufferedReader CharArrayReader I nputStreamReader FilterReader PipedReader StringReader LineNumberReader FileReader PushBackReader Writer BufferedWriter CharArrayWriter OutputStreamWrit er FilterWriter PipedWriter StringWriter FileWriter PrintWriter Curso de J ava Standard Edition J 2SE 72 COMPONENTE PROPSITO Reader y Writer Clases abstractas para leer y escribir flujos de carcter. BufferedReader y BufferedWriter Leen o escriben texto desde los flujos de caracteres. Permiten almacenar en un buffer los caracteres, de manera de leer o escribir eficientemente caracteres, lneas y arreglos CharArrayReader y CharArrayWriter Heredan de Reader. El buffer de caracteres que implementan estas clases sirven como flujo de entrada y salida de caracteres. InputStreamReader y OutputStreamWriter Actan como puente entre los flujos de bytes y los flujos de caracteres. Permiten leer o escribir los bytes y convertirlos en caracteres de acuerdo a la codificacin de caracteres especificada. FileReader y FileWriter Son subclases de InputStreamReader, y nos permiten leer o escribir convenientemente en los archivos de caracteres. FilterReader y FilterWriter Son clases abstractas que heredan de la clase Reader y Writer. Permiten leer o escribir flujos de caracteres filtrados. PushBackReader Es una subclase de FilterReader, y es una clase lectora de flujos de caracteres. Nos permite colocar los caracteres en el flujo. PipedReader y PipedWriter Son subclases de Reader y Writer. Se usan para encauzar los flujos de entrada y salida de caracteres. StringReader y StringWriter Son subclases de Reader y Writer. Permiten ller o escribir un flujo de caracteres. La fuente del flujo debe ser una cadena LineNumberReader Hereda de BufferedReader. Es un flujo de entrada de caracteres que se guarda en un buffer y permite llevar un registro de los nmeros de lneas. Identifica el fin de la lnea usando un cambio de lneas \n o un retorno de carro \r. PrintWriter Hereda de Writer. Permite imprimir en un flujo de salida de texto, las representaciones del objeto que se est formateando. PrintWriter implementa todas las versiones del mtodo print que estn disponibles en PrintStream. Esta clase no puede ser usada para bytes puros de datos (raw data).
Tabla 1. J erarqua de clases para Flujos de Caracter
La siguiente tabla explica la jerarqua de clases para los flujos de carcter:
COMPONENTE PROPSITO InputStream y OutputStream Son clases abstractas que permiten leer bytes de datos. FileInputStream y FileOutputStream Son subclases de InputStream y OutputStream, que leen o escriben contenido en un archivo en la forma de bytes. PipedI nputstream y PipedOutputStream Es una subclase de InputStream y OutputStream, lee o escribe bytes de datos a travs de una tubera de comunicacin y los PipedXXXStream son el extremo de envo o recepcin de la tubera. ByteArrayI nputStream y ByteArrayOutputStream Son subclases de InputStream y Outputstream, y posee un buffer interno que guarda los bytes que pueden ser ledos o escritos en el flujo. Tienen un contador interno que permite guardar un registro del siguiente byte a ser proporcionado para la lectura o escritura.
Curso de J ava Standard Edition J 2SE 73 COMPONENTE PROPSITO StringBufferInputStream Es una subclase de InputStream. Permite que una aplicacin cree un flujo en una cadena y lea su contenido en la forma de bytes. Esta clase solo usa los ocho bits bajos usados para representar un carcter. Est actualmente en desuso (deprecated). SequenceInputStream Es una subclase de InputStream. Representa la concatenacin lgica de otros flujos de entrada. Se inicia con una coleccin de flujos de entrada y lee el primer flujo hasta alcanzar el fin de la entrada, luego toma el siguiente flujo de entrada y as sucesivamente, hasta que alcanza el fin del ltimo flujo de entrada contenido. FilterInputStream y FilterOutputStream Son subclases de InputStream y OutputStream. Toman la data de algn otro flujo de entrada/salida y la manipula segn se requiera. DataInputStream y DataOutputstream Son subclases de FilterInputStream y FilterOutputStream. Permiten que una aplicacin lea o escriba los tipos de datos primitivos de J ava desde el flujo de entrada/salida asociado, independientemente del tipo de mquina. BufferedInputStream y BufferedOutputStream Son subclases de FilterInputStream y FilterOutputStream. Permiten a los flujos de entrada y salida almacenar en un buiffer los bytes de data ya ledos o escritos, con lo cual no necesita efectuar llamadas al sistema subyacente por cada byte, ledo o escrito. PushBackInputStream y PushBackOutputStream Ofrecen la funcionalidad para colocar nuevamente (unread) un byte especifico de dato de un flujo de entrada o salida. Es til cuando los bytes de data que son ledos o escritos estn delimitados por un byte especfico. El ltimo byte que es ledo o escrito ser regresado al flujo, de manera que la siguiente operacin leer o escribir nuevamente ese byte. LineNumberInputStream Es una subclase de FilterInputStream. Esta clase es un flujo de entrada filtrado con una funcionalidad adicional para guardar un registro del nmero de lnea actual. Identifica el fin de la lnea usando un cambio de lneas \n o un retorno de carro \r. PrintStream Es una subclase de FilterOutputStream, permite que otro flujo base de salida imprima convenientemente la representacin de varios tipos de valores de datos. ObjectInputStream y ObjectOutputStream Permiten la serializacin deserializacin de datos primitivos u objetos para ser ledos o escritos en un programa.
Tabla 2. J erarqua de clases para Flujos de Bytes
3 3. . F FL LU UJ J O OS S P PR RE ED DE EF FI I N NI I D DO OS S
En el paquete java.lang se encuentra la clase System que encapsula algunos aspectos del entorno de ejecucin. Esta clase tiene 3 variables de clase pblicas que estn asociadas con flujos:
- out: se refiere al flujo de salida estndar que, por omisin, es la consola (System.in) - in: se refiere a la entrada estndar que, por omisin, es el teclado (System.out) - err: se refiere al error estndar que, por omisin, tambin es la consola (System.err)
Curso de J ava Standard Edition J 2SE 74 4 4. . E EN NT TR RA AD DA A/ / S SA AL LI I D DA A P PO OR R C CO ON NS SO OL LA A
En J ava, la entrada por consola se efecta leyendo bytes de un flujo de entrada. Estos bytes se pueden leer en varios objetos, como pueden ser caracteres y cadenas. El mtodo de entrada de mas bajo nivel es read(). Este mtodo est definido en la clase InputStream. Cada vez que se llama al mtodo read() lee un nico byte del flujo de entrada y lo devuelve como un valor entero. El mtodo devuelve -1 cuando encuentra el final del flujo.
int read() throws IOException
El siguiente programa muestra el funcionamiento del mtodo read(), donde leen caracteres de la entrada estndar hasta que el usuario pulsa la letra s.
import java.io.*; public class LecturaPorConsolaCaracter { public static void main (String args[]) throws IOException { char caract; System.out.println(Introduzca caracteres, s para salir: ); do { caract = (char) System.in.read( ); System.out.println (caract); } while (caract != s); } }
System.in es, por omisin, un flujo con bfer, es decir, no se pasa ninguna entrada al programa hasta que se pulsa la tecla ENTER. Esto hace que el mtodo read() no sea muy til para entradas por consola interactivas, ya que una de las acciones de entrada ms comunes que realiza un programa es la lectura de una cadena completa del teclado y el mtodo read() solo permite leer carcter por carcter. Para facilitar la lectura por consola de una cadena entera con una sola instruccin se utiliza el mtodo readLine() de la clase BufferedReader. Este mtodo lee todos los caracteres hasta encontrar \n o \r y devuelve un String (sin incluir estos caracteres).
final String readLine() throws IOException
El siguiente programa muestra el funcionamiento del mtodo readLine(), donde lee una cadena de caracteres de la entrada estndar.
import java.io.*; public class LecturaPorConsolaCadena { public static void main (String args[]) throws IOException { String str; BufferedReader br = new BufferedReader (new InputStreamReader(System.in)); System.out.println (Escriba una cadena de caracteres sin espacio y presione ENTER.); s = br.readLine (); System.out.println (Ud. escribi: + str); } }
Curso de J ava Standard Edition J 2SE 75 En J ava, la salida por consola se realiza con la ayuda de los mtodos print () y println() que estn definidos en la clase PrintStream que es el tipo del objeto referenciado por System.out. los mtodos print() y println(), permiten escribir por consola cualquier tipo de datos simple, ya que estn sobrecargados para ello. Como la clase PrintStream es un flujo de salida derivado de OutputStream, tambin implementa el mtodo de bajo nivel write ().
void write(int valorByte)
El siguiente programa utiliza el mtodo write() para imprimir el carcter A seguido de un carcter de lnea nueva.
public class Escribir { public static void main(String args[]) { int a = new Integer(20); Double dou = 15.5; String cad = new String(El valor de pi es: ); System.out.write (a); System.out.print (Un valor double es + dou + \n); System.out.println (cad + Math.pi) } } Cuando los mtodos print () o println () son invocados y se les pasa por parmetro un Object, automticamente se imprime el resultado de ejecutar el mtodo toString() de la clase a la que pertenece el parmetro referenciado.
5 5. . F FL LU UJ J O OS S D DE E A AR RC CH HI I V VO OS S
Para utilizar los archivos en J ava, se pueden emplear tanto los flujos de carcter como los flujos de byte y ambos funcionan de manera similar, slo varan en la forma como el lenguaje se comunica con el dispositivo fsico internamente. Para comprender esto, hay que tener en cuenta que los archivos para J ava solo son secuencias de bytes, denominados archivos secuenciales; razn por la cual no hace diferencia si el archivo es de texto o es un archivo estructurado. Por otro lado tambin existen los archivos de acceso aleatorio que son tratados de forma diferente.
5 5. .1 1. . A AR RC CH HI I V VO OS S S SE EC CU UE EN NC CI I A AL LE ES S
Las clases FileReader y FileWriter crean flujos de caracteres asociados a los archivos secuenciales. Mientras que las las clases FileInputStream y FileOutputStream crean flujos de bytes asociados a los archivos. Para abrir un archivo, simplemente es necesario crear un objeto de estas clases, especificando el nombre del archivo en el constructor. Para cerrar el archivo, se invoca al mtodo close(), definido en todas las clases. o FileReader(String rutaArchivo) throws FileNotFoundException // Abrir para Lectura o FileInputStream(String rutaArchivo) throws FileNotFoundException // Abrir para Lectura o FileWriter(String rutaArchivo) throws IOException // Abrir para escritura o FileOutputStream(String rutaArchivo) throws IOException // Abrir para Escritura Curso de J ava Standard Edition J 2SE 76 El siguiente programa utiliza el mtodo read() de la clase FileReader y FileInputStream para leer y mostrar el contenido de un archivo.
import java.io.*; public class LeerArchivoSecuencial{ public static void main(String args []) { try { FileReader fr = null; try { fr = new FileReader(ArchivoTexto.txt); } catch (FileNotFoundException e) { System.out.println(Archivo no encontrado); } int caract = fr.read(); while (caract != -1) { System.out.println((char)caract); caract = fr.read(); } fr.close(); } catch(IOException ioe) { ioe.printStackTrace(); } } } import java.io.*; public class LeerArchivoSecuencial { public static void main(String args []) { try { FileInputStream fis = null; try { fis=new FileI nputStream (Archivo.dat); } catch (FileNotFoundException fnf) { System.out.println(Archivo no encontrado); } int num = fis.read(); while (num != -1) { System.out.println(num); num = fis.read(); } fis.close(); } catch(IOException ioe) { ioe.printStackTrace(); } } }
El siguiente programa utiliza el mtodo write() de la clase FileWriter y FileOutputStream para escribir una serie de bytes en un archivo.
import java.io.*; public class EscribirArchivoSecuencial{ public static void main(String args[]) { try { FileWriter fw=null; try { fw= new FileWriter(ArchivoTexto.txt); } catch (IOException ioe) { System.out.println(Error al abrir el archivo para salida); } for (int i=0;i<10;i++) fw.write(Nmero + i + .); fw.close(); } catch(IOException ioe){ System.out.println(Error al tratar el archivo para salida: + ioe.getMessage ()); } } } import java.io.*; public class EscribirArchivoSecuencial { public static void main(String args[]) { try { FileOutputStream fos=null; try { fos = new FileOutputStream(Archivo.dat); } catch (IOException ioe) { System.out.println(Error al abrir el archivo para salida); } for (int i=0;i<10;i++) fos.write(i); fos.close(); } catch(IOException ioe){ System.out.println(Error al tratar el archivo para salida: + ioe.getMessage ()); } } }
Curso de J ava Standard Edition J 2SE 77 5 5. .2 2. . A AR RC CH HI I V VO OS S D DE E A AC CC CE ES SO O A AL LE EA AT TO OR RI I O O
El paquete java.io declara una clase RandomAccessFile, que sirve para leer o escribir en archivos de forma aleatoria. Los argumentos de la clase instanciada deciden si el objeto ser utilizado para leer o escribir. Para abrir un archivo, simplemente es necesario crear un objeto de sta clases, especificando el nombre del archivo en el constructor y el modo de apertura. - RandomAccessFile(String rutaArchivo, r) // Abrir para Lectura - RandomAccessFile(String rutaArchivo, rw) // Abrir para Lecto-Escritura
RandomAccessFile soporta el concepto de un puntero de archivo para indicar la ubicacin actual en el archivo. En el momento de creacin del archivo, el puntero de archivo se establece en 0, indicando el inicio del archivo. Luego el nmero de bytes que son ledos o escritos mueve el puntero de archivo. RandomAccessFile dispone de los siguientes mtodos para manipular el puntero de archivo:
- int skipBytes(int nroBytes): Mueve el puntero de archivo hacia delante el nmero de bytes especificado.
- void seek(long pos): Posiciona el puntero de archivo antes del byte especificado.
- long getFilePointer(): Permite obtener la ubicacin actual del puntero de archivo.
En caso de que el fin de archivo se alcance antes de leer el nmero de bytes especificado, entonces se lanza una EOFExcepcion y en caso de no leer o escribir un byte, entonces se lanza una IOExcepcion.
El siguiente programa ejemplifica el uso de la clase RandomAccessFile para leer y mostrar el contenido de un archivo.
import java.io.*; public class LeerArchivoAleatorio { public static void main(String args []) { try { RandomAccessFile ra = null; try { ra = new RandomAccessFile(Archivo.dat,r); } catch (FileNotFoundException e) { System.out.println(Archivo no encontrado); } for(int i=0;i<ra.length();i++){ ra.seek(i); System.out.println(ra.readInt()); } ra.close(); } catch(I OException ioe) { ioe.printStackTrace(); } } } import java.io.*; public class EscribirArchivoAleatorio { public static void main(String args []) { try { RandomAccessFile ra = null; try { ra = new RandomAccessFile(Archivo.dat,rw); } catch (FileNotFoundException fnf) { System.out.println(Archivo no encontrado); } for(int i=0;i<10;i++) { seek(i); ra.writeInt(i); } fis.close(); } catch(I OException ioe) { ioe.printStackTrace(); } } }
Curso de J ava Standard Edition J 2SE 78 6 6. . S SE ER RI I A AL LI I Z ZA AC CI I N N D DE E O OB BJ J E ET TO OS S
La serializacin de objetos es el proceso por el cual el estado de un objeto es transformado en un flujo de bytes. Se aplica en RMI (comunicacin entre objetos va conectores de red) y persistencia ligera (forma de guardar slo el estado del objeto).
Para escribir una clase cuyos objetos sean serializables en J ava, la clase tiene que implementar la interfaz java.io.Serializable. Serializable es una interfaz sin mtodos que permite identificar la semntica de la serializacin.
interface Serializable { }
El proceso de escribir o almacenar el estado de un objeto se conoce como serializacin. El proceso de leer o recuperar el estado de un objeto se conoce como deserializacin.
La clase del objeto, la firma de la clase y los valores de los campos no transient y no static de un objeto se escriben mediante el mecanismo de serializacin por omisin. Cualquier referencia a otros objetos en campos no transient y no static causara que los objetos referenciados se escriban.
El siguiente programa permite almacenar objetos en un archivo.
import java.io.*; public class Serializar { public static void main(String args[]) { FileOutputStream fos = new FileOutputStream(c:\Ejemplo.dat); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeInt(1243); // Escribe un objeto de Integer oos.writeObject(Ejemplo); // Escribe cualquier tipo Object oos.close(); fos.close(); } }
El siguiente programa muestra como son recuperados (deserializacin) los objetos escritos en el archivo ejemplo.dat:
import java.io.*; public class Deserializar { public static void main(String args[]) { FileInputStream fis = new FileInputStream(c:\Ejemplo.dat); ObjectInputStream ois = new ObjectInputStream(fis); System.out.println(ois.readInt); System.out.println((String)ois.readObject()); ois.close(); fis.close(); } }
Si una superclase de una clase no es serializable, entonces la subclase puede tomar la responsabilidad de encargarse de serializar las variables public, protected, y friendly (cuando es accesible) de la superclase y restaurarlos. Esto es posible cuando la superclase tiene un constructor que no toma ningn parmetro para inicializar su estado y es accesible a subclase. Durante la Curso de J ava Standard Edition J 2SE 79 deserializacin, los campos de la superclase son inicializados usando este constructor. Los campos de la subclase serializable son recuperados de ObjectInputStream.
La interfaz java.io.Externalizable extiende de Serializable. No tiene comportamientos automticos, todo esta en manos del programador.
interface Externalizable extends Serializable { public void writeExternal(ObjectInput) public void readExternal(ObjectOutput) }
Al transformarse un objeto, el mtodo writeExternal() es responsable de todo lo que se hace. Slo se guardar lo que se indique dentro de este mtodo.
El mtodo readExternal() debe ser capaz de recuperar lo guardado por writeExternal(). La lectura debe ser en el mismo orden que la escritura. Es importante saber que antes de llamar a este mtodo se llama al constructor de la clase.
Curso de J ava Standard Edition J 2SE 80 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . TEMA VI : Tecnol og a de Acceso a Dat os
OBJ ETI VOS: Describir las tecnologas de acceso a bases de datos de J ava. Escribir programas en J ava que sean capaces de interactuar con una base de datos.
CONTENIDO: Manejo de Base de Datos en J ava La API J DBC Acceso a base de datos Clases de soporte J DBC
80 Curso de J ava Standard Edition J 2SE 81 Hasta los momentos hemos visto como hace J ava para crear objetos, para implementar el principio de Herencia, el concepto de clases abstractas e interfaces. Aprendimos sobre paquetes y sobre el manejo de excepciones. Adems, entendimos el simple pero poderoso mecanismo para manejar las entradas y salidas. En este tema, veremos como la informacin guardada en una base de datos puede ser recuperada a travs de un programa en J ava, y aprender a escribir informacin en una base de datos desde un programa hecho en J ava.
1 1. . M MA AN NE EJ J O O D DE E B BA AS SE ES S D DE E D DA AT TO OS S E EN N J J A AV VA A
Tradicionalmente en la programacin para Bases de Datos, las aplicaciones se enfrentan a docenas de manejadores de bases de datos disponibles, y cada uno de ellos se comunica con tu aplicacin en su propio lenguaje. Si la aplicacin necesita comunicarse con un nuevo motor de bases de datos, entonces se tiene que aprender una nueva forma de comunicacin. Para los programadores J ava, sin embargo, esto no representa un problema, ya que J ava brinda la capacidad de escribir una vez, compilar una vez y correr donde sea, lo que implica que la programacin para bases de datos sea bastante sencilla.
En la actualidad, se emplean, principalmente tres tipos de bases de datos: Bases de Datos relacionales, Bases de Datos relacional-objeto, Bases de Datos orientadas a objetos. J ava proporciona conectividad a todos los tipos de Bases de Datos, a travs de su Conectividad a Bases de Datos J ava (J ava Data Base Connectivity - J DBC) API.
Ya que no se puede definir un denominador comn para el almacenamiento y acceso de datos entre los tipos de bases de datos, la especificacin J DBC autoriza requerimientos no especficos en el DBMS (Data Base Management System) subyacente. En lugar de colocar requerimientos de cmo se debe implementar el DBMS para poderlo usar (ODBC), la especificacin J DBC de J ava, coloca todos sus requerimientos en la implementacin especfica del mismo.
Al escribir programas en J ava que se comuniquen con una base de datos, se requiere:
o Una base de datos (relacional, orientada a objetos, etc.). o Interfaz J ava (a travs de API J DBC). o Simple conocimiento de sentencias SQL.
2 2. . P PA AS SO OS S I I N NV VO OL LU UC CR RA AD DO OS S E EN N E EL L A AC CC CE ES SO O A A B BA AS SE ES S D DE E D DA AT TO OS S
Cuando hablamos de acceso a una base de datos, las siguientes operaciones son las ms importantes a travs de un programa J ava: el programa debe ser capaz de leer desde una base de datos y el programa debe ser capaz de escribir informacin a una base de datos.
En J ava, hay una serie de pasos para acceder la informacin que se encuentra en una base de datos y estos son:
- Se debe cargar en la memoria un controlador que habilitar la conexin entre el programa J ava y el sistema de base de datos (DBMS). - A travs de este controlador, se debe establecer una conexin a la base de datos. - Una vez establecida la conexin y usndola, se pueden ejecutar las sentencias SQL. - Finalmente, se debe cerrar la conexin.
Escribir programas en J ava que se conecten con una base de datos y trabajen, es tan simple como implementar estos cuatro pasos.
Curso de J ava Standard Edition J 2SE 82 3 3. . E EL L A AP PI I J J D DB BC C
El API de J DBC proporciona una forma universal para acceder a datos desde el lenguaje de programacin de J ava. Usando el API J DBC, usted puede acceder virtualmente cualquier fuente de datos, desde las bases de datos relacional a las hojas de clculo y archivos planos. La tecnologa de J DBC tambin proporciona una base comn sobre la cual pueden construirse herramientas e interfaces.
Para trabajar con las empresas lderes en el campo de las bases de datos, Sun Microsystems, desarroll una sencilla API para acceso a bases de datos J DBC. En el proceso de desarrollo, se establecieron tres puntos principales:
- J DBC debe ser una API que soporte SQL. - J DBC debe construirse sobre la experiencia de trabajar con otras API para bases de datos. - El trabajo con J DBC debe ser sencillo.
J DBC es un API que soporta SQL, debido a que permite construir sentencias SQL embebidas dentro de las llamadas a la API J DBC de J ava. J DBC permite comunicar sin problemas el mundo de los manejadores de bases de datos con el de la programacin J ava, ya que se construy en base las experiencias anteriores en el manejo de bases de datos, como por ejemplo el uso de la tecnologa ODBC de Microsoft. Y finalmente, el trabajar con J DBC se hace sencillo, porque consiste bsicamente en hacer uso de funciones predefinidas y que se comportan igual para cualquier manejador de base de datos.
3 3. .1 1. . L LA A E ES ST TR RU UC CT TU UR RA A D DE E J J D DB BC C
J DBC logra establecer, para las interfaces J ava, implementaciones diferentes para cada manejador. El grupo de clases, que implementan las interfaces J DBC para un motor de base de datos particular es llamado un Driver J DBC. En la elaboracin de una aplicacin de bases de datos, no interesa conocer como estn implementadas estas clases, ya que J DBC oculta la implementacin especfica para cada base de datos, y solo se deben emplear los mtodos definidos en las diferentes interfaces J DBC.
Grfico 1. La arquitectura J DBC
La arquitectura J DBC, establece que una aplicacin J ava trabaja con cualquier bases de datos, empleando los mtodos definidos en las interfaces J DBC las cuales son especficas para cada manejador.
Curso de J ava Standard Edition J 2SE 83
Grfico 2. Driver J DBC
La figura anterior, muestra como una aplicacin usa J DBC para comunicarse con una o ms bases de datos sin conocer los detalles concernientes a la implementacin de Driver especfico para dicha base de datos.
3 3. .2 2. . C CL LA AS SE ES S E E I I N NT TE ER RF FA AC CE ES S B B S SI I C CA AS S D DE E J J D DB BC C
El API J DBC se encuentra en dos paquetes:
- El paquete de java.sql, contiene las funcionalidades del lado cliente. - El paquete javax.sql, agrega las capacidades del lado de servidor.
En esta API, existen clases e interfaces bsicas que se encuentran en cualquier programacin de base de datos que involucre J DBC y estas son:
Grfico 3. J erarqua de clases J DBC La relacin que existe entre las clases e interfaces del API J DBC, est en que: - El DriverManager es usado por la aplicacin para obtener conexiones a la base de datos, ya que ste carga el controlador requerido directamente. - Internamente la interfaz Driver crea las conexiones. Curso de J ava Standard Edition J 2SE 84 - La aplicacin usa el objeto Connection para obtener objetos Statement y ejecutar sentencias SQL. - El resultado de las sentencias, es decir de los objetos Statement se reciben en la aplicacin mediante los objetos ResultSet. - Los datos del objeto ResultSet son utilizados en la aplicacin. - El objeto Connection agrega al objeto DatabaseMetaData. - El DatabaseMetaData, tiene la informacin acerca de la base de datos para un determinado objeto Connection. - El objeto ResultSet agrega al objeto ResultSetMetaData. - El ResultSetMetaData, tiene la informacin acerca de los datos que contiene un ResultSet. - El PreparedStatement hereda de Statement, y representa una extensin a la funcionalidad que poseen los objetos Statement. - El CallableStatement hereda de PreparedStatement, y esta permite hacer invocaciones a Procedimientos almacenados en la base de datos.
Todas las clases con acceso a Base de Datos en la API J DBC, lanzan SQLException, la cual necesita ser capturada y manejada.
4 4. . A AC CC CE ES SO O A A B BA AS SE ES S D DE E D DA AT TO OS S
Como hemos visto, en el trabajo con bases de datos en J ava existen cuatro pasos bsicos: cargar el controlador, realizar la conexin, realizar las peticiones sobre la base de datos y por ltimo se debe cerrar la conexin. Ahora, veremos como hacer cada una de estas tareas.
4 4. .1 1. . C CA AR RG GA AR R E EL L D DR RI I V VE ER R
Los fabricantes de sistemas de bases de datos proveen sus propios controladores para poder conectarse con la base de datos. Para cargar el controlador, necesitamos usar el mtodo forName especificado en la clase Class con el nombre del controlador como argumento. Los objetos de la clase Class son construidos automticamente por la J VM cuando se cargan las clases. Para cargar un controlador de base de datos, incluimos la siguiente sentencia antes de hacer cualquier acceso a la base de datos.
Class.forName(nombre del controlador);
El nombre del controlador es especfico a cada base de datos. Veamos como cargar el controlador para diversos manejadores de bases de datos:
- Microsoft Access y SQL Server: Class.forName(sun.jdbc.odbc.J dbcOdbcDriver); - IBM DB2 Universal DataBase: Class.forName(com.ibm.db2.J dbc.net.DB2Driver); - MySQL: Class.forName(com.mysql.jdbc.Driver);
Al invocar a Class.forName, automticamente se crea una instancia de la clase Driver y la registra con DriverManager. No se est creando una instancia explcita del controlador, sino que una vez que el controlador est cargado, este estar disponible para hacer la conexin a un DBMS. Cuando el Driver indicado en el mtodo forName() es invlido se arroja la excepcin ClassNotFoundExcepcion.
Curso de J ava Standard Edition J 2SE 85 4 4. .2 2. . R RE EA AL LI I Z ZA AR R L LA A C CO ON NE EX XI I N N
Las aplicaciones usan la clase DriverManager para establecer la conexin con el DBMS. La clase DriverManager es responsable de buscar o rastrear las diferentes implementaciones J DBC que pueden existir en un sistema. La aplicacin requiere que DriverManager le d una conexin de base de datos.
La clase DriverManager provee un mtodo llamado getConnection(), el cual tiene tres argumentos: - Un URL de base de datos. - Identificacin del usuario. - Clave de usuario.
Un URL de base de datos es un simple Localizador Uniforme de Recursos (Uniform Resources Locator) estndar de Internet. El URL consiste de tres partes, separadas por dos puntos:
protocol:<subprotocol>:<subname>
La fuente de datos de J DBC es el protocol. El subprotocol es especfico a una implementacin J DBC. Normalmente contiene el nombre del DBMS y la versin. El subname es especfico al DBMS y le dice al controlador a dnde necesita conectarse la aplicacin, es decir representa un DSN (Nombre de la Fuente de Datos - Data Source Name) de la base de datos. Por ejemplo:
jdbc:odbc:Sample donde,
- jdbc, es el protocol - odbc, es el subprotocol - Sample, es el subname
Ahora veamos como conectarnos a los manejadores de bases de datos:
Microsoft SQL Server Class.forName(sun.jdbc.odbc.J dbcOdbcDriver); Connection conn; String databaseURL = jdbc:odbc:Sample; conn = DriverManager.getConnection(databaseURL,user1,xyz);
IBM DB2 Universal DataBase Class.forName(com.ibm.db2.jdbc.net.DB2Driver); Connection conn; String databaseURL = jdbc:db2://Sample:8000; String user = admin; Curso de J ava Standard Edition J 2SE 86 String password = sql; conn = DriverManager.getConnection(databaseURL,user,password);
MySQL Server Class.forName(com.mysql.jdbc.Driver); Connection conn; String databaseURL = "jdbc:mysql://localhost:3306/test; String user = root; String password = sql; conn = DriverManager.getConnection(databaseURL,user,password);
Un objeto Connection es una simple sesin de base de datos. Podemos tener cualquier nmero de objetos Connection en un programa.
4 4. .3 3. . E EJ J E EC CU UT TA AR R P PE ET TI I C CI I O ON NE ES S
Habiendo establecido una conexin a base de datos, usando el mtodo getConnecticon() de la clase DriverManager, se est en posicin de ejecutar peticiones sobre esa base de datos. Dichas peticiones, se refieren a ejecutar sentencias SQL sobre la base de datos, bien sean sentencias:
Para ejecutar las sentencias SQL mencionadas anteriormente es necesario hacer uso de objetos Statement, PreparedStatement y ResultSet.
- Objetos Statement: La interfaz Statement provee mtodos para hacer llamadas a las sentencias SQL. En este caso, es indiferente a que DBMS est conectado los mtodos funcionan igual para todos, ya que una simple interfaz es provista por el J DBC para acceder a la informacin de cualquier base de datos.
La interfaz Statement provee los mtodos: o excecuteUpdate(): para ejecutar sentencias DML. Este mtodo retorna el nmero de filas afectadas por la sentencia ejecutada, bien sea INSERT, UPDATE o DELETE. o executeQuery(): para ejecutar sentencias DQL. Este mtodo devuelve los resultados (filas) para las sentencias SELECT.
Para ejecutar sentencias SQL, primero se declara un objeto Satatement y a travs del objeto Connection creamos una sentencia usando el mtodo createStatement(). Class.forName(sun.jdbc.odbc.J dbcOdbcDriver); Connection conn; String databaseURL = jdbc:odbc:Sample; conn = DriverManager.getConnection(databaseURL,user1,xyz); Statement sentencia = null; int filas = 0; sentencia = conn.createStatement(); nro= sentencia.executeUpdate(INSERT INTO Tab VALUES(Enero,10)); Curso de J ava Standard Edition J 2SE 87 - Objetos PreparedStatement: La especificacin J DBC provee una clase adicional, derivada de la clase Statement para facilitar al programador la realizacin de programas sotisficados de base de datos.
Observemos el siguiente fragmento de cdigo:
//Cdigo para conectarse a la base de datos Statement sentencia = null; int nro = 0; String mes = ENERO; int dia = 10; sentencia = conn.createStatement(); nro= sentencia.executeUpdate(INSERT INTO Tabla VALUES( + mes+ , + dia + ));
Podemos ver que, en la sentencia SQL se han empleado variables en lugar de constantes como valores; de igual forma, tambin se pueden colocar expresiones dentro de una sentencia que va a ser ejecutada por un objeto Statement.
nro= sentencia.executeUpdate(INSERT INTO Tabla VALUES( + mes+ , + dia + ));
El API J DBC de J ava, permite crear una sentencia SQL una sola vez y aplicarla cada que queramos ejecutarla. La clase PreparedStatement, permite construir las sentencias SQL requeridas una vez y ejecutarlas cualquier nmero de veces en la aplicacin. Un PreparedStatement es una llamada a una base de datos precompilada que requiere que los parmetros sean definidos.
Cuando se crea un PreparedStatement, la sentencia SQL es dada como argumento. La sentencia SQL debe ser enviada al DBMS inmediatamente donde es compilada una vez. De este modo, el objeto PreparedStatement contiene una sentencia SQL precompilada, lo que lo diferencia de los objetos Statement, en los que la sentencia se compila cada vez que se ejecuta. En los PrepareStatement, los valores de la sentencia SQL se dan cada vez que la aplicamos y siempre podrn tener valores diferentes.
Para ejecutar sentencias SQL usando el objeto Statement cada vez, damos el nombre de la columna y los valores. Cuando usamos el objeto PreparedStatement no podemos especificar los valores cuando se crea el objeto, ya que en el momento de construccin de la sentencia los valores no sern conocidos. Slo proveemos los poseedores de lugares usando el smbolo ? y despus se substituir cada smbolo con el valor deseado.
Veamos el siguiente fragmento de cdigo para entender como funcionan los PreparedStatement.
//Cdigo para conectarse a la base de datos PreparedStatement sentencia = null; String SQL = INSERT INTO Tab (mesFecha, diaFecha) VALUES (?,?); String mes = FEBRERO; int dia = 20; sentencia = conn.prepareStatement(SQL); sentencia.setString(1 , mes); Curso de J ava Standard Edition J 2SE 88 sentencia.setInt(2 , dia); sentencia.execute();
Usamos el mtodo prepareStatement() en lugar de createStatement(). En el fragmento anterior, la sentencia SQL INSERT es el argumento del mtodo prepareStatement(). Las nicas diferencias notables aqu son los smbolos ?, que representan los parmetros de entrada, en lugar de los valores reales. Los valores reales se dan cuando se ejecuta la sentencia SQL. Los mtodos setXXX() de la clase PreparedStatement enlazan los parmetros de entrada con los valores. De esta manera FEBREROser colocado en mesFecha y 20 guardado en diaFecha. Es de hacer notar que en este caso se ejecuta el mtodo execute(), en vez de excecuteUpdate(); pero si se tratase de una sentencia SELECT se ejecutara igualmente el mtodo executeQuery().
La principal diferencia entre crear un objeto Satatement y objeto PrepareStatement est en la forma como se aplican las sentencias SQL.
- Objetos ResultSet: El objeto Statement, como vimos anteriormente, tambin puede retornar los resultados de una sentencia DQL (SELECT). El mtodo de Statement, excecuteQuery() retorna los resultados de una sentencia SELECT. La sentencia puede retornar una o ms filas, las cuales se capturan en un ResultSet.
Como el mtodo executeQuery(), puede devolver varias filas, puede ser necesario desplazarnos dentro de ese conjunto de filas. Para ello, emplearemos el mtodo next() provisto en la clase ResultSet. Este mtodo nos permite iterar a travs del ResultSet. Dicho mtodo retorna true, si existe un registro activo o false en caso contrario. Ees de hacer notar que para obtener la primera fila del ResultSet, es necesario emplear el mtodo next() ya que el mismo no est posicionado en ningn registro cuando se obtienen los datos.
while(resultados.next()) System.out.println(\n Deslazndose en el cursor); System.out.println(\n No hay ms datos en el cursor);
En el uso anterior del objeto ResultSet no se ha recuperado ninguna informacin de las filas resultado, solo nos desplazamos por ellas. Para recuperar la informacin de las filas, se utilizan los mtodos getXXX() de la clase ResultSet. Cada campo de informacin disponible en una fila es de algn tipo de dato. Necesitaremos hacer una correspondencia entre los tipos de datos del DBMS con los mtodos getXXX(). Hay un nmero de mtodos getXXX disponibles en la clase ResultSet, algunos de los ms comunes son:
o getInt(), getShort(), getLong(), getFloat(), getByte() o getString(), getDate(), getTime() Curso de J ava Standard Edition J 2SE 89
Todos son mtodos sobrecargados que aceptan un entero o una cadena como argumento. El argumento entero es el nmero de la columna en la sentencia y el argumento de cadena es el nombre de la columna dada en la tabla. Cuando se especifica un nmero de columna como argumento, se hace corresponder en el mismo orden como las columnas fueron especificadas en la sentencia SELECT.
- Soporte de Cursores: El API J DBC provee soporte limitado de cursores (ResultSet). Permite que una aplicacin obtenga un cursor asociado con el resultado de un Query a travs del mtodo executeQuery(); pero el movimiento del cursor ocurre, por omisin, slo con direccin hacia delante. Por lo que, es necesario activar la navegabilidad del cursor.
Para que un ResultSet sea scrollable (navegable), hay que pasarle dos argumentos, bien sea al createStatement() o al mtodo prepareStatement(). Los argumentos a pasar son:
o Tipo de resultado: El tipo de resultado, puede ser cualquiera de las variables de clase definidas en ResultSet:
M M T TO OD DO O D DE ES SC CR RI I P PC CI I N N TYPE_FORWARD_ONLY El cursor se puede mover solo hacia delante. TYPE_SCROLL_INSENSITIVE El objeto ResultSet es navegable, pero no sensitivo para hacer cambios por otros. TYPE_SCROLL_SENSITIVE El objeto ResultSet es navegable, pero sensitivo a hacer cambios por otros. Tabla 1. Tipos de resultado
o Concurrencia de resultado: La concurrencia de resultado, puede ser cualquiera de las variables de clase definidas en ResultSet:
T TI I P PO O S SI I G GN NI I F FI I C CA AD DO O CONCUR_READ_ONLY El objeto ResultSet no puede ser actualizado CONCUR_UPDATABLE El ResultSet puede ser actualizado. Tabla 2. Concurrencia de resultado
Una vez que el objeto ResultSet se hace scrollable, entonces el cursor se puede mover y apunta a filas especficas, donde se puede actualizar, borrar, etc. Algunos de los mtodos disponibles en ResultSet para el movimiento del cursor se listan a continuacin:
Curso de J ava Standard Edition J 2SE 90 M M T TO OD DO O R RE ET TO OR RN NO O D DE ES SC CR RI I P PC CI I N N next() boolean Para moverse a la siguiente fila del resultado previous() boolean Para moverse a la fila anterior first() boolean Para moverse a la primera fila del ResultSet last() boolean Para moverse a la ltima fila del ResultSet getRow() int Retorna el nmero de la fila actual Absolute(int row) boolean Ir a una fila especifica del ResultSet insertRow() void Inserta una fila en el Objeto ResultSet y en la base de datos. deleteRow(int row) void Elimina una fila del ResultSet. Tabla 3. Mtodos para ResultSet scrollable
resultados.last(); System.out.println(\n ltima fila); resultados.first(); System.out.println(\n Primera fila); resultados.next(); System.out.println(\n Segunda fila); resultados.previous(); System.out.println(\n Primera fila); System.out.println(\n La fila actual en el cursor es: + resultados.getRow());
La informacin de las filas de un ResultSet, pueden ser actualizadas utilizando los mtodos updateXXX() de la clase ResultSet., donde XXX corresponde a un tipo de dato presente el DBMS. Algunos de los mtodos updateXXX ms comunes son:
o updateInt(columna, int dato), updateShort(columna, short dato) o updateLong(columna, long dato), updateFloat(columna, float dato) o updateByte(columna, byte dato), updateString(columna, String dato) o updateDate(columna, Date dato), updateTime(columna, Time dato)
Todos son mtodos que trabajan sobre la fila actual. Estos mtodos estn sobrecargados y aceptan un entero o una cadena como argumento para representar la columna. Si el argumento es entero, indica el nmero de la columna en la sentencia, pero si el argumento es cadena, representa el nombre de la columna dada en la tabla.
4 4. .4 4. . C CE ER RR RA AR R L LA A C CO ON NE EX XI I N N
Como hemos visto la conexin a la base de datos se hace a travs de la clase DriverManager, la cual le da a la aplicacin un objeto Connection que representa la conexin. De ese objeto Connection, se pueden obtener muchos objetos Statement y ResultSet para manipular la informacin de la base de datos.
Al terminar de trabajar con una base de datos, es buena prctica de programacin cerrar los objetos Connection, Statement y ResultSet que se tengan asociados a la misma, para de esta manera liberar Curso de J ava Standard Edition J 2SE 91 el recurso. Cuando se cierra un objeto Connection, los objetos Statement y ResultSet dependientes de ste, tambin se cierran automticamente. Esto se realiza a travs del mtodo close.
res.close(); // Donde res es un objeto ResultSet stmt.close(); // Donde stmt es un objeto Statement o PrepareStatement Conn.close(); // Donde Conn es un objeto Connection
5 5. . C CL LA AS SE ES S D DE E S SO OP PO OR RT TE E J J D DB BC C
Existen otras clases e interfaces de soporte provistas por J DBC para ayudar a la funcionalidad del API J DBC. Todas estas clases se definen en el paquete java.sql.
5 5. .1 1. . S SQ QL LE EX XC CE EP PT TI I O ON N Extiende de la clase java.lang.Exception, esta clase provee ms informacin relacionada a errores de la base de datos. Usamos esta clase ampliamente en todos los programas J ava que utilicen J DBC. Esta clase incluye informacin acerca de:
- La cadena SQLState, que describe el error ocurrido. - El cdigo de error especfico del proveedor de base de datos, que es normalmente un nmero que puede ser encontrado en la documentacin de la base de datos.
Esta excepcin debe ser obligatoriamente capturada y manejada por todo programa que emplee las funcionalidades de la API J DBC de J ava.
5 5. .2 2. . D DA AT TE E, , T TI I M ME E, , T TI I M ME ES ST TA AM MP P
Todas estas clases heredan de la clase java.util.Date. Ellas extienden para proveer niveles de granularidad a la informacin ya existente en la clase Date. Son necesarias para proveer compatibilidad con los campos tipo fecha de los manejadores de bases de datos. 5 5. .3 3. . T TY YP PE ES S
La clase java.sql.Types, define constantes para identificar tipos genricos SQL, llamados tipos J DBC. Esta es una clase abstracta. LA misma no aade funcionalidades a los mtodos ya definidos en la clase Object. Algunas variables de clase, que esta clase contiene son:
- ARRAY - BIT - BINARY - CHAR - CLOB - DATE - INTEGER - NUMERIC - REAL - VARCHAR
Curso de J ava Standard Edition J 2SE 92 6 6. . E EJ J E EM MP PL LO O C CO OM MP PL LE ET TO O D DE E U UN N P PR RO OG GR RA AM MA A C CO ON N J J D DB BC C
El siguiente es un programa que ilustra como es el proceso de acceso a Bases de Datos utilizando la API J DBC. Este programa se conecta con una base de datos en MySQL.
/** * Programa Base de Datos * @date: 26/09/2005 * @author: Ronel J . Rivas R. */
package database;
import java.io.*; import java.sql.*;
public class J ExampleDB { Connection conn; Statement stmt; PreparedStatement prep; ResultSet res;
public J ExampleDB() { super(); } public void cerrarConexion() throws SQLException { conn.close(); } public void consultarTabla() throws SQLException { // Crear la sentencia SQL stmt = conn.createStatement(); String SQL = "SELECT * FROM Ejemplo"; res = stmt.executeQuery(SQL); // Mostrar el resultado por pantalla while (res.next()) { System.out.print(res.getInt(1)+" - "); System.out.println(res.getString("mes")); } // Liberar los recursos res.close(); stmt.close(); } public void crearConexion(String URL, String user, String passw) throws SQLException { conn = DriverManager.getConnection(URL, user, passw); }
Curso de J ava Standard Edition J 2SE 93 public int crearTabla() throws SQLException { // Crear la sentencia SQL stmt = conn.createStatement(); String SQL = "CREATE TABLE Ejemplo (DIA INTEGER CONSTRAINT clave PRIMARY KEY, MES TEXT)"; int nro = stmt.executeUpdate(SQL); // Liberar el recurso stmt.close(); return nro; } public int insertarStatement(int miDia, String miMes) throws SQLException { // Crear la sentencia SQL stmt = conn.createStatement(); String SQL = "INSERT INTO Ejemplo VALUES(" + String.valueOf(miDia) + ",'" + miMes + "')"; int nro = stmt.executeUpdate(SQL); // Liberar el recurso stmt.close(); return nro; } public int insertarPreparedStatement(int miDia, String miMes) throws SQLException { // Preparar la sentencia SQL String SQL = "INSERT INTO Ejemplo (dia,mes) VALUES(?,?)"; prep = conn.prepareStatement(SQL); prep.setInt(1, miDia); prep.setString(2, miMes); // Ejecutar la sentencia int nro = prep.executeUpdate(); // Liberar los recursos prep.close(); return nro; } public static void main(java.lang.String[] args) { J ExampleDB appDB = new J ExampleDB(); try { // (1) Cargar el driver para Microsoft Access Class.forName("com.mysql.jdbc.Driver");
// (3) Ejecutar peticiones appDB.crearTabla(); Curso de J ava Standard Edition J 2SE 94 appDB.insertarStatement(1, "Enero"); appDB.insertarPreparedStatement(2, "Febrero"); appDB.consultarTabla();
// (4) Cerrar la conexin appDB.cerrarConexion();
} catch (ClassNotFoundException e) { System.out.println("ERROR: No se encuentra el Driver para el DBMS..."); } catch (SQLException e) { System.out.println("ERROR: No se pudo ejecutar la sentencia..."); } } }
OBJ ETI VOS: Describir las tecnologas para la creacin de interfaces grficas de usuario en J ava. Escribir programas J ava que presenten GUI (Interfaces Grficas de Usuario), empleando la tecnologa SWING.
CONTENIDO: Fundamentos de las interfaces grficas Construccin de interfaces grficas en J ava Administradores de diseo Manejo de eventos
95 Curso de J ava Standard Edition J 2SE 96 El objetivo de este tema es introducir los aspectos bsicos de diseo y construccin de una interfaz grfica de usuario (GUI Graphical User Interface) y presentar cmo se proporciona el funcionamiento de dicha interfaz. Con este propsito se presenta el modelo de objetos de los componentes grficos y la programacin basada o dirigida por eventos.
1 1. . F FU UN ND DA AM ME EN NT TO OS S D DE E L LA AS S I I N NT TE ER RF FA AC CE ES S G GR R F FI I C CA AS S
Hasta el momento las aplicaciones creadas slo han presentado y ledo informacin textual para realizar la interaccin con el usuario (aplicaciones de consola o en modo texto). El lenguaje de programacin J ava proporciona distintos paquetes con bibliotecas de clases que implementan los elementos grficos y posibilitan la creacin de interfaces grficas de una forma sencilla. Este conjunto de paquetes se denomina J ava Foundation Classes (J FC). La J FC o Clases Fundamentales de J ava, proporcionan una rica coleccin de clases de interfaz de usuario.
Las J FC son un grupo de APIs usadas para desarrollar la interfaz grfica de usuario y estas son: o Abstract Windows Toolkit (AWT): es el principal conjunto de herramientas usado por J ava para crear interfaces de usuario. Proporciona la base sobre la que descansa el resto de la construccin del J FC. El propsito principal de AWT es soportar ventanas de Applet. o API 2D: proporciona grficos de 2 dimensiones mejorados, texto y capacidades de imgenes para programas J ava, a travs de extensiones a AWT. Este amplio paquete de presentacin soporta arte de lneas, texto e imgenes, para desarrollar interfaces de usuario ricas, programas de dibujo y editores de imgenes. o Swing: es el conjunto de componentes ms ligeros construidos sobre AWT. Swing proporciona reemplazos ligeros para los componentes pesados de AWT, en adicin de una multitud de componentes adicionales de los que carece AWT. Swing tambin dispone de una infraestructura notable para implementar interfaces grficas de usuario como los componentes de aspecto (Look and Feel) de diferentes plataformas. o Accesibilidad: el J FC contiene numerosas herramientas de accesibilidad, que trabajan junto con el API de accesibilidad.
Es de hacer notar, que en el curso se estudiaran slo los componentes Swing y sus componentes grficos ms frecuentes, as como breves ejemplos de su uso.
1 1. .1 1. . C CR RE EA AC CI I N N D DE E U UN NA A I I N NT TE ER RF FA AZ Z G GR R F FI I C CA A
Los pasos bsicos para la creacin de una interfaz grfica de usuario son los siguientes: o El diseo y composicin de la apariencia de la interfaz grfica de la aplicacin. Esto implica la eleccin de una ventana principal (contenedor) en la que se van a incluir el resto de los elementos grficos de interaccin (componentes). El diseo se completa con la eleccin del resto de los componentes grficos (botones, etiquetas, mens, etc.) que se aaden a la ventana principal, su disposicin y la forma en que van a interactuar. o Creacin de componentes. Significa escribir el cdigo que crea los componentes y la apariencia de la interfaz. o Manejo de eventos. Esto es escribir el cdigo que proporciona el comportamiento de dicha interfaz como respuesta a las interacciones de los usuarios. Cada una de las acciones del usuario sobre la interfaz (Ejemplo: hacer clic sobre un botn), se traduce en la creacin de un evento en J ava. Por tanto hay que proporcionar los manejadores de eventos para responder a las interacciones de los usuarios. o Visualizacin. Una vez visualizada la interfaz, la aplicacin queda a espera de las interacciones del usuario que provocarn la ejecucin de los manejadores de eventos. Curso de J ava Standard Edition J 2SE 97
1 1. .2 2. . L LO OS S E EL LE EM ME EN NT TO OS S D DE E U UN NA A I I N NT TE ER RF FA AZ Z G GR R F FI I C CA A
Cmo se ha visto en los temas anteriores, en J ava prcticamente todas las cosas son objetos. Esta circunstancia sigue siendo vlida en la creacin de interfaces grficas. Las ventanas son objetos, todos los componentes grficos de interaccin contenidos en una ventana son objetos y como resultado de las acciones del usuario se generan eventos que tambin son objetos. En J ava una interfaz grfica se construye componiendo distintos objetos que implementan elementos grficos de interaccin (botones, campos de texto, etiquetas, etc.).
La creacin de un componente grfico supone la instanciacin o una especializacin de una de las clases estndar proporcionadas por el lenguaje. Por omisin, los objetos de estas clases tienen la particularidad de que saben como mostrarse a s mismos en la pantalla. Adems, los componentes grficos como cualquier otro objeto, tienen unas caractersticas y un comportamiento que viene dado por sus atributos y mtodos.
Finalmente, en J ava las interfaces grficas estn compuestas bsicamente por tres elementos: o Componentes grficos: jerarqua de clases que implementan los componentes grficos disponibles para una interfaz. o Administradores de Diseo: la jerarqua de clases que gestionan la apariencia del diseo la interfaz grfica. o Listeners o Manejadores de Eventos: jerarqua de clases de eventos que representan las interacciones de los usuarios con los componentes grficos y la forma como son manejados.
2 2. . C CO OM MP PO ON NE EN NT TE ES S G GR R F FI I C CO OS S - - S SW WI I N NG G
Swing es un conjunto de bibliotecas de clases que implementan los elementos o componentes grficos para la creacin de interfaces grficas de usuario. Swing posee la caracterstica fundamental, de que casi todos sus componentes estn codificados completamente en J ava, de modo que su comportamiento es el mismo para todas las plataformas.
Swing, en comparacin con las otras tecnologas para la creacin de interfaces grficas, presenta diversas ventajas y funcionalidades, entre las que cabe destacar las siguientes:
o Los componentes Swing son J avaBeans. Los componentes son unidades autocontenidas y reusables. Los componentes pueden ser manipulados visualmente usando herramientas de construccin para aplicaciones visuales. La tecnologa de componentes se incorporan a la plataforma J ava a travs del concepto de J avaBean. Las caractersticas que distinguen a un J avaBean de una simple clase J ava son: Introspeccin (todas sus variables son privadas), persistencia (permiten guardar y restaurar su estado - Serializacin), personalizacin (se configuran visualmente) y manejo de eventos (utilizan los eventos para comunicarse con otros objetos). Esto permite que los componentes Swing sean fcilmente integrados en herramientas de diseo de componentes.
o Nuevos componentes y nuevas funcionalidades. Swing incorpora clases para crear cuadros de dilogo estndar, aadir bordes sofisticados a los componentes, visualizar tablas y rboles, manipular texto con formato, etc., as como tambin permite cualquier tipo de anidamiento o inclusin de un componente dentro de otro, caractersticas que no estaban disponibles en AWT. Curso de J ava Standard Edition J 2SE 98 o Aspecto y comportamiento configurable. Las aplicaciones pueden tener el aspecto y el comportamiento que el programador desee y no el que fija la plataforma en la que se ejecutan. Por ejemplo, en Windows adems de botones con el mismo aspecto que las del sistema operativo se pueden crear botones con aspecto metlico o con apariencia Mac. Esto se denomina en ingls puggable Look and Feel, y significa que Swing contiene implementaciones estndares de aspecto para los sistemas operativos ms populares, lo que permite a un programa ser ejecutado sin modificacin en cualquier tipo de computadora y siempre verse y sentirse como un programa escrito especficamente para el sistema operativo en el que se est ejecutando. A la vez, tambin se puede implementar un programa para siempre verse igual, sin importar sobre qu sistema operativo se ejecute.
o Arquitectura Modelo-Vista-Controlador (MVC). Esta es quizs la caracterstica ms importante de Swing. En MVC un elemento tiene tres partes: un modelo que gestiona los datos, una vista que gestiona cmo se muestran esos datos y un controlador que determina qu modificaciones hay que hacer cuando se interacciona con el elemento. En Swing se utiliza una adaptacin de esta arquitectura, de modo que la vista y el controlador se agrupan en el componente, pero el modelo se mantiene separado.
Grfico 1. Modelo MVC de Swing
Por ejemplo, como los modelos gestionan y almacenan los datos existe la posibilidad de compartir un mismo modelo entre varios componentes. Cada uno de los componentes puede modificar el modelo y dicha modificacin se reflejar de forma automtica en el resto de los componentes que comparten dicho modelo.
Grfico 2. Modelo MVC de Swing entre componentes
o Accesibilidad. Todos los componentes Swing son compatibles con los dispositivos de ayuda para personas discapacitadas y permiten utilizar interfaces alternativas, tales como braille y sintetizadores de voz.
El hecho de que el conjunto de herramientas de componentes Swing est construido en la arquitectura MVC y con aspectos y comportamientos configurables, lo hacen ms complejo que las herramientas de interfaz de usuario tradicionales, como la utilizada en visual Basic o Delphi. Sin embargo, cuando la arquitectura de Swing es entendida, los beneficios son mayores que el esfuerzo extra requerido para aprender y usar sus capacidades.
ACTUALIZACIN Evento VI STA
CONTROLADOR (Listener) C O M P O N E N T E
CAMBIO CAMBIO ACTUALIZACIN
MODELO (Clases Entidad) ACTUALIZACIN CAMBIO CAMBIO ACTUALIZACIN CAMBIO CAMBIO ACTUALIZACIN ACTUALIZACIN Evento VI STA Atributo: Nombre CONTROLADOR (ActionPerform) J C o m b o
MODELO (Clases Persona) Evento VI STA Atributo: Nombre CONTROLADOR (ActionEvent) J L i s t
Curso de J ava Standard Edition J 2SE 99 2 2. .1 1. . J J E ER RA AR RQ QU U A A Y Y T TI I P PO OS S D DE E C CO OM MP PO ON NE EN NT TE ES S G GR R F FI I C CO OS S
Como Swing presenta una gran cantidad de clases grficas no es posible ni presentarlas todas ni describirlas de forma completa. Se trabajar con las clases ms utilizadas, estructuradas por grupos, y sus mtodos ms importantes. Las clases grficas se presentan estructuradas en los siguientes grandes grupos: clases bsicas, contendores (contenedores de alto nivel e intermedios) y componentes atmicos.
o C CL LA AS SE ES S B B S SI I C CA AS S: : proporcionan el soporte y las funcionalidades bsicas para el resto de los componentes. La raz de todos los elementos grficos en J ava es la clase abstracta java.awt.Component y su subclase java.awt.Container. La clase javax.swing.J Component, es la clase base para prcticamente todos los componentes Swing. A continuacin se describen las clase bsicas:
o java.awt.Component: esta clase abstracta define la funcionalidad bsica de todos los componentes grficos en J ava. Como la presentacin grfica es responsabilidad de cada uno de los componentes, en esta clase se definen distintos mtodos relacionados con los efectos visuales y con su respuesta a acciones. J ava.awt.Component, proporciona un gran nmero de mtodos de utilidad, los cuales se describen brevemente los ms utilizados:
MTODO FUNCIONALI DAD void paint(gGraphics) void repaint() void update(Graphics) Dibujo y actualizacin del componente en la pantalla. boolean isVisible() void setVisible(true) Comprueba o establece si el componente es visible boolean isEnabled() void setEnabled() Permite conocer si un componente est activado y activarlo o desactivarlo Point getLocation() Point getLocationOnScreen() void setLocation(Point) void setLocation(int, int) Devuelve o establece la posicin del componente respecto al componente padre o respecto a la pantalla Dimension getSize() void setSize(int, int) void setSize(Dimension) int getWidth() int getHeight() Obtiene o establece el tamao de un componente, en pxeles o como un objeto Dimension float getAligmentX() float getAligmentY() Obtiene la alineacin del componente. Las constantes correspondientes son: CENTER_ALIGMENT, LEFT_ALIGMENT, RIGHT_ALIGMENT, TOP_ALIGMENT Y BOTTOM_ALIGMENT Color getForeground() Color getBackground() void setForeground(Color) void setBackground(Color) Obtiene o establece el color de fondo o de primer plano del componente Container getParent() Obtiene el contenedor padre del componente String getName() void setName(String) Obtiene o establece el nombre del componente segn la cadena proporcionada
Curso de J ava Standard Edition J 2SE 100 o java.awt.Container: esta clase abstracta implementa un contenedor genrico y proporciona sus funcionalidades bsicas. Un contenedor es un objeto que permite agrupar uno o ms componentes de forma que se puedan tratar como una unidad. Proporciona mtodos para aadir y eliminar componentes o para definir el tipo de presentacin que se realiza de los componentes en la pantalla (Layout Managers). Los contenedores mantienen una lista de los objetos que contienen y por omisin los objetos aparecen en el orden en que se han aadido, la cual ser utilizada por los Layout Managers. Container proporciona los siguientes mtodos:
MTODO FUNCIONALI DAD void add(Component) void add(Component, int) Aade un componente en el contenedor, por omisin al final de la lista salvo que se indique un ndice. Component getComponentAt(int,int) Component getComponentAt(Point) Obtiene el componente que contiene un determinado punto (x,y) Component [] getComponents() Obtiene todos los componentes del contenedor void remove(Component) void remove(int) void removeAll() Elimina un componente, dado su identificador o por su posicin en la lista de componentes (o para el primer componente), o todos los componentes. void setLayout(LayoutManager) LayoutManager getLayout() Establece u obtiene el administrador de diseo que utiliza el contenedor.
o javax.swing.J Component: es la clase base de casi todos los componentes de interaccin que incorpora Swing, excepto los contenedores de alto nivel. Es una especializacin de Conteiner, de modo que prcticamente todos los componentes Swing se pueden anidar unos dentro de otros. Proporciona muchas de las funcionalidades bsicas de los contenedores intermedios y los componentes atmicos de Swing, tales como la gestin de bordes sofisticados, la inclusin de ayudas contextuales, soporte para la presentacin en pantalla, o la mejora de la visualizacin grfica (mediante un bfer doble). Component proporciona los siguientes mtodos:
MTODO FUNCIONALI DAD void setBorder(Border) Border getBorder() Establece u obtiene el borde que muestra un componente alrededor de sus lmites. void setOpaque(boolean) Establece si un componente es opaco o no (transparente). void setToolTipText(String) Establece el texto a mostrar como pista o ayuda contextual del componente que se muestra en una ventana emergente cuando el ratn se detiene sobre un objeto particular de la pantalla. void paintComponent(Graphics) void repaint(Rectangle) Dibuja el componente. Es necesario rescribirlo para implementar un dibujo personalizado. Solicita que se redibuje un rea especifica del componente void setPreferredSize(Dimension) void setMinimunSize(Dimension) void setMaximunSize(Dimension) Establece las recomendaciones de tamao preferido, mnimo y mximo para un componente. Estos datos slo son recomendaciones y pueden ser ignorados por el Layout Manager. void setAligmentX(float) void setAligmentX(float) Establece la alineacin del componente
Curso de J ava Standard Edition J 2SE 101 o C CO ON NT TE EN NE ED DO OR RE ES S: : un contenedor es tipo especial de componente que est formado por uno o ms componentes (o por otros contenedores). La particularidad principal que aportan es que todos los componentes agrupados dentro de un contenedor se pueden tratar como una nica entidad. Los contendores en J ava estn representados por la clase java.awt.Container. Existen dos tipos de contenedores: de alto nivel e intermedios.
C CO ON NT TE EN NE ED DO OR RE ES S D DE E A AL LT TO O N NI I V VE EL L: : los contenedores de alto nivel proporcionan la estructura y funcionalidad bsica de una ventana, as como el espacio para que se muestren el resto de los componentes que estn contenidos dentro de ella y que conforman la interfaz de usuario. En Swing los contenedores de alto nivel son especializaciones de la clase java.awt.Window.
Grfico 3. J erarqua de clases de los contenedores de alto nivel
A continuacin se describen los contenedores de alto nivel:
o java.awt.Window: esta encapsula un objeto genrico ventana, sin borde ni barra de mens, que proporciona las funcionalidades bsicas a todas las ventanas. Son las especializaciones de esta clase las que permiten crear las ventanas principales de la aplicacin y dan soporte a los cuadros de dilogo con el usuario.
MTODO FUNCIONALI DAD void pack() Ajusta el tamao de la ventana segn el tamao preferido y disposicin de sus componentes. void toFront() void toBack() Coloca la ventana delante o detrs de otras ventanas. void dispose() Destruye la ventana as como sus componentes y libera los recursos asignados a ella. boolean isShowing() void show() Obtiene si la ventana es visible. Hace que la ventana sea visible.
o javax.swing.J Frame: se emplea para crear la ventana principal de la aplicacin. Es una subclase de java.awt.Frame, que a su vez es una especializacin de java.awt.Window. Es una ventana con marco que incluye los controles habituales de control (cerrar, minimizar y maximizar). Tiene un panel raz superior (J RootPane) que gestiona el interior de la ventana. En este panel raz estn incluidos, el panel de contenido (siempre presente) y, si existe, la barra de mens (J MenuBar). Los componentes grficos no se aaden al J Frame directamente sino a su panel de contenido. java.awt.Container java.awt.Window java.awt.Frame java.awt.Dialog javax.swing.J Window javax.swing.J Frame javax.swing.J Dialog Curso de J ava Standard Edition J 2SE 102 A continuacin se describen sus principales mtodos:
MTODO FUNCIONALI DAD J Frame() J Frame(String) Constructores que crean una ventana, inicialmente oculta y a la que se le puede asignar un ttulo. String getTitle() void setTitle(String) Obtiene o establece el titulo de la ventana. void setResizable(boolean) booleann isResizable() Establece o determina si la ventana puede cambiar de tamao. J RootPane createRootPane() J RootPane getRootPane() void setRootPane(J RootPane) Crea, obtiene o establece el panel raz de la ventana. Este panel gestiona el panel de contenido y la barra de mens. Container getContentPane() void setContentPane(Container) Obtiene o establece el panel de contenido de la ventana. Contiene a todos los componentes grficos de la ventana. J MenuBar getMenuBar() void setMenuBar(J MenuBar) Obtiene o establece la barra de mens de la ventana. int getDefaultCloseOperation() void setDefaultCloseOperation(int) Obtiene o establece el comportamiento de la ventana cuando el usuario trata de cerrarla. El parmetro debe ser una de las constantes:J Frame.DO_NOTHING_ON_CLOSE, J Frame.HIDE_ON_CLOSE J Frame.DISPOSE_ON_CLOSE.
A continuacin se incluye el cdigo de creacin de una ventana principal de una aplicacin, con una etiqueta:
package interfacesGraficas;
import javax.swing.*;
public class EjemploJ Frame extends J Frame { public EjemploJ Frame(){ // AGREGAR LOS COMPONENETES A LA VENTANA J Label etiqueta = new J Label(Ventana J Frame); // Crea el componente getContentPane().add(etiqueta); // Agrega el componente
// ESTABLECER PROPIEDADES GENERALES DE LA VENTANA setDefaultCloseOperation(J Frame.DISPOSE_ON_CLOSE); setTitle(Ejemplo de J Frame); setSize(300,200); } public static void main(String[] args) { EjemploJ Frame ventana; ventana = new EjemploJ Frame(); / / Crea el objeto ventana ventana.setVisible(true); // Muestra la ventana } }
Grfico 4. Ejemplo de ventana J Frame Curso de J ava Standard Edition J 2SE 103 o javax.swing.J Dialog: es la base raz de las ventanas secundarias que implementan cuadros de dilogo Swing. Se denominan ventanas secundarias porque dependen de una ventana principal y si la ventana principal se cierra, se minimiza o se maximiza, las ventanas secundarias realizan la misma operacin de forma automtica. Al igual que J Frame, incorpora un panel raz, con sus componentes panel de contenido y mens. Estas ventanas pueden ser modales o no. J Dialog provee los mismos mtodos de J Frame y agrega los siguientes:
MTODO FUNCIONALI DAD J Dialog(J Frame) J Dialog(J Frame, boolean) J Dialog(J Frame, String) J Dialog(J Frame, boolean, String) Constructores en los que se indica la ventana principal (J Frame), si es modal o no y el titulo. Existen los mismos constructores en donde la ventana principal es un J Dialog. void setLocationRelatiiveTo(Component) Establece la posicin de la ventana en relacin al componente indicado.
A continuacin se incluye el cdigo de creacin de una ventana emergente a una ventana de una aplicacin, con una etiqueta:
package interfacesGraficas;
import javax.swing.*;
public class EjemploJ Dialog extends J Frame { public EjemploJ Dialog(){ // Agregar los componentes a la ventana J Label etiqueta = new J Label(Ventana J Frame); // Crea el componente getContentPane().add(etiqueta); // Agrega el componente // Establecer propiedades generales de la ventana setDefaultCloseOperation(J Frame.DISPOSE_ON_CLOSE); setTitle(Ejemplo de J Dialog); setSize(300,200); / / CREAR LA VENTANA EMERGENTE J Dialog ventanaEmergente; ventanaEmergente = new J Dialog(this); // Crea la ventana emergente ventanaEmergente.setDefaultCloseOperation(J Dialog.DISPOSE_ON_CLOSE); ventanaEmergente.setTitle(Ventana Emergente); ventanaEmergente.setSize(150,150); ventanaEmergente.setVisible(true); // Muestra la ventana } public static void main(String[] args) { EjemploJ Dialog ventana = new EjemploJ Dialog(); // Crea el objeto ventana ventana.setVisible(true); // Muestra la ventana } }
Grfico 5. Ejemplo de ventana J Dialog Curso de J ava Standard Edition J 2SE 104 C CU UA AD DR RO OS S D DE E D DI I L LO OG GO O E ES ST T N ND DA AR R: : Swing incorpora distintos componentes que implementan diferentes tipos de cuadros de dilogo estndar, pero que no son especializaciones de J Dialog.
Grfico 6. J erarqua de clases de los cuadros de dilogo estndar
A continuacin se describen las principales clases de cuadro de dilogo estndar:
o javax.swing.J OptionPane: esta clase se utiliza para crear los cuadros de dilogo ms habituales, en los que se pide un valor al usuario o en los que se muestra un mensaje de error o advertencia. Todos los cuadros de dilogo que implementa J OptionPane son modales (bloquean la interaccin del usuario con otras ventanas). La forma ms sencilla de uso de la clase es mediante la invocacin de alguno de sus mtodos estticos para crear cuadros de dilogo. A continuacin se muestran dichos mtodos:
MTODO FUNCIONALI DAD static int showMessageDialog(Component, Object) static int showMessageDialog(Component, Object, String, int) static int showMessageDialog(Component, Object, String, int, Icon) Muestra un cuadro de dilogo modal que presenta informacin al usuario y tiene un botn Aceptar. Los argumentos especifican el componente padre, el mensaje, el ttulo, el tipo de mensaje y el icono del cuadro de dilogo. static int showConfirmDialog(Component, Object) static int showConfirmDialog (Component, Object, String, int) static int showConfirmDialog (Component, Object, String, int, int) static int showConfirmDialog (Component, Object, String, int, int, Icon) Muestra un cuadro de dilogo modal que realiza una pregunta al usuario. Los argumentos especifican el componente padre, el mensaje, el ttulo, el tipo de opcin, el tipo de mensaje y el icono del cuadro de dilogo. static int showInputDialog(Object) static int showInputDialog(Component, Object) static int showInputDialog (Component, Object, String, int) static int showInputDialog (Component, Object, String, int, Icon) Muestra un cuadro de dilogo modal en el que solicita una entrada al usuario. Los argumentos especifican el componente padre, el mensaje, el ttulo, el tipo de mensaje y el icono del cuadro de dilogo. static int showOptionDialog (Component, Object, String, int, int, Icon, Object[],Object) Muestra un cuadro de dilogo modal personalizado. Los argumentos especifican el componente padre, el mensaje, el ttulo, el tipo de opcin, el tipo de mensaje, el icono, las opciones y la opcin predeterminada del cuadro de dilogo.
Mediante el parmetro tipo de mensaje se pueden proporciona el comportamiento del cuadro del dilogo: Los tipos de mensaje predeterminados son:
- J OptionPane.ERROR_MESSAGE - J OptionPane.PLAIN_MESSAGE - J OptionPane.INFORMATION_MESSAGE - J OptionPane.WARNING_MESSAGE - J OptionPane.QUESTION_MESSAGE J Component J OptionPane J FileChooser Curso de J ava Standard Edition J 2SE 105 Mediante el parmetro tipo de opciones se pueden proporcionar los botones que se deben incluir. Las opciones predeterminadas son:
Ejemplo: Creacin de cuadros de dilogo estndar con J OptionPane:
package interfacesGraficas; import javax.swing.*;
public class EjemploJ OptionPane extends J Frame { public EjemploJ OptionPane (){ // Agregar los componentes a la ventana J Label etiqueta = new J Label(Ventana J Frame); // Crea el componente getContentPane().add(etiqueta); // Agrega el componente // Establecer propiedades generales de la ventana setDefaultCloseOperation(J Frame.DISPOSE_ON_CLOSE); setTitle(Ejemplo de J OptionPane); setSize(300,200);
//CREAR LOS CUADROS DE DIALOGO / / Mensaje de Error J OptionPane.showMessageDialog(this, // Ventana principal Error: Debe introducir todos los campos, // Mensaje Error de entrada de datos, // Titulo J OptionPane.ERROR_MESSAGE); // Tipo mensaje
Grfico 7. Cuadro de dialogo Mensaje / / Mensaje de confirmacin int opc = J OptionPane.showConfirmDialog(this, Desea Agregar el Registro?, // Mensaje Mensaje de confirmacin, // Titulo J OptionPane.YES_NO_OPTION); // Tipo Opciones
Grfico 8. Cuadro de dialogo de Confirmacin / / Cuadro de opcin personalizado Object[] textoOpciones = {S adelante,Ahora no, No s que hacer}; int op = J OptionPane.showOptionDialog(this, Desea realizar la operacin ahora?, // Mensaje Mensaje de Confirmacin, // Titulo J OptionPane.YES_NO_CANCEL_OPTION, // Tipo opciones J OptionPane.QUESTION_MESSAGE, // Tipo de Mensaje null, // Icono textoOpciones, // Opciones textoOpciones[0]); // Opcin principal }
Grfico 9. Cuadro de dialogo Personalizado public static void main(String[] args) { EjemploJ OptionPane ventana = new EjemploJ OptionPane (); ventana.setVisible(true); } }
Curso de J ava Standard Edition J 2SE 106 o javax.swing.J FileChooser: un selector de archivos permite la seleccin interactiva por parte del usuario de un archivo o directorio, bien a partir de una lista que se le proporciona o bien introduciendo directamente su nombre. Un selector de archivos muestra todos los archivos y directorios no ocultos de una posicin determinada del sistema de archivos. Si slo se est interesado en algn tipo de archivos se puede modificar la presentacin aplicando filtros.
MTODO FUNCIONALI DAD J FileChooser() J FileChooser(String) Constructores. Mediante los argumentos se establece el directorio actual int showOpenDialog(Component) int showSaveDialog(Component) Muestra el selector de archivos abrir o guardar. Devuelven como resultado si el usuario ha aceptado o no la operacin (APPROVE_OPTION CANCEL_OPTION). void setSelectedFile(File) File getSelectedFile() Establece u obtiene el archivo o directorio seleccionado void setFileSelectionMode(int) int getFileSelectionMode() Estable u obtiene el mo de seleccin. Por omisin slo se pueden seleccionar archivos (FILES_ONLY), pero se puede cambiar a solo directorio (DIRECTORIES_ONLY) o ambos (FILES_AND_DIRECTORIES) boolean getControlButtonsAreShown() void setControlButtonAreShown(boolean) Obtiene o establece si se muestran o no los botones de control predeterminados del selector
Ejemplo: en el siguiente cdigo se crea un selector de archivos y se muestra en la salida estndar el nombre del archivo seleccionado o si se cancel la operacin:
public class EjemploJ FileChooser extends J Frame { public EjemploJ FileChooser (){ // Agregar los componentes a la ventana J Label etiqueta = new J Label(Ventana J Frame); // Crea el componente getContentPane().add(etiqueta); // Agrega el componente // Establecer propiedades generales de la ventana setDefaultCloseOperation(J Frame.DISPOSE_ON_CLOSE); setTitle(Ejemplo de J OptionPane); setSize(300,200);
/ / SE CREA EL SELECTOR DE ARCHI VOS J FileChooser selector = new J FileChooser(); selector.setFileSelectionMode(J FileChooser.DI RECTORI ES_ONLY); int opc = selector.showOpenDialog(this); if(opc == J FileChooser.APROVE_OPTI ON) { File archivo = selector.getSelectedFile(); System.out.println(Archivo seleccionado: + archivo); } else System.out.println(Operacin cancelada por el usuario); }
Grfico 10. Selector de archivos public static void main(String[] args) { EjemploJ FileChooser ventana = new EjemploJ FileChooser (); ventana.setVisible(true); } }
Curso de J ava Standard Edition J 2SE 107 C CO ON NT TE EN NE ED DO OR RE ES S I I N NT TE ER RM ME ED DI I O OS S: : los contenedores intermedios no generan una ventana independiente y su propsito es agrupar otros componentes para mejorar la gestin de la interfaz (por ejemplo, presentacin o gestin de eventos). Ofrecen diferentes funcionalidades, desde la simple agrupacin de componentes (J Panel) hasta la gestin de componentes en mltiples capas (como J TabbedPane).
Grfico 11. J erarqua de clases de los contenedores intermedios
A continuacin se describen los principales contenedores intermedios:
o javax.swing.J Panel: es un contenedor simple de propsito general, hereda de J Component, no posee ninguna caracterstica grfica sofisticada. J Panel sirve para agrupar a otros componentes. Habitualmente se utiliza para dividir una zona de pantalla en secciones. Inicialmente estos paneles no son visualizables, salvo por el color de su fondo, pero es sencillo aadirles bordes. De forma predeterminada J Panel emplea FlowLayout, como administrador de diseo.
MTODO FUNCIONALI DAD J Panel() J Panel(LayoutManager) Constructores. Permite crear un panel para agrupar componentes, adems permite establecer el administrador de diseo para el contenedor. void add(J Component)
o javax.swing.J ScrollPane: proporciona un panel con la capacidad de incluir barra de desplazamiento para mostrar su contenido. Por tanto, es muy adecuado para presentar una informacin que esta contenida en otro componente y que no cabe completamente en la zona de visualizacin que tiene asignada en la pantalla.
MTODO FUNCIONALI DAD J ScrollPane() J ScrollPane(Component) J ScrollPane(Component, int, int) Constructores. Se puede indicar el componente que proporciona el contenido y la poltica de presentacin de las barras de desplazamiento. void setViewportView(Component) Establece el componente que proporciona el contenido. void setVerticalScrollBarPolicy(int) int getVerticalScrollBarPolicy() Establece u obtiene la poltica de presentacin de la barra de desplazamiento vertical. Las posibilidades son: que se muestre cuando sea necesario (VERTICAL_SCROLLBAR_AS_NEEDED), que se muestren siempre (VERTICAL_SCROLLBAR_ALWAYS) y que no se muestren nunca (VERTICAL_SCROLLBAR_NEVER). void setHorizontalScrollBarPolicy(int) int getHorizontalScrollBarPolicy() Establece u obtiene la poltica de presentacin de la barra de desplazamiento horizontal. Las posibilidades son: que se muestre cuando sea necesario (HORIZONTAL_SCROLLBAR_AS_NEEDED), que se muestren siempre (HORIZONTAL_SCROLLBAR_ALWAYS) y que no se muestren nunca (HORIZONTAL_SCROLLBAR_NEVER).
J Component J Panel J ScrollPane J SplitPane J TabbedPane J ToolBar Curso de J ava Standard Edition J 2SE 108 Ejemplo: A continuacin se presenta el cdigo que ayuda a crear un J ScrollPane.
package interfacesGraficas;
import java.awt.*; import javax.swing.*;
public class EjemploScrollPane extends J Frame { public EjemploScrollPane() { // CREAR LOS COMPONENTES DE LA VENTANA J Panel panel = new J Panel(); J Label etq = new J Label("Etiqueta"); panel.add(etq);
// AGREGAR COMPONENTES A LA VENTANA getContentPane().add(scroll);
// ESTABLECER PROPIEDADES GENERALES DE LA VENTANA setDefaultCloseOperation(J Frame.DISPOSE_ON_CLOSE); setTitle("Ejemplo de ScrollPane"); setSize(150, 100); }
public static void main(String[] args) { EjemploScrollPane ventana; ventana = new EjemploScrollPane(); ventana.setVisible(true); } }
Grfico 12. Contenedor ScrollPane
o javax.swing.J SplitPane: es un contenedor que gestiona dos componentes (normalmente dos paneles) colocados vertical u horizontalmente y diferenciados por un separador que puede ser reposicionado por el usuario. El usuario puede decidir cual es el tamao asignado a cada uno de los componentes pulsando con el ratn sobre el separador y arrastrndolo.
MTODO FUNCIONALI DAD J SplitPane() J SplitPane(int) J SplitPane(int, Component, Component) Constructores. Se le puede proporcionar la orientacin y los componentes de sus dos partes. void setOrientation(int) int getOrientation() Establece u obtiene la orientacin de la divisin. Por omisin aparece uno al lado del otro (HORIZONTAL_SPLIT) y se puede cambiar para que aparezca uno encima de otro (VERTICAL_SPLIT) Curso de J ava Standard Edition J 2SE 109 void setDividerSize(int) int getDividerSize() Establece u obtiene el tamao del separador en pxels. void setTopComponent(Component) void setBottomComponent(Component) void setLeftComponent(Component) void setRigthComponent(Component) Component getTopComponent() Component getBottomComponent() Component getLeftComponent() Component getRigthComponent() Establece u obtiene el componente que aparece en cada una de las zonas. Izquierda es equivalente a arriba y derecha es equivalente abajo para poder cambiar posteriormente la posicin del separador. void setDividerLocation(double) void setDividerLocation(int) int getDividerLocation() Establece u obtiene la posicin del separador. Dicha posicin puede indicarse en porcentaje o en pxels.
Ejemplo: A continuacin se presenta el cdigo que ayuda a crear un J SplitPane.
package interfacesGraficas;
import java.awt.*; import javax.swing.*;
public class EjemploSplitPane extends J Frame { public EjemploSplitPane() { // CREAR LOS COMPONENTES DE LA VENTANA J ScrollPane panelIzquierdo = new J ScrollPane(); panelIzquierdo.setVerticalScrollBarPolicy(J ScrollPane.VERTICAL_SCROLLBAR_ALWAYS); J ScrollPane panelDerecho = new J ScrollPane(); panelDerecho.setHorizontalScrollBarPolicy(J ScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
J SplitPane panelDividido = new J SplitPane(J SplitPane.HORI ZONTAL_SPLIT,panelIzquierdo,panelDerecho); panelDividido.setDividerLocation(150);
// AGREGAR COMPONENTES A LA VENTANA getContentPane().add(panelDividido);
// ESTABLECER PROPIEDADES GENERALES DE LA VENTANA setDefaultCloseOperation(J Frame.DISPOSE_ON_CLOSE); setTitle("Ejemplo de SplitPane"); setSize(300, 200); } public static void main(String[] args) { EjemploSplitPane ventana; ventana = new EjemploSplitPane(); ventana.setVisible(true); } }
Grfico 13. Contenedor J SplitPane Curso de J ava Standard Edition J 2SE 110 o javax.swing.J TabbedPane: es contenedor que gestiona varios componentes (o grupos de componentes, aunque habitualmente paneles) como una pila de fichas. Los componentes se superponen completamente los unos a los otros de forma que slo uno de ellos es visible en cada momento. El usuario puede decidir cual de los componentes se visualiza, seleccionando la solapa o lengeta correspondiente a dicho componente. El administrador de diseo por omisin es CardLayout.
MTODO FUNCIONALI DAD J TabbedPane() J TabbedPane(int) Constructor. Se puede establecer la posicin de las solapas mediante las constantes TOP, BOTTOM, LEFT y RIGTH. void addTab(String, Icon, Component, String) void addTab(String, Icon, Component) void addTab(String, Component) Aade una nueva ficha o componente (con su solapa) al contenedor. Los argumentos proporcionan el texto de la solapa, su icono, el componente a mostrar cuando se seleccione esa solapa y la ayuda contextual para la solapa. void insertTab(String, Icon, Component, String, int) Igual que addTab(), pero indica el ndice en la que se aade la ficha en la lista de fichas. int getSelectedIndex() Component getSelectedComponent() void setSelectedIndex(int) void setSelectedComponent(Component) Obtiene o establece el ndice o la ficha seleccionada. La seleccin de una ficha supone su presentacin automtica en pantalka. void removeComponent(Component) void removeTabAt(int) Elimina la ficha del componente o la del ndice correspondiente. void setComponentAt(int, Component) Component getComponentAt(int) void setTitleAt(int, String) String getTitleAt(int) void setIconAt(int, Icon) Icon getIconAt(int) Establece u obtiene el componente, el titulo o el icono asociado con la ficha situada en dicho ndice.
Ejemplo: A continuacin se presenta el cdigo que ayuda a crear un J TabbedPane.
package interfacesGraficas;
import java.awt.*; import javax.swing.*;
public class EjemploTabbedPane extends J Frame { public EjemploTabbedPane() {
// CREAR LOS COMPONENTES DE LA VENTANA J Panel panel1 = new J Panel(); panel1.add(new J Label("Panel 1"));
Curso de J ava Standard Edition J 2SE 111 // AGREGAR COMPONENTES A LA VENTANA getContentPane().add(panelSolapas);
// ESTABLECER PROPIEDADES GENERALES DE LA VENTANA setDefaultCloseOperation(J Frame.DISPOSE_ON_CLOSE); setTitle("Ejemplo de TabbedPane"); setSize(300, 200); } public static void main(String[] args) { EjemploTabbedPane ventana; ventana = new EjemploTabbedPane(); ventana.setVisible(true); } }
Grfico 14. Contenedor J TabbedPane
o javax.swing.J ToolBar: esta clase implementa una barra de herramientas, formada normalmente por botones o controles que incluyen iconos y que aparecen organizados como una fila o una columna dependiendo de la zona de la pantalla donde se coloque. El administrador de diseo predeterminado de una barra de herramienta es BoxLayout.
MTODO FUNCIONALI DAD J ToolBar() J ToolBar(String) J ToolBar(int) Constructor que crea una barra de herramientas. Se puede especificar el nombre y la orientacin de la barra de herramientas. Los valores posibles son HORIZONTAL o VERTICAL. Component add(Component) Aade un componente a la barra de herramientas. Normalmente los componentes son botones. void addSeparator() Aade un separador al final de la barra de herramientas void setFloatable(boolean) boolean isFloatable() Establece u obtiene si la barra de herramientas se puede desplazar o no.
Ejemplo: A continuacin se presenta el cdigo que ayuda a crear un J ToolBar.
package interfacesGraficas;
import java.awt.*; import javax.swing.*;
public class EjemploJ ToolBar extends J Frame { public EjemploJ ToolBar() {
// CREAR LOS COMPONENTES DE LA VENTANA Curso de J ava Standard Edition J 2SE 112 J Button boton1 = new J Button(new ImageIcon("images/Web/tips.gif")); J Button boton2 = new J Button(new ImageIcon("safe_easy_easier.jpg")); J Button boton3 = new J Button(new ImageIcon("images/Web/bullet.gif"));
J ToolBar barra = new J ToolBar(J ToolBar.HORI ZONTAL); barra.add(boton1); barra.add(boton2); barra.addSeparator(); barra.add(boton3);
// AGREGAR COMPONENTES A LA VENTANA getContentPane().add(barra, BorderLayout.NORTH);
// ESTABLECER PROPIEDADES GENERALES DE LA VENTANA setDefaultCloseOperation(J Frame.DISPOSE_ON_CLOSE); setTitle("Ejemplo de J ToolBar"); setSize(350, 150); }
public static void main(String[] args) { EjemploJ ToolBar ventana; ventana = new EjemploJ ToolBar(); ventana.setVisible(true); }
}
Grfico 15. Contenedor J ToolBar Curso de J ava Standard Edition J 2SE 113 C CO OM MP PO ON NE EN NT TE ES S A AT T M MI I C CO OS S: : un componente simple o atmico, es un objeto que tiene una representacin grfica que se puede mostrar en la pantalla y con la que puede interactuar el usuario. No estn formados por otros componentes grficos ms simples.
Grfico 16. J erarqua de clases de los componentes atmicos
A continuacin se describen los componentes atmicos:
o javax.swing.ImageIcon: esta clase implementa la interfaz Icon, y genera un icono a partir de una imagen en formato GIF o J PG. La imagen se especifica a travs de un objeto Image, un String o mediante un localizador uniforme de recursos (URL).
MTODO FUNCIONALI DAD ImageIcon(String) Crea un icono desde un archivo especificado. Puede incluir la ruta en donde se encuentra la imagen, empleando como separador de directorios el carcter /.
J Component ImageIcon J Label AbstractButton J MenuBar J PopupMenu J Separator J TextComponent J List J ComboBox J Button J ToggleButton J Menu J RadioButton J CheckBox J MenuItem J RadioButtonMenuItem J CheckBoxMenuItem J TextField J TextArea J EditorPane J PasswordField J TextPane Curso de J ava Standard Edition J 2SE 114 void setDescription(String) Establece una descripcin para el icono String getDescription() Devuelve la descripcin del icono
o javax.swing.J Label: esta clase implementa una etiqueta que puede contener una cadena de texto, un icono o ambos, y puede mostrarse en cualquier contenedor. Una etiqueta es un campo de solo salida, es decir muestra su contenido que no es ni seleccionable ni editable por el usuario. Se emplea par dar nombre (etiquetar) a otros componentes de la interfaz grfica. Una caracterstica importante de las etiquetas en Swing es que estas admiten varias lneas, con distintos tipos de fuente.
MTODO FUNCIONALI DAD J Label(String) J Label(String, int) J Label(Icon) Constructores. Se puede especificar el texto, el icono y la alineacin horizontal del contenido en la etiqueta. void setText(String) String getText() Establece u obtiene el texto de la etiqueta. void setIcon(Icon) Icon getIcon() Establece u obtiene el icono de la etiqueta. void setHorizontalAligment(int) int getHorizontalAligment() Establece u obtiene la alineacin horizontal del contenido. Los valores posibles son: LEFT (por omisin), CENTER, RIGTH, LEADING y TRAILING. void setVerticalAligment(int) int getVerticalAligment() Establece u obtiene la alineacin vertical del contenido. Los valores posibles son: CENTER (por omisin), TOP y BOTTOM.
o javax.swing.J Button: esta clase implementa la forma ms habitual de botn grfico de interaccin que sirve para ejecutar una accin haciendo clic sobre l. Tambin se puede activa mediante el teclado si se le ha asociado una combinacin de teclas
MTODO FUNCIONALI DAD J Button(String) J Button(Icon) J Button(String,Icon) Constructor, en el cual se puede especificar el texto del botn y el icono asociado. void doClick() Selecciona el botn mediante programa (equivale a que el usuario haga clck sobre el botn). Icon getIcon() void setIcon(Icon) Obtiene o establece el icono del botn. String getText() void setText(String) Obtiene o establece el texto del botn. boolean isSelected() void setSelected (bolean) Obtiene o establece el estado del botn (seleccionado o no seleccionado). boolean getEnabled() void setEnabled(bolean) Obtiene o establece el estado de activacin del botn (Activado o desactivado).
o javax.swing.J TextField: Componente que permite mostrar y editar una nica lnea de texto. Se utiliza para solicitar al usuario entradas de datos breves en forma de texto. Utiliza principalmente los mtodos heredados de la clase J TextComponent, y representa una obtener y validar datos proporcionados por el usuario.
Curso de J ava Standard Edition J 2SE 115 MTODO FUNCIONALI DAD J TextField() J TextField(String) J TextField(int) J TextField(String,int) Constructores. Se puede especificar un texto inicial y el nmero de caracteres que podr contener. void setText(String) String getText() Estable u obtiene el texto contenido en el componente. void setEditable(boolean) boolean isEditable() Establece u obtiene si el usuario puede editar el texto contenido
o javax.swing.J CheckBox: esta clase implementa una casilla de verificacin. Es una especializacin de un botn con estado o conmutador (J ToggleButton) y, por tanto, tiene dos estados posibles, seleccionada o no seleccionada que determina y modifica su apariencia grfica (normalmente mediante una cruz o marca de seleccin).
MTODO FUNCIONALI DAD J CheckBox(String, Icon, boolean) Constructor. Permite establecer el texto de la casilla, un icono y el estado inicial (true seleccionado, false no seleccionado) boolean isSelected() void setSelected (bolean) Obtiene o establece el estado del botn (seleccionado o no seleccionado). boolean getEnabled() void setEnabled(bolean) Obtiene o establece el estado de activacin del botn (Activado o desactivado).
o javax.swing.J RadioButton: esta clase implementa los botones de radio o de opcin que son una especializacin de un botn con estado o conmutador (J ToggleButton) caracterizados porque en un grupo de botones de opcin slo uno de ellos puede estar seleccionado, es decir, que so mutuamente excluyentes de modo que si se selecciona otro botn de radio distinto el anterior, deja de estar seleccionado. Para conseguir este comportamiento de excusin mutua los botones de radio se deben agrupar en un objeto de grupo de botones ButtonGroup. La forma de agruparlos es crear el grupo de botones, crear los botones y aadirlos al grupo mediante el mtodo add() de ButtonGroup, como si se tratara de un contenedor. Esta agrupacin es nicamente lgica, por tanto para dar al usuario la idea de que estn relacionados normalmente se incluyen en algn contenedor intermedio (por ejemplo, J Panel), y se le aade algn tipo de borde.
J RadioButton MTODO FUNCIONALI DAD J RadioBox(String, Icon, boolean) Constructor. Permite establecer el texto del botn de opcin, un icono y el estado inicial (true seleccionado, false no seleccionado) boolean isSelected() void setSelected (bolean) Obtiene o establece el estado del botn (seleccionado o no seleccionado). boolean getEnabled() void setEnabled(bolean) Obtiene o establece el estado de activacin del botn (Activado o desactivado).
Curso de J ava Standard Edition J 2SE 116 ButtonGroup MTODO FUNCIONALI DAD ButtonGroup() Constructor que crea un grupo de botones add(AbstractButton) Aade un botn al grupo de botones, de forma lgica
o javax.swing.J ComboBox: esta clase implementa un cuadro combinado desplegable, en el que se agrupan las funcionalidades de una lista y un campo de texto. El campo de texto y la lista de valores (su modelo) tienen una estrecha relacin de dependencia, de modo que si el usuario escribe texto en el cuadro la lista se desplaza hasta la concordancia ms prxima entre sus valores. Cuando el usuario selecciona un elemento de esa lista, ese valor pasa automticamente a mostrarse como contenido del cuadro combinado. En la lista, adems de valores textuales se pueden incluir iconos. Tiene dos posibles formas de uso: la primeroa forma es cuado se presenta una lista fija de posibles valores para que usuario las elija; y la segunda es cuando el usuario tambin puede introducir un nuevo valor a la lista.
MTODO FUNCIONALI DAD J ComboBox() J ComboBox(Object [ ]) J ComboBox(Vector) Constructores. El contenido inicial de la lista de valores se puede hacer a partir de un arreglo de objetos o de un Vector. void addItem(Object) void insertItemAt(Object,int) Aade un objeto al final de la lista de valores o lo inserta en una determinada posicin. Object getItemAt(int) Object getSelectedItem() Obtiene un elemento de una determinada posicin o el elemento actualmente seleccionado del cuadro combinado. Tiene los mtodos set correspondientes para establecer estos valores. void removeItemAt(int) void removeItem(Object) Elimina un objeto de la lista de la posibles valores, dada una posicin o un objeto especifico. void setEditable(boolean) boolean isEditable() Establece u obtiene si un campo combinado desplegable es editable o no void setMaximunRowCount(int) Establece el nmero mximo de filas que muestra para realizar la eleccin. Para acceder al resto presenta de forma automtica barras de desplazamiento.
Ejemplo: A continuacin se presenta el cdigo que ayuda a crear un J Frame con los componentes grficos de Swing vistos previamente.
package interfacesGraficas;
import java.awt.*; import javax.swing.*;
public class EjemploComponentesGraficos extends J Frame {
public EjemploComponentesGraficos() {
/ / CREAR LOS COMPONENTES DE LA VENTANA J Label jblNombre= new J Label("Nombre:"); J TextField jtfNombre = new J TextField("",10); J Button jbtBuscar = new J Button("Buscar");
Curso de J ava Standard Edition J 2SE 117 J RadioButton jrbOpcA = new J RadioButton("Femenino", true); J RadioButton jrbOpcB = new J RadioButton("Masculino"); ButtonGroup grupoOPC = new ButtonGroup(); grupoOPC.add(jrbOpcA); grupoOPC.add(jrbOpcB); Panel panelOPC = new Panel(); panelOPC.setName("Opciones"); panelOPC.add(jrbOpcA); panelOPC.add(jrbOpcB);
J CheckBox chkOp1 = new J CheckBox("Femenino"); J CheckBox chkOp2 = new J CheckBox("Masculino"); Panel panelCHK = new Panel(); panelCHK.setName("CASILLAS"); panelCHK.add(chkOp1); panelCHK.add(chkOp2);
String [] valores = new String[]{"Femenino","Masculino"}; J ComboBox jcbSexo = new J ComboBox(valores);
/ / AGREGAR COMPONENTES A LA VENTANA getContentPane().setLayout(new FlowLayout()); getContentPane().add(jblNombre); getContentPane().add(jtfNombre); getContentPane().add(jbtBuscar); getContentPane().add(panelOPC); getContentPane().add(panelCHK); getContentPane().add(jcbSexo);
// ESTABLECER PROPIEDADES GENERALES DE LA VENTANA setDefaultCloseOperation(J Frame.DISPOSE_ON_CLOSE); setTitle("Componentes Grficos Swing"); setSize(330, 200); }
public static void main(String[] args) { EjemploComponentesGraficos ventana; ventana = new EjemploComponentesGraficos(); ventana.setVisible(true); } }
Grafico 17. Ejemplo de los componentes grficos de Swing
o javax.swing.J List: esta clase implementa una lista de elementos que se presenta en forma de columna. En esta lista el usuario puede realizar la seleccin de uno (comportamiento predeterminado) o varios de sus elementos. Si la lista tiene muchos elementos y, por tanto, pueden no caber en el espacio de visualizacin asignado, debera incluirse dentro de un panel con barras de desplazamiento. Curso de J ava Standard Edition J 2SE 118 El contenido de una lista viene dado por su modelo de datos que debe implementar la interfaz J ava ListModel, aunque se proporcionan constructores y mtodos que crean automticamente dicho modelo a partir de un arreglo de objetos o de un Vector. Adems, se proporciona una implementacin predeterminada del modelo de datos de la lista mediante la clase DefaultListModel. Esta clase permite modificar el contenido de una lista de forma dinmica mediante los mtodos addElement() y removeElement().
MTODO FUNCIONALI DAD J List(ListModel) J List(Vector) J List(Object []) Constructores. Permiten crear la lista de datos a partir de una modelo de datos, una Vector o un arreglo de objetos void setListData(Vector) void setListData(Object [ ]) ListModel getModel() Establece u obtiene el modelo de datos de la lista (contenido) void setSelectionMode(int) int getSelectionMode() Establece u obtiene el modo de seleccin. Las posibilidades son: por omisin seleccin simple (SINGLE_SELECTION), la seleccin de un nico intervalo (SINGLE_INTERVAL_SELECTION) o la seleccin de intervalos mltiples (MULTIPLE_INTERVAL_SELECTION) int getSelectionIndex() int getMinSelectionIndex() int getMaxSelectionIndex() int [ ] getSelectedIndices() Object getSelectedValue() Object [] getSelectedValues() Obtiene el ndice o valor seleccionado (o ndices o valores dependiendo del modelo de seleccin que est activado). Estos mtodos tienen sus mtodos set correspondientes para establecer estos valores. void clearSelection() bolean isSelectionEmpty() Desactiva la seleccin actual o detecta si la seleccin es vaca.
o javax.swing.J Table: esta clase es usada para mostrar y editar cuadriculas regulares de dos dimensiones. En esta tabla el usuario puede realizar la seleccin de una (comportamiento predeterminado) o varias de filas o columnas. Si la tabla tiene muchos elementos y, por tanto, pueden no caber en el espacio de visualizacin asignado, debera incluirse dentro de un panel con barras de desplazamiento.
El contenido de la tabla viene dado por su modelo de datos que debe implementar la interfaz J ava TableModel, aunque se proporcionan constructores y mtodos que crean automticamente dicho modelo a partir de una matriz de objetos y de un arreglos de objetos o a partir de dos objetos de Vector.
MTODO FUNCIONALI DAD J Table() J Table(Object[][], Object[]) Constructor. Permite construir una tabla a partir de una matriz que posee el contenido de la Tabla y de un arreglo que contiene los encabezados de las columnas de la tabla. int getRowCount() int getColumnCount() Devuelve el nmero de filas y columnas de la Tabla. String getColumnName(int) Devuelve el nombre de la columna pasada por parmetro. Las filas y las columnas se numeran a partir de cero (0). Curso de J ava Standard Edition J 2SE 119
int getSelectedColumn() int [ ] getSelectedColumns() int getSelectedRow() int [ ] getSelectedRow() Devuelve el nmero o nmeros de la(s) columna(s) o de la(s) fila(s) seleccionada(s) respectivamente. Si no hay nada seleccionada devuelve -1.
Nota: Es importante tener en cuenta que si ocurre un cambio en el modelo, tanto de un J List o de un J Table, automticamente se actualiza el contenido del mismo.
Ejemplo: A continuacin se presenta el cdigo que ayuda a crear un J Frame con una Barra de Men y los componentes grficos de Swing J List y J Table.
// CREAR LOS COMPONENTES DE LA VENTANA J Label jblLista = new J Label("J Lista:"); J Label jblTabla1 = new J Label("J Table 1:"); J Label jblTabla2 = new J Label("J Table 2:");
// Crear la Lista de elementos Vector elementos = new Vector(5); elementos.add("Elemento 1"); elementos.add("Elemento 2"); elementos.add("Elemento 3"); elementos.add("Elemento 4"); elementos.add("Elemento 5"); J List jlLista = new J List(elementos);
// Crear la Tabla 1 String [][] contenido = new String[][]{ {"Celda 0","Celda 1","Celda 2"}, {"Celda 3","Celda 4","Celda 5"}, {"Celda 6","Celda 7","Celda 8"} }; String [] columnas = new String[]{"Columna 1","Columna 2","Columna 3"}; J Table jtTabla1 = new J Table(contenido,columnas);
// Crear la Tabla 2 String [][] contents = new String[5][3]; String [] colums = new String[]{"Col1","Col2","Col3"}; contents[2][2] = new String("Celda (2,2)"); J Table jtTabla2 = new J Table(contents,colums);
// AGREGAR COMPONENTES A LA VENTANA getContentPane().setLayout(new FlowLayout()); getContentPane().add(jblLista); getContentPane().add(jlLista); getContentPane().add(jblTabla1); Curso de J ava Standard Edition J 2SE 120 getContentPane().add(jtTabla1); getContentPane().add(jblTabla2); getContentPane().add(jtTabla2);
/ / Si se edita el Modelo, automticamente se actualiza la vista contents[3][0] = new String("Celda (3,0)");
// ESTABLECER PROPIEDADES GENERALES DE LA VENTANA setDefaultCloseOperation(J Frame.DISPOSE_ON_CLOSE); setTitle("Ejemplo de Listas y Tablas"); setSize(450, 250); }
public static void main(String[] args) { EjemploListaTabla ventana; ventana = new EjemploListaTabla(); ventana.setVisible(true); }
}
Grafico 18. Ejemplo de J List y J Table
o javax.swing.J MenuBar: esta clase implementa una barra de men que habitualmente se aade al panel raz de un contenedor, mediante el mtodo void setJ MenuBar(J MenuBar) del contenedor. Para crear una barra de mens se crea un objeto J MenuBar, al que posteriormente se le aaden los mens desplegables (objetos J Menu).
MTODO FUNCIONALI DAD J MenuBar() Constructor no necesita parmetros void add(J Menu) Permite aadir un men desplegable a una barra de men.
o javax.swing.J Menu: esta clase implementa cada uno de los mens desplegables asociados a las entradas o ttulos de una barra de mens. Un men desplegable debe estar asociado a una barra de men (J MenuBar). Para crear un men desplegable, al crearlo se le asigna su ttulo y posteriormente se le aaden el resto de los elementos de men o cadenas de texto que se desean que aparezcan.
Permite adems, crear mens en cascada, tambin llamados mens jerrquicos o secundarios. Para crearlos simplemente hay que aadir un men desplegable a otro men desplegable.
Curso de J ava Standard Edition J 2SE 121 MTODO FUNCIONALI DAD J Menu() J Menu(String) Constructores. Se puede dar el titulo que se muestra en la barra de men. J MenuItem add(J MenuItem) J MenuItem add(String) Aade un elemento al final del men desplegable. Tambin se puede aadir una cadena de texto. void addSeparator() Aade un separador al final de un men desplegable J MenuItem insert(J MenuItem, int) void insert(String, int) void insertSeparator(int) Inserta un elemento, una cadena o un separador en la posicin indicada del men. El ndice del primer elemento del men es 0. void remove(J MenuItem) void remove(int) void removeAll() Elimina un elemento del men a partir del objeto o de una posicin especifica. Adems permite eliminar todos los elementos.
o javax.swing.J MenuItem: esta clase es la implementacin de un elemento de un men desplegable. Un tem de men es esencialmente un botn situado la lista de opciones de un men. Cuando el usuario selecciona el botn (J MenuItem), la accin asociada al tem del men es realizada.
MTODO FUNCIONALI DAD J MenuItem(String) J MenuItem(String, Icon) Constructores. Se puede especificar el texto y un icono al elemento del men desplegable. void setEnabled(boolean) Activa o desactiva el elemento del men
Ejemplo: A continuacin se presenta el cdigo que ayuda a crear un J Frame con una Barra de Men.
package interfacesGraficas;
import javax.swing.*;
public class EjemploMenus extends J Frame {
public EjemploMenus() { // CREAR LOS COMPONENTES DE LA VENTANA J MenuItem itmOPC1 = new J MenuItem("Opcion 1"); J MenuItem itmOPC2 = new J MenuItem("Opcion 2"); J MenuItem itmOPC3 = new J MenuItem("Opcion 3"); J MenuItem itmOPC4 = new J MenuItem("Opcion 4"); J Menu mnu1 = new J Menu("Menu 1"); mnu1.add(itmOPC1); mnu1.add(itmOPC2); mnu1.add(itmOPC3); mnu1.add(new J CheckBoxMenuItem("Opcion CHK")); mnu1.add(new J Separator()); mnu1.add(itmOPC4);
J Menu mnu2 = new J Menu("Menu 2"); mnu2.add(new J MenuItem("Opcion 5")); mnu2.add(new J MenuItem("Opcion 6")); mnu2.add(new J MenuItem("Opcion 7"));
J MenuBar mnuBar = new J MenuBar(); mnuBar.add(mnu1); mnuBar.add(mnu2);
Curso de J ava Standard Edition J 2SE 122 // AGREGAR COMPONENTES A LA VENTANA getRootPane().setJ MenuBar(mnuBar);
// ESTABLECER PROPIEDADES GENERALES DE LA VENTANA setDefaultCloseOperation(J Frame.DISPOSE_ON_CLOSE); setTitle("Ejemplo de Menus"); setSize(450, 250); }
public static void main(String[] args) { EjemploMenus ventana; ventana = new EjemploMenus(); ventana.setVisible(true); } }
Grafico 19. Ejemplo de Mens en J ava
Curso de J ava Standard Edition J 2SE 123 3 3. . L LO OS S A AD DM MI I N NI I S ST TR RA AD DO OR RE ES S D DE E D DI I S SE E O O
Un administrador de disposicin o diseo es un objeto auxiliar que colabora con la aplicacin, y con el sistema operativo en la sta se ejecuta, para determinar la mejor manera de mostrar los elementos grficos en la ventana principal de la aplicacin. Un administrador de disposicin permite una mayor flexibilidad y control para colocar los componentes grficos dentro de un contenedor, a la vez que proporciona portabilidad e independencia frente a la plataforma concreta en la que se ejecuta. Por ejemplo, el programador no tiene que preocuparse sobre qu pasa si el usuario cambia el tamao de la ventana, el tamao de la pantalla o si su aplicacin se ejecuta en Windows o UNIX.
La administracin de diseo es el proceso en el que se determina el tamao y la posicin de los componentes grficos de un contenedor. En este proceso se tiene en cuenta las sugerencias de tamao de cada componente (su tamao mnimo, preferido y mximo) y, en la mayora de los casos el orden en el que se han aadido al contenedor. El administrador de diseo acta de forma automtica cada vez que se ha realizado alguna modificacin en el contenedor que pueda producir un cambio en su presentacin grfica.
Cada contenedor (Conteiner) tiene asignado de forma predeterminada un administrador de diseo. En el constructor de cada contenedor se crea y se asigna un administrador de disposicin por omisin, que puede ser cambiado por el programador.
o J Panel FlowLayout o J Frame BorderLayout o J Dialog BorderLayout o J Window FlowLayout
Si el programador desea cambiar el administrador predeterminado, primero debe crear un objeto del tipo de administrador deseado y despus asociarlo al contenedor. La asociacin se realiza mediante el mtodo del contenedor void setLayout(LayoutManager lay). El tipo de administrador puede cambiar la forma en la que se aaden los componentes al contenedor.
Otra posibilidad es no utilizar un administrador de diseo y realizar una colocacin absoluta de los componentes dentro del contenedor. Para esto simplemente hay que especificar que el administrador para dicho contenedor es null. No obstante, esta posibilidad no es muy recomendable en la mayora de los casos, ya que la aplicacin puede no presentarse de forma adecuada si se ejecuta en una plataforma diferente o si se cambia la resolucin de la pantalla.
3 3. .1 1. . T TI I P PO OS S D DE E A AD DM MI I N NI I S ST TR RA AD DO OR RE ES S D DE E D DI I S SE E O O
En las primeras versiones de J ava, que slo tenan AWT, se proporcionaban de forma estndar cinco administradores de diseo:
o FlowLayout o BorderLayout o GridLayout Todos los administradores implementan la interfaz LayoutManager o CardLayout o GridBagLayout
Curso de J ava Standard Edition J 2SE 124 o FlowLayout: es el administrador de disposicin ms simple que proporciona J ava y es el que se proporciona por omisin en los paneles (J Panel). Los componentes se colocan en una fila de izquierda a derecha hasta ocupar el espacio horizontal completo asignado al contenedor, segn el orden en el que han sido aadidos. Si todos los componentes, no caben en una sola fila, se sigue en la siguiente. Los componentes se dimensionan segn el tamao que necesitan (su tamao preferido) y dentro de cada fila se muestran centrados por omisin.
Ejemplo: A continuacin se presenta el cdigo que ayuda a crear un J Frame con el administrador de diseo FlowLayout, as como los elementos que administra.
package interfacesGraficas;
import java.awt.*; import javax.swing.*;
public class EjemploFlowLayout extends J Frame { // Constructor de la Ventana public EjemploFlowLayout() { setTitle(Administrador de Diseo: FlowLayout); getContentPane().setLayout(new FlowLayout()); getContentPane().add(new J Button(Botn 1)); getContentPane().add(new J Button(Segundo Botn)); getContentPane().add(new J Button(3 Botn)); getContentPane().add(new J Button(Bot. 4)); getContentPane().add(new J Button(Botn5)); } // Mtodo principal public static void main(String[] args) { EjemploFlowLayout Flow = new EjemploFlowLayout(); Flow.pack(); Flow.setVisible(true); } }
Grafico 20. Administrador de Diseo FlowLayout
El administrador FlowLayout proporciona tres constructores: o public FlowLayout() o public FlowLayout(int aligment) o public FlowLayout(int algment, int horizontalGAP, int verticalGAP)
Es obligatorio que el argumento aligment tenga el valor FlowLayout.LEFT, FlowLayout.CENTER o FlowLayout.RI GHT. Los argumentos horizontalGAP y verticalGAP especifican el nmero de pxeles presentes entre los componentes. Si no se especifica ningn valor de espaciado (GAP), FlowLayout asume el valor de cinco (5 pxels) por omisin.
o BorderLayout: Es el administrador predeterminado de los contenedores de alto nivel (J Frame y J Dialog). Este administrador de disposicin est basado en dividir el contenedor en cinco zonas, una central y otras cuatro segn los puntos cardinales. Los puntos Curso de J ava Standard Edition J 2SE 125 cardinales norte, sur, este y oeste se corresponden con las partes superior, inferior, izquierda y derecha del contenedor. No es necesario utilizar todas las zonas, de modo que las zonas ocupadas se reparten el espacio disponible. La zona central se considera privilegiada y trata de ocupar la mayor parte del espacio del contenedor.
Al aadir un componente a un contenedor que utilice BorderLayout., se debe indicar la zona en la que se quiere colocar el componente. Cada una de estas zonas estn indentificadas por la correspondiente constantes de clase: BorderLayout.CENTER, BorderLayout.NORTH, BorderLayout.SOUTH, BorderLayout.EAST y BorderLayout.WEST. El componente aadido debe ocupar todo el espacio asignado a su zona y, por omisin, no se deja espacio entre las distintas zonas. Si slo se incluye un componente y no se indica la zona, se coloca en la zona central y ocupa todo el espacio disponible.
Ejemplo: A continuacin se presenta el cdigo que ayuda a crear un J Dialog con el administrador de diseo BorderLayout, as como los elementos que administra.
package interfacesGraficas;
import java.awt.*; import javax.swing.*;
public class EjemBorderLayout extends J Dialog { public EjemBorderLayout() { J Button b1, b2, b3, b4, b5; b1 = new J Button(Botn 1 (CENTER)); b2 = new J Button(Segundo Botn (NORTH)); b3 = new J Button(3 Botn (SOUTH)); b4 = new J Button(Bot. 4 (EAST)); b5 = new J Button(Botn5 (WEST)); // Se obtiene el panel de contenido Container panelContenido = getContentPane(); // Se aaden los botones al panel de contenido panelContenido.setLayout(new BorderLayout()); panelContenido.add(b1, BorderLayout.CENTER); panelContenido.add(b2, BorderLayout.NORTH); panelContenido.add(b3, BorderLayout.SOUTH); panelContenido.add(b4, BorderLayout.EAST); panelContenido.add(b5, BorderLayout.WEST); } public static void main(String[] args) { EjempBorderLayout Border = new EjemBorderLayout(); Border.setTitle(Administrador de Diseo: BorderLayout); Border.pack(); Border.setVisible(true); } }
Grfico 21. Administrador de Diseo BorderLayout
El administrador BorderLayout proporciona dos constructores: uno vaco BorderLayout() y otro en el que se puede especificar en pxeles una separacin horizontal y vertical entre las zonas BorderLayout(int horizontalGAP, int verticalGAP).
o GridLayout: con este administrador los componentes se colocan en una matriz de celdas (definida por el nmero de filas y columnas) que ocupa todo el espacio asignado al Curso de J ava Standard Edition J 2SE 126 contenedor. Todas las celdas son iguales y los componentes utilizan todo el espacio disponible para cada celda.
Al aadir los componentes se va rellenando la matriz primero por filas, cuando una fila est llena se pasa a la siguiente. Proporciona dos constructores, uno en el que solo se indican el nmero de filas y el nmero de columnas de la matriz GridLayout(int filas, int cols) y otro en el que adems, se especifica en pxeles la separacin horizontal y vertical entre celdas GridLayout(int filas, int cols, int horizontalGAP, int verticalGAP). Por lo menos uno de los argumentos que especifican el nmero de filas o columnas debe ser distinto de cero. Por omisin no hay espacio de separacin entre las celdas.
Ejemplo: A continuacin se presenta un ejemplo que puede ubicar nueve botones en tres filas y tres columnas.
package interfacesGraficas;
import java.awt.*; import javax.swing.*;
public class EjemploGridLayout extends J Frame {
public EjemploGridLayout() { // Se obtiene el panel de contenido Container panelContenido = getContentPane(); // Se aaden los botones al panel de contenido panelContenido.setLayout(new GridLayout(3, 3)); panelContenido.add(new J Button(Botn 1)); panelContenido.add(new J Button(2 Botn)); panelContenido.add(new J Button(Botn 3)); panelContenido.add(new J Button(4 Botn)); panelContenido.add(new J Button(Botn 5)); panelContenido.add(new J Button(6 Botn)); panelContenido.add(new J Button(Botn 7)); panelContenido.add(new J Button(8 Botn)); panelContenido.add(new J Button(Botn 9)); } public static void main(String[] args) { EjemploGridLayout Grid = new EjemploGridLayout(); Grid.setTitle(Administradores de Diseo: GridLayout); Grid.pack(); Grid.setVisible(true); } }
Grafico 22. Administrador de Diseo FlowLayout Curso de J ava Standard Edition J 2SE 127 o CardLayout: este administrador de disposicin permite gestionar distintos componentes que ocupan un mismo espacio de forma que en cada momento slo uno de ellos es visible. Utiliza la idea de PI LA en donde solo es visible el primer componente, de modo que para visualizar los otros hay que ir ponindolas sucesivamente en la parte superior. La ordenacin de la pila viene determinada por el orden en el que se han aadido los componentes. Estos son los mtodos de uso ms frecuente en CardLayout:
METODO FUNCIONALI DAD CardLayout() y CardLayout(int, int) Constructores. Se puede proporcionar la separacin void add(String, Object) Aade un componente al contenedor y le da nombre void first(Container) void last(Container) void next(Container) void previous(Container) Selecciona el primer componente, el ltimo, el siguiente o el componente anterior del mazo. Al ser seleccionado se muestra automticamente. El orden es segn se han aadido al contenedor. void show(Container, String) Muestra el componente cuyo nombre se proporciona
public class EjemploCardLayout extends J Frame implements ItemListener{ J Panel cards; public EjemploCardLayout() { // Se obtiene el panel de contenido Container panelContenido = getContentPane(); // Se aaden los botones al panel de contenido panelContenido.setLayout(new BorderLayout()); // Se crea y agrega el combo de seleccin de elementos J Panel cp = new J Panel(); Choice c = new Choice(); c.add(J Button); c.add(TextField); c.add(J Label); c.addI temListener(this); cp.add(c); panelContenido.add(BorderLayout.NORTH, cp); // Se crean y agregan los componentes a sobreponer cards = new J Panel(); cards.setLayout(new CardLayout()); J Panel p1 = new J Panel(); p1.add(new J Button(Botn 1)); J Panel p2 = new J Panel(); p2.add(new TextField(TextField, 20)); J Panel p3 = new J Panel(); p3.add(new TextArea(J Label,20)); cards.add(J Button, p1); cards.add(TextField, p2); cards.add(J Label, p3); panelContenido.add(BorderLayout.CENTER, cards); } public void itemStateChanged(ItemEvent ie) { CardLayout c1 = (CardLayout) (cards.getLayout()); c1.show(cards, (String) ie.getItem()); } public static void main(String[] args) { EjemploCardLayout Card = new EjemploCardLayout(); Card.setTitle(Administradores de Diseo: CardLayout); Card.pack(); Card.setVisible(true); } }
Grfico 23.Administrador de Diseo CardLayout Curso de J ava Standard Edition J 2SE 128 o GridBagLayout: es el administrador de disposicin ms verstil y funcional, ya que permite organizar los componentes tanto verticalmente como horizontalmente, aunque tengan distinto tamao. Con este propsito mantiene una malla dinmica rectangular de celdas, donde las filas y columnas pueden tener distinto tamao, en las que se sitan los componentes. Un componente puede ocupar varias celdas contiguas. La situacin y espacio ocupado por cada uno de los componentes se describe por medio de restricciones (constrains). A cada componente se le asocia un objeto de la clase GridBagConstrains que especifica las restricciones y que, junto con las indicaciones de tamao del componente (tamao mnimo y preferido), determinan la presentacin final del objeto en el contenedor.
CONSTRAINS DESCRI PCI N GridBagConstraints.gridx GridBagConstraints.gridy Especifica la celda superior izquierda en el rea de pantalla del componente, donde la celda superior izquierda tiene la direccin gridx=0, gridy=0. el valor por omisin, GridBagConstraints.RELATI VE indica que el componente debe simplemente colocarse a la derecha de (para gridx) o justo debajo del (para gridy) componente que se aadi al contenedor justo antes de que este componente fuera aadido. GridBagConstraints.gridwidth GridBagConstraints.gridheight Especifica el nmero de celdas en una fila (gridwidth) o columna (gridheight) en el rea de pantalla del componente. El valor predeterminado es 1. GridBagConstraints.REMAI NDER indica que el componente tiene que ser el ltimo en su fila (gridwith) o columna (wridheight). GridBagConstraints.fill Se utiliza cuando el rea de pantalla del componente es mayor que el tamao solicitado del componente, a fin de averiguar si debe, y cmo, redimensionar el componente. Los valores posibles para ste son: GridBagConstraints.NONE (valor por omisin), GridBagConstraints.HORIZONTAL (para hacer suficientemente ancho al componente para rellenar su rea en forma horizontal), GridBagConstraints.VERTICAL(para hacer suficientemente alto al componente para rellenar su rea en forma vertical) y GridBagConstraints.BOTH (para que rellene toda su rea). GridBagConstraints.ipadx GridBagConstraints.ipady Especifica el relleno interno del componente dentro del diseo. Nos dice cunto ms se necesita aadir al tamao mnimo del mismo. El ancho del componente debe ser al menos el ancho mnimo ms ipadx*2 pxeles. Esto es debido a que el relleno se aplica a ambos lados del componente. En forma similar, la altura del componente debe ser al menos la altura mnima ms ipdy*2 pxeles. GridBagConstraints.insets Especifica el relleno externo del componente, la cantidad mnima de espacios entre el componente y los lmites de su rea de pantalla. GridBagConstraints.anchor Se usa cuando el componente es ms pequeo que su rea de pantalla y permite determinar dnde tiene que colocarse el componente, dentro del rea de pantalla. Los valores vlidos son: GridBagConstraints..CENTER (valor por omisin). Los otros valores vlidos son: GridBagConstraints.NORTH, GridBagConstraints.NORTHEAST, GridBagConstraints.EAST, GridBagConstraints.SOUTHEAST, GridBagConstraints.SOUTH, GridBagConstraints.SOUTHWEST, GridBagConstraints.WEST, GridBagConstraints.NORTHWEST. GridBagConstraints.weightx GridBagConstraints.weighty Permite determinar como distribuir el espacio, cuando se especifica el comportamiento de cambio de tamao. Si no especificamos un peso para al menos un componente en una fila (weightx) y columna (weighty), todos los componentes que han sido ubicados se amontonarn en el centro del contenedor. Esto ocurre porque el GridBackLayout coloca todo el espacio extra entre su malla de celdas y los lmites del objeto contenedor, cuando el peso es cero.
Ejemplo: El siguiente cdigo genera tres componentes, administrados por GridBagLayout.:
Curso de J ava Standard Edition J 2SE 129 package interfacesGraficas;
import java.awt.*; import javax.swing.*;
public class EjemploGridBagLayout extends J Frame { public EjemploGridBagLayout() { / ** Se obtiene el panel de contenido * */ Container panelContenido = getContentPane(); GridBagLayout gb1 = new GridBagLayout(); panelContenido.setLayout(gb1); / ** CREA UN CAMPO DE TEXTO * */ J TextField display = new J TextField(12); // Aade las restricciones para el campo de texto GridBagConstraints displayConstraints = new GridBagConstraints(); displayConstraints.gridx = 0; displayConstraints.gridy = 0; displayConstraints.gridwidth = 4; displayConstraints.gridheight = 1; displayConstraints.fill = GridBagConstraints.HORIZONTAL; // Aade el campo de texto gb1.setConstraints(display, displayConstraints); panelContenido.add(display); / ** CREA UN BOTN LIMPI AR * */ J Button clear = new J Button(Limpiar); // Aade las restricciones para el Boton GridBagConstraints clearConstraints = new GridBagConstraints(); clearConstraints.gridx = 0; clearConstraints.gridy = 1; clearConstraints.gridwidth = 1; clearConstraints.gridheight = 1; clearConstraints.fill = GridBagConstraints.BOTH; clearConstraints.insets = new Insets(3, 3, 3, 3); // Aade el boton gb1.setConstraints(clear, clearConstraints); panelContenido.add(clear); / ** CREA UN BOTN IGUAL * */ J Button equal = new J Button(Igual); // Aade las restricciones para el Boton GridBagConstraints equalConstraints = new GridBagConstraints(); equalConstraints.gridx = 1; equalConstraints.gridy = 1; equalConstraints.gridwidth = 1; equalConstraints.gridheight = 1; equalConstraints.fill = GridBagConstraints.BOTH; equalConstraints.insets = new Insets(3, 3, 3, 3); // Aade el boton gb1.setConstraints(equal, equalConstraints); panelContenido.add(equal); } public static void main(String[] args) { EjemploGridBagLayout egbl = new EjemploGridBagLayout(); egbl.setTitle(Administradores de Diseo: GridBagLayout); egbl.pack(); egbl.setVisible(true); } }
Grfico 24. Administrador de Diseo GridBagLayout
Curso de J ava Standard Edition J 2SE 130 4 4. . E EV VE EN NT TO OS S
El usuario se comunica con una aplicacin con interfaz grfica, mediante la interaccin con dicha interfaz (por ejemplo, se pulsa el ratn o se escribe texto). Como resultado de estas acciones se generan eventos. El tratamiento o gestin de estos eventos, mediante la ejecucin de un mtodo o mtodos en el que se responde a la accin del usuario, es la forma de obtener la interactividad de la aplicacin. Este modo de programar se denomina programacin dirigida por eventos.
4 4. .1 1. . M MO OD DE EL LO O D DE E D DE EL LE EG GA AC CI I N N D DE E E EV VE EN NT TO OS S
En J ava el tratamiento de los eventos se realiza mediante el Modelo de Delegacin de Eventos. La idea bsica del modelo es que el tratamiento de un evento que ocurre en un objeto (objeto fuente) no se realiza en ese mismo objeto, sino que se delega en otro objeto diferente (objeto oyente). Este modelo se basa en la posibilidad de propagacin o envo de eventos desde el objeto fuente donde se producen a los objetos oyentes que los gestionan. La forma de hacerlo es la siguiente: o El objeto fuente registra qu objetos oyentes estn interesados en recibir algn evento especfico, para comunicrselo una vez ste se produzca. o Cuando ocurre el evento, el objeto fuente se lo comunica a todos los oyentes registrados. o La comunicacin entre la fuente y el oyente se realiza mediante la invocacin de un mtodo del oyente, proporcionado como parmetro el evento generado.
Un evento es un objeto en el que se encapsula toda la informacin sobre la interaccin del usuario con los componentes de la interfaz grfica. Por tanto, cuando un oyente recibe un evento dispone de toda la informacin asociada a dicha interaccin. Existe una jerarqua de clases de eventos, en las que cada tipo de evento se representa mediante una clase diferente.
Esta separacin entre fuente y oyente facilita la creacin de cdigo robusto para la gestin de eventos. Adems, esto permite una separacin clara entre el cdigo propio de la aplicacin (modelo), el cdigo que genera la interfaz (vista) y el cdigo que gestiona la interfaz (controlador).
Grfico 25. Modelo de delegacin de eventos
Es de hacer notar, que este modelo de tratamiento de eventos es simple pero muy verstil y fcil de ampliar, ya que un objeto fuente puede tener registrados varios oyentes y un mismo oyente puede estar registrado en varios objetos fuente.
Se pasa el EVENTO a los oyentes ACCIN DEL USUARIO COMPONENTE (VISTA)
Objeto Fuente LISTENER (CONTROLADOR)
Procesa el evento LISTENER 2 (CONTROLADOR)
Procesa el evento Se pasa el EVENTO a los oyentes Curso de J ava Standard Edition J 2SE 131
4 4. .2 2. . E EV VE EN NT TO OS S, , O OB BJ J E ET TO OS S F FU UE EN NT TE E Y Y O OB BJ J E ET TO OS S O OY YE EN NT TE E
En funcin de la interaccin concreta que realice el usuario y dependiendo de qu tipo de componente grfico est implicado se producirn uno o varios eventos. Dicho componente es el objeto fuente en el que se crea un evento de la clase correspondiente, que se transmite al oyente u oyentes que lo gestionan. Para poder gestionar el registro y eliminacin de objetos oyentes (Listeners) de cada evento concreto se proporcionan tres mtodos:
o void set<TipoEvento>Listerner(Listener obj): establece un objeto oyente para el TipoEvento. o void add<TipoEvento>Listener(Listener obj): aade el objeto a la lista de oyentes. o void remove<TipoEvento>Listener(Listener obj): elimina el objeto oyente correspondiente.
Los eventos estn representados en una jerarqua de clases cuya raz es la clase java.util.EventObject. Esta clase tiene como nico atributo el objeto en el que se ha generado el evento y proporciona el mtodo Object getSorce(), para acceder a l. El resto de las clases que la especializan representan tipos de eventos concretos y encapsulan toda la informacin necesaria para dar respuesta a ese tipo de interaccin (por ejemplo, qu botn del ratn se ha presionado, el instante y la posicin donde se ha producido, si se tena presionado alguna trecla modificadora tal como Ctrl. O AltGr, etc.). Esta informacin se obtiene mediante los mtodos de acceso correspondientes get<Atributo>().
Un objeto oyente o Listener aquel que gestiona, maneja o responde a un evento. Con este propsito define uno o varios mtodos que sern ejecutados automticamente por la fuente de eventos en respuesta a cada tipo de evento especfico. En esta llamada automtica al mtodo correspondiente del oyente se pasa como argumento un objeto de la clase de evento generada.
En el tratamiento o gestin de eventos hay que seguir tres pasos:
Crear una clase oyente del tipo de eventos que implemente la interfaz J ava correspondiente.
Implementar en la clase oyente el mtodo o mtodos de la interfaz J ava correspondiente.
Crear un objeto de la clase oyente y registrarlo como Listener de uno o ms componentes grficos en los que se desea proporcionar esa interaccin con el usuario.
Ejemplo: A continuacin se presenta un ejemplo sencillo en el que se crea una aplicacin con una interfaz grfica para ilustrar la gestin de eventos.
La interfaz grfica de la aplicacin consta de una ventana principal en la que se presenta una etiqueta y dos botones. La etiqueta y los botones se agrupan aadindolos a un panel contenedor que despus se aade al panel de contenido de la ventana principal.
En la aplicacin se incluye una clase interna que acta como oyente de eventos de tipo accin (ActionListener) para gestionar las interacciones con los botones. En esta clase, como respuesta a la pulsacin por parte del usuario, el programa modifica el texto de la etiqueta indicando el botn que ha pulsado. Ntese que se registra el mismo objeto oyente en dos objetos fuente diferentes (los dos botones). Una clase interna es muy adecuada, ya que tenemos acceso a todos los elementos de la clase en la que est definida (en este caso la etiqueta). package interfacesGraficas; Curso de J ava Standard Edition J 2SE 132
import java.awt.event.*; import javax.swing.*;
public class EjemploEventos extends J Frame { / / Componentes de la ventana J Label etiqueta; J Button botonHola; J Button botonAdios; J Panel panel;
public EjemploEventos() { / / Se crean los componentes de la ventana etiqueta = new J Label("Etiqueta inicial"); botonHola = new J Button("Hola"); botonAdios = new J Button("Adios"); panel = new J Panel(); / / Se aaden los componentes al panel panel.add(etiqueta); panel.add(botonHola); panel.add(botonAdios); / / Aade el panel a la venta principal getContentPane().add(panel); / / Se crea un objeto oyente de accin que se registra en los dos botones OyenteAccion oyenteBoton = new OyenteAccion(); botonHola.addActionListener(oyenteBoton); botonAdios.addActionListener(oyenteBoton); } public static void main(String[] args) { EjemploEventos ventana = new EjemploEventos(); ventana.setTitle("Ejemplo simple de Eventos"); ventana.setSize(350, 70); ventana.setVisible(true); } /** * CLASE INTERNA: Se crea la Clase Oyente de Eventos de accin (ActionListener) */ class OyenteAccion implements ActionListener { public void actionPerformed(ActionEvent evento) { // Se obtiene el botn fuente del evento J Button boton = (J Button) evento.getSource(); // Tratamiento del evento if (boton.getText().equalsIgnoreCase("Hola")) etiqueta.setText("Se ha presionado el botn HOLA"); else if (boton.getText().equalsIgnoreCase("Adios")) etiqueta.setText("Se ha presionado el botn ADIOS"); } }
}
Grfico 26. Ejemplo de manejo de eventos
Curso de J ava Standard Edition J 2SE 133
4 4. .3 3. . J J E ER RA AR RQ QU U A A Y Y T TI I P PO OS S D DE E E EV VE EN NT TO OS S
Como se ha mencionado previamente, los eventos se organizan en una jerarqua de clases, donde cada clase representa un tipo de evento o un grupo de eventos relacionados, cuya raz es java.util.EventObject. Esta clase deriva de la clase java.awt.AWTEvent para tener en cuenta los eventos generados por los componentes grficos.
En el paquete java.awt.event se encuentran la mayora de las definiciones de clases e interfaces necesarias para la gestin de eventos generados en una interfaz grfica sencilla. Con la aparicin de Swing este paquete se ha visto complementado por javax.swing.event, donde se representan los eventos propios de las nuevas caractersticas propias de Swing.
Conceptualmente los eventos generados en los componentes grficos se pueden clasificar en: o Eventos de bajo nivel: stos estn relacionados con los aspectos fsicos de la interaccin con los elementos de la interfaz. Representan las modificaciones en el sistema de ventanas (por ejemplo cambio de tamao, cambio de posicin, obtencin o prdida del foco) o las entradas producidas por el usuario (con el teclado o ratn). o Eventos semnticos (o de alto nivel): representan la operacin con un elemento de la interfaz. Se denominan semnticos porque tratan de capturar el significado de la interaccin, por ejemplo seleccionar un elemento. No estn relacionados con una clase especfica de componente, siendo aplicables a todos los componentes que implementen un modelo de operacin similar. No obstante, estos componentes no tienen que generar dicho evento de la misma forma, por ejemplo, el evento ActionEvent se genera cuando se hace clic sobre un botn o cuando se pulsa la tecla Intro en un campo de texto.
EVENTOS DE BAJ O NI VEL EVENTO DESCRI PCIN ComponentEvent Cambios en el tamao, posicin o visibilidad de un componente FocusEvent Cambio de foco (capacidad de un componente para recibir entradas desde el teclado) KeyEvent Operacin con el teclado MouseEvent Operacin con los botones del ratn o movimientos del ratn WindowEvent Cambio de estado en una ventana AncestorEvent Cambio en la composicin, visibilidad o posicin de un elemento superior (ancestro) de la jerarqua de composicin EVENTOS DE ALTO NI VEL EVENTO DESCRI PCIN ActionEvent Realizacin de una accin especfica asociada al componente ChangeEvent Cambio de estado del componente ItemEvent Elemento seleccionado o deseleccionado CaretEvent Cambio en la posicin del cursor de insercin en un componente que gestiona texto ListSelectionEvent Cambio en la seleccin actual en una lista
Curso de J ava Standard Edition J 2SE 134 4 4. .4 4. . C CL LA AS SE ES S O OY YE EN NT TE ES S D DE E E EV VE EN NT TO OS S ( (L LI I S ST TE EN NE ER RS S) )
Un Listener es el objeto que es notificado siempre que se genera un evento. Tiene dos requerimientos principales: el listener debe ser registrado con una o ms fuentes para recibir notificaciones cuando un evento especfico se genere, y tambin debe implementar mtodos para recibir y procesar estas notificaciones.
Como se explico anteriormente, el modelo de delegacin de eventos tiene dos partes: los objetos fuente y los listeners. Los listeners se crean implementando una o ms de las interfaces definidas por el paquete java.awt.event. Cuando ocurre un evento, el fuente invoca al mtodo apropiado definido por el listener y le proporciona el objeto evento como su parmetro. A continuacin se listan algunos de los Listeners ms importantes:
LISTENER DESCRIPCIN MTODOS ActionListener Define un mtodo para recibir eventos de accin void actionPerformed(ActionEvent) FocusListener Define dos mtodos para reconocer instancias cuando un componente adquiere o pierde el control del teclado (Foco) void focusGained(FocusEvent) void focusLost(FocusEvent) KeyListener Define tres mtodos para reconocer cundo se presiona, libera o golpea una tecla void keyPressed(KeyEvent) void keyReleased(KeyEvent) void keyTyped(KeyEvent) MouseListener Define siete mtodos para identificar instancias cuando el ratn hace clic, entra a un componente, sale del componente, presiona o liber void mouseClicked(MouseEvent) void mouseEntered(MouseEvent) void mouseExited(MouseEvent) void mousePressed(MouseEvent) void mouseReleased(MouseEvent) MouseMotionListener Define 2 mtodos para cuando se arrastra o se mueve el ratn void mouseDragged(MouseEvent) void mouseMoved(MouseEvent) TextListener Define un mtodo de identificar cambios en los valores de texto void textChanged(TextEvent) WindowListener Define siete mtodos para identificar instancias cuando una ventana se activa, se cierra, se restaura, se minimiza (iconiza), se abre o se sale de ella void windowActivated(WindowEvent) void windowClosed(WindowEvent) void windowDeactivated(WindowEvent) void windowDeiconfied(WindowEvent) void windowInconfied(WindowEvent) void windowOpened(WindowEvent) void windowClosing(WindowEvent)
4 4. .5 5. . C CL LA AS SE ES S A AD DA AP PT TA AD DO OR RA AS S D DE E E EV VE EN NT TO OS S
La mayora de la interfaces oyentes estn diseadas para responder a varios eventos diferentes, de modo que incluyen ms de un mtodo. Por ejemplo, el oyente de interacciones de ratn (MouseListener) contiene cinco mtodos relacionados con la operacin de los botones y el movimiento del mismo; esto provoca que la clase oyente deba implementarlos todos, aunque slo le interese alguno de ellos, y deje vacos los otros (si no lo hace la clase sera abstracta).
Curso de J ava Standard Edition J 2SE 135 Para simplificar la escritura de Listeners J ava proporciona un conjunto de clases adaptadoras abstractas, que incluyen las definiciones vacas de los mtodos correspondientes. As un oyente se puede crear especializando un adaptador e implementando slo el mtodo que interese. En J ava se incluye una clase adaptadora por cada Listener que tiene ms de un mtodo.
public class EjemploAdapters extends J Frame { public J Label etiqueta; public EjemploAdapters() { // agregar el componente grfico etiqueta = new J Label("Eventos:"); getContentPane().add(etiqueta); / / Registrar los oyentes de evento addMouseListener(new MyMouseAdapter(this)); addMouseMotionListener(new yMouseMotionAdapter(this)); } public static void main(String[] args) { EjemploAdapters ventana = new EjemploAdapters(); ventana.setTitle("Ejemplo de Clases Adpatadoras"); ventana.setSize(300, 200); ventana.setVisible(true); } }
// Clase adaptadora para eventos de Acciones del Ratn class MyMouseAdapter extends MouseAdapter { EjemploAdapters fuente; // Objeto de referencia al fuente public MyMouseAdapter(EjemploAdapters obj) { fuente = obj; } // Maneja el click del ratn public void mouseClicked(MouseEvent me) { fuente.etiqueta.setText("Click del ratn..."); } } // Clase adaptadora para eventos de Movimiento del Ratn class MyMouseMotionAdapter extends MouseMotionAdapter { EjemploAdapters fuente; // Objeto de referencia al fuente public MyMouseMotionAdapter(EjemploAdapters obj) { fuente = obj; } // Maneja el arrastre del ratn public void mouseDragged(MouseEvent me) { fuente.etiqueta.setText("Ratn arrastrado..."); } }
Grfico 27. Ejemplo de Clases Adaptadores de Evento
Curso de J ava Standard Edition J 2SE 136 4 4. .6 6. . E EV VE EN NT TO OS S Y Y C CO OM MP PO ON NE EN NT TE ES S G GR R F FI I C CO OS S
Los distintos componentes grficos de una aplicacin pueden generar o ser fuentes de eventos y para cada uno de ellos se puede registrar un oyente correspondiente. Un evento que pueda generar una clase determinada, tambin lo podr generar cualquiera de sus especializaciones o clases derivadas. Por ejemplo todos los componentes son capaces de generar FocusEvent, KeyEvent, MouseEvent y MouseMotionEvent, ya que son los eventos generados por la clase java.awt.Component de la que son especializaciones los componentes grficos.
En la Tabla siguiente se presentan los componentes de uso ms frecuente junto con los eventos que pueden generar.
EVENTOS QUE PUEDE GENERAR COMPONENTE Swing ActionEvent ItemEvent ChangeEvent CaretEvent ListSelectionEvent J Button X X X J CheckBox X X X J ComboBox X X J TextField X X J RadioButton X X X J List X J TextArea X X J MenuItem X X J TabbedPane X J ToggleButton X X X J PasswordField X X J EditorPane X
Curso de J ava Standard Edition J 2SE 137
1 1. . C CO OM MP PI I L LA AC CI I N N Y Y E EJ J E EC CU UC CI I N N D DE E P PR RO OG GR RM MA AS S J J A AV VA A ( (J J A AV VA AC C/ / J J A AV VA A) )
Para crear un programa fuente de J ava se puede utilizar cualquier editor de texto, como Bloc de Notas. Una vez copiado el programa, se guarda el archivo con el mismo nombre de la clase (respetando maysculas y minsculas) y con extensin .java. Adicionalmente, existen editores especializados para J ava, tales como J Creator, Eclipse, NetBeans, etc., que proporcionan un IDE que facilita el proceso de creacin de programas J ava.
Se procede entonces a compilar el programa copiado usando el comando javac. Este comando genera el cdigo binario del programa en un archivo con el mismo nombre del programa copiado pero con extensin .class. La sintaxis del comando es la que sigue:
javac NombreCompletoDeLaClase.java
Para ejecutar el programa, simplemente se ejecuta el comando java. Dicho comando despierta a la J VM y es esta la que se encarga de ejecutar el programa (interpretar su cdigo binario). La sintaxis del comando es la que sigue:
java NombreCompletoDeLaClase
En la grafica siguiente se describe el proceso de compilacin y ejecucin de programas J ava:
PROGRAMA FUENTE J AVA (.J AVA) RESULTADOS DE LA EJ ECUCIN COMPILACI N (J AVAC) EJ ECUCIN (J AVA) CDIGO BINARIO (.CLASS) APNDICE I: Herramientas y Utilidades de desarrollo - BSICAS Curso de J ava Standard Edition J 2SE 138
1 1. .1 1. . E EJ J E EM MP PL LO O
Paso 1: Haga clic en el men Inicio y seleccione Programas Accesorios Bloc de Notas.
Paso 2: Escriba el siguiente cdigo.
package myPack;
/** * Ejemplo de un programa J ava simple * @autor Ronel J . Rivas R. * @version 1.0, Septiembre de 2005 */
public class a {
/** * Este mtodo transforma una cadena a un entero * @param cad String que representa la cadena a transformar * @return Un int que representa el valor numrico de la cadena */ public static int strToInt(String cad) { return Integer.parseInt(cad); }
/** * Programa Principal * @param args No utilizado * @return Nada */ public static void main(String[] args) { int r = 0;
System.out.println("El resultado es " + r + "."); }
}
Paso 3: Una vez copiado, haga clic en Guardar en el men Archivo. Guarde el archivo con el nombre SumarEnteros.java en el directorio Z:\myPack (si no existe el directorio, crelo).
Paso 4: Abra una consola del sistema. Para ello, haga clic en el men Inicio y seleccione Ejecutar. Aparecer un cuadro de dilogo donde debe escribir cmd. Se abrir una consola del intrprete de comandos de Windows. Cmbiese al directorio raz (C:\), escribiendo cd\.
Paso 5: Escriba el siguiente comando para compilar el programa: javac SumarEnteros.java
Paso 6: Se ha generado el cdigo binario. Escriba el siguiente comando para ejecutar el programa: java SumarEnteros 1 2 4 3
La salida podr ser vista en el intrprete de comandos, y ser algo como esto: El resultado es 10 Curso de J ava Standard Edition J 2SE 139
2 2. . E EL L D DO OC CU UM ME EN NT TA AD DO OR R D DE E J J A AV VA A ( (J J A AV VA AD DO OC C) )
J ava soporta tres tipos de comentarios.; los primeros dos son // y /* */, que permiten realizar una aclaratoria dentro del cdigo del programa. El tercer tipo es denominado comentario de documento, y comienza con la sucesin de caracteres /** y finaliza con */. Los comentarios de documentacin le permiten insertar informacin acerca de su programa dentro de l mismo. Entonces, puede utilizar el programa de utilidad javadoc para extraer sta informacin y ponerla dentro de un archivo HTML. Los archivos HTML generados por la aplicacin javadoc, son idnticos a la documentacin de la API de J ava.
2 2. .1 1. . E ET TI I Q QU UE ET TA AS S j ja av va ad do oc c
La utilidad javadoc reconoce las siguienteS etiquetas:
E ET TI I Q QU UE ET TA A S SI I G GN NI I F FI I C CA AD DO O S SI I N NT TA AX XI I S S @autor Identifica al autor de una clase @autor nombreAutor @deprecated Especifica que una clase o miembro est deprecado @deprecated descripcion {@docRoot} Especifica la ruta para el directorio raz de la documentacin actual {@docRoot} ruta @excepcion Identifica una excepcin lanzada por un mtodos @excepcion Excepcion Explicacin {@link} Inserta un vnculo en lnea a otro tema {@link nombre} nombre es el nombre de la clase o mtodo al que se est haciendo el hipervnculo @param Documenta los parmetros de un mtodo @param parmetro Explicacin @return Documenta un valor de retorno para un mtodo @return Explicacin @see Especifica un vnculo a otro tema @see ancla: hipervnculo a un URL @see pkg.clase#miembro: es un hipervnculo a un paquete, clase o miembro @serial Documenta un campo seriado por omisin @serial descripcion @serialData Documenta los datos escritos por los mtodos writeObject() o writeExternal() @serialData descripcion @serialField Documenta un componente de ObjectStreamField @serialField nombre tipo descripcin @since Establece actualizaciones en la que se introdujo un cambio especfico @since actualizacin @throws Lo mismo que excepcin @throws Excepcion Explicacin @version Especifica la versin de una clase @version nmero
Como se puede observar, todas las etiquetas de documentacin comienzan con un signo @. En un comentario de documentacin, tambin se pueden utilizar otras etiquetas estndar (<TAG></TAG>) de HTML. Sin embargo, algunas etiquetas tales como un ttulo no pueden ser empleadas, porque desorganizan la apariencia del archivo HTML producido por javadoc.
Curso de J ava Standard Edition J 2SE 140 Puede utilizar los comentarios de documentacin para documentar clases, interfaces, variables, constructores y mtodos. En todo caso, los comentarios de documentacin deben preceder inmediatamente al punto del cdigo que est siendo documentado.
Las siguientes son algunas sugerencias en el orden de las etiquetas de documentacin, a la hora de documentar su cdigo: - Clases e interfaces: @see, @author, @since, @serial, @version y @deprecated - Variables: @see, @since, @serial, @serialfield y @deprecated - Mtodos y Constructores: @see, @since, @param, @exception, @throws, @return, @serialData y @deprecated
2 2. .2 2. . F FO OR RM MA A G GE EN NE ER RA AL L D DE E L LO OS S C CO OM ME EN NT TA AR RI I O OS S D DE E D DO OC CU UM ME EN NT TA AC CI I N N
Despus del /** inicial, la primera lnea o lneas llegan a ser la descripcin principal de su clase, variable o mtodo. Despus de eso, puede incluir uno o ms rtulos @ (Etiquetas). Cada rtulo @ debe arrancar al comienzo de la nueva lnea, o a continuacin de un asterisco (*) que est al comienzo de la lnea. Mltiples rtulos del mismo tipo deben ser agrupados juntos. Ejemplos de Comentarios de Documentacin para:
- Clase: /** * Esta clase dibuja un grfico de barras * @autor Ronel J . Rivas R. * @version 1.0, Septiembre de 2005 */ public class J Bar {
}
- Variable: /** * Nombre del usuario, para ser utilizado en la verificacin de acceso * @see myPack.Users#password */ String userName;
- Mtodo: /** * Este mtodo introduce un nmero del usuario por teclado * @param args Representa la entrada del usuario en forma de cadena * @exception IOException En error de entrada * @see IOException * @return Un int que representa la entrada del usuario como nmero */ public int obtenerNumero(String args) throws IOException {
}
2 2. .3 3. . E EJ J E EC CU UT TA AR R E EL L j ja av va ad do oc c
La forma de ejecutar el documentador de java es la siguiente: