Monografia Lenguaje Java

MONOGRAFIA LENGUAJE JAVA INDICE POR TEMAS: 1234- 1234- Introducción. Características. Hot Java. Java para aplicaciones

Views 138 Downloads 1 File size 230KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

MONOGRAFIA LENGUAJE JAVA INDICE POR TEMAS: 1234-

1234-

Introducción. Características. Hot Java. Java para aplicaciones corporativas: 4.1- Desarrollo rápido de aplicaciones. 4.2- Portabilidad para programador y programa. 4.3- Costos de desarrollo. 4.4- Mantenimiento y soporte. 4.5- Aprendizaje. 5- 5Lo necesario para trabajar con Java. 6- 6Como hacer un programa en Java. 7- 7La gramática de Java: 7.1- Comentarios. 7.2- Identificadores. 8- 8Las aplicaciones y los Applets. 9- 9Clases, métodos, atributos y objetos de Java: 9.19.1Tipos de clases. 9.29.2Variables y métodos de instancia. 9.39.3Métodos y constructores. 9.49.4Herencia. 9.59.5Control de acceso. 9.69.6Variables y métodos estadísticos. 9.7Interfaces. 10-10- Creación a Applets sencillos. 11-11- Gráfico, texto y sonido. 12-12- Animaciones simples y multithreading. 13-13- Los eventos y la respuesta al usuario. 14-14- Concepto de jerarquía de componentes del programa 15-15- Como se utiliza Labels. 16-16- Como se utiliza Buttons. 17-17- Como se utiliza Checkboxes. 18-18- Como se utiliza Choise Menu. 19-19- Como se utiliza Text Fields. 20-20- Como se utiliza Text Area. 21-21- Como se utiliza Frames y Dialogs. 22-22- Como se utiliza Lists. 23- Como se utiliza Scrollbars 24- Como se utiliza Canvas. 25-25- Como se utiliza Panels. 26- Como se utiliza Scroll Panes. 27- Otros componentes. 28- Layout Manager. 29- Control de eventos (Event Handling). 30- Ejemplos de los temas vistos. 31- Paquetes de Java. 32- Algunas referencias.

1- INTRODUCCIÓN La empresa SUN MICROSYSTEMS, líder en servidores para Internet, ha desarrollado el Lenguaje Java, para resolver simultáneamente todos los problemas que se le plantean a los creadores de software por la proliferación de arquitecturas incompatibles, entre las diferentes máquinas y diversos sistemas operativos, y sistemas de ventanas que funcionaban sobre una misma máquina, sumándose a esto la dificultad de crear aplicaciones distribuidas en una red como Internet. En la Argentina, muchas empresas están usando o considerando el uso de Java, y en los avisos clasificados, cada vez más requieren personal con conocimiento de este lenguaje. Este lenguaje nuevo ha causado sensación, porque posee estricta orientación a objetos, menor tiempo de desarrollo, mayor portabilidad, más seguridad, simplicidad en la distribución de software, orientación a redes, programación multitarea, etc. Ocupa un lugar importante en la lista de lenguajes a tener en cuenta cundo se va a desarrollar aplicaciones, particularmente en el caso de aplicaciones de negocios que implican conexión a red, arquitecturas multiusuarios, cliente/servidor, o acceso desde internet. Tiene muchas posibilidades como lenguaje de aplicaciones comerciales y desarrollos dirigidos a la empresa. Posee innumerables ventajas, dos de ellas muy importantes son la independencia de la plataforma y el diseño orientado a redes. En las empresas que se fueron informatizando desde hace un tiempo, es común encontrar una mezcla de hardware y sistemas operativos. Por ejemplo servidores Unix con Oracle en el sector administrativo, PCs con DOS, y Windows en las oficinas, y Macintosh en el departamento de diseño. Java tiene posibilidades de integración de sistemas, porque permite que todos ellos corran las mismas aplicaciones, lo que disminuye el costo de desarrollo, mantenimiento y entrenamiento de los usuarios. También ofrece la posibilidad de independizarse de los proveedores de hardware y adaptarse a la evolución continua sin realizar inversiones en reingenieria de sistemas. En la reintegración de los sistemas, la interconexión de equipos y las aplicaciones en red, Java cumple un rol fundamental. Es el lenguaje ideal para desarrollar aplicaciones en red. La posibilidad de ejecutar aplicaciones cliente/servidor, en las cuales varios usuarios utilizan los mismos recursos de software del servidor, desde máquinas baratas o net computers, disminuye los costos de actualización del software, porque no hay que estar rastreando que versiones hay en cada máquina y perdiendo tiempo en actualizar cada una. Al no quedar limitado dentro de la red interna de la empresa y abrir el acceso a internet, se beneficia a los usuarios de la empresa y a los clientes. Sin importar la ubicación física ni el tiempo de maquina, los clientes pueden realizar consultas y compras por la red, los distribuidores pueden actualizar sus catálogos y listas de precios y un sin fin de otras posibilidades. Además posee diversas funciones orientadas a la seguridad y que se encuentran incorporadas al lenguaje en forma nativa. Obviamente el uso de Java por si solo, no suprime las debilidades que posee el sistema operativo subyacente, sea cual sea, pero permite estar completamente seguros en cuanto a las aplicaciones propias de este lenguaje. Dentro de los desarrollos de Sun orientados a las empresas, que conforman lo que se denomina la Java Commerce API, se tienen en cuenta los mecanismos de seguridad, la encriptación de datos, los métodos de pago a distancia, y el uso de tarjetas inteligentes que incorporan chips basados en Java.

2- CARACTERÍSTICAS. Las características principales que ofrece Java respecto a cualquier otro lenguaje de programación son las siguientes: •  Es simple, ofrece la funcionalidad de un lenguaje potente, pero sin las características menos usadas y más confusas de estos. C++ es un lenguaje que carece de falta de seguridad, pero C y C++ son lenguajes mas difundidos, por eso Java se diseño para ser más similar a C++ y facilitar un rápido y fácil aprendizaje. Java elimina muchas de las características de otros lenguajes como C++, para reducir las especificaciones del lenguaje y añadir características muy útiles como el garbage collector (reciclador de memoria dinámica). No es necesario preocuparse de liberar memoria, el reciclador se encarga de ello, y como es un thread de baja prioridad permite liberar bloques de memoria muy grandes, lo que reduce la fragmentación de la memoria. Java reduce en un 50% los errores más comunes de programación con lenguaje como C y C++ al eliminar muchas de las características de estos, por ejemplo, aritmética de punteros, no existen referencias, registros (struct), definición de tipos (typedef), macros (# define), necesidad de liberar memoria (free). Lo que hace es eliminar las palabras reservadas (struct typedef), ya que las clases son algo parecido. •  Es orientado a objetos, implementa la tecnología básica de C++ con algunas mejoras y elimina algunas cosas para mantener la simplicidad del lenguaje, trabaja con sus datos como objetos y con interfaces a esos datos. Soporta las 3 características propias del paradigma de la orientación objetos: encapsulación, herencia y polimorfismo. Las plantillas de objetos son llamadas como en C++, clases y sus copias, instancias. Como en C++, necesitan ser construidas y destruidas en espacio de memoria. Java incorpora funcionalidades inexistentes en C++, como por ejemplo la resolución dinámica de método. Esta característica proviene del lenguaje Objetive C, dueño del sistema operativo Next. En C++ se suele trabajar con librerías dinámicas (DLLs) que obligan recompilar la aplicación cuando se retocan las funciones que se encuentran en su interior. Este inconveniente lo resuelve Java mediante una interfaz especifica llamada RTTI (Rum Time Type Identification) que define la interacción entre objetos excluyendo variables de instancias o implementación de métodos. Las clases en Java tienen una representación en el RunTime que permite a los programadores preguntar por el tipo de clase y enlazar dinámicamente la clase con el resultado de la búsqueda. Para que un lenguaje pueda considerarse orientado a objetos debe soportar como mínimo las características de encapsulación, herencia, polimorfismo, enlace •  Es distribuído; Java se ha construído con extensas capacidades de interconexión TCP/IP. Existen librerías de rutina para acceder e interactuar con protocolos como http y ftp, lo cual permite a los programadores acceder a la información a través de la red con tanta facilidad como a los ficheros locales. Java en si no es distribuído, sino que proporciona las librerías y herramientas para que los programas puedan ser distribuídos, es decir, que se corran en varias máquinas interactuando. •  Es robusto, realiza verificaciones, en busca de problemas, tanto en tiempo de compilación como en tiempo de ejecución. La comprobación de tipos en Java ayuda a detectar errores en el ciclo de desarrollo, obliga a la declaración explícita de métodos, reduciendo las posibilidades de error. Maneja la memoria para eliminar las preocupaciones por parte de programador de la liberación o corrupción de memoria. Implementa los arrays auténticos, en vez de listas enlazadas de punteros, con comprobación de limites para evitar la posibilidad de sobreescribir o corromper memoria, resultado de puntero, que señalan a zonas equivocadas. Estas características reducen fuertemente el tiempo de desarrollo de aplicaciones en Java. Para asegurar el funcionamiento de la aplicación, realiza una verificación de los byte codes, que son el resultado de la compilación de un programa Java. Es un código de máquina virtual que es interpretado por el interprete Java. No es el código máquina directamente entendible por el hardware, pero a pasado todas las fases del compilador, análisis de instrucciones, orden de operadores, etc., y ya tiene generada la pila de ejecución de ordenes. Proporciona comprobación de punteros, comprobación de limites de arrays, y verificación de byte-codes. •  Tiene arquitectura neutral. Para establecer Java como parte integral de la red, el compilador Java compila su código a un fichero objeto de formato independiente de la arquitectura de la máquina en que se ejecutara. Cualquier máquina que tenga el sistema de ejecución (run-time) puede ejecutar ese código objeto sin importar la máquina en que ha sido

generada. Existen sistemas run-time para Solaris 2.x, SunOs 4.1.x, Windows 95, Windows NT, Linux, Irix, Aix, Mac, Apple, y hay grupos de desarrollos trabajando para otras plataformas. El código fuente Java se compila a un código de bytes de alto nivel independiente de la máquina. Este código (byte-codes) esta diseñado para ejecutarse en una máquina hipotética que es implementada por un sistema run-time que si es dependiente de la máquina. Lo dependiente del sistema es la Máquina Virtual Java (JVM) y las librerías fundamentales que nos permitirían acceder directamente al hardware de la máquina. Una máquina virtual es una capa lógica que hace creer al programa Java que se ejecuta en un ordenador real (con registros, memoria y procesador), cuando en realidad solo se ve una reconstrucción lógica de un ordenador. Para ejecutar un programa Java compilado (que esta en p-codes), se debe contar con una implementacion de la máquina virtual especifica donde se desea ejecutar, la cual efectúa la transformación del p-code en un programa comprensible para la máquina. Además habrá APIs de Java que también entren en contacto directo con el hardware y serán dependientes de la máquina. Ejemplo de este tipo de APIs: Java 2D: gráficos 2D y manipulación de imágenes. Java Media Framework: elementos críticos en el tiempo: audio, video... Java Animation: animación de objetos en 2D. Java Telephony: integración con telefonía. Java Share: interacción entre aplicaciones multiusuario. Java 3D: gráficos 3D y su manipulación. •

 Es seguro: la seguridad en Java tiene dos facetas. En el lenguaje, características como los punteros o el casting implícito que hacen los compiladores de C y C++ se eliminan para prevenir el acceso ilegal a la memoria. Cuando se usa Java para crear un navegador, se combinan las características del lenguaje con protecciones de sentido común aplicadas al propio navegador. El lenguaje C tiene lagunas de seguridad importantes, como son los errores de alineación. Los programadores de C utilizan punteros en conjunción con operaciones aritméticas que permite al programador que un puntero referencie a un lugar conocido la memoria y pueda sumar (o restar) algún valor, para referirse a otro lugar de la memoria. Si otros programadores conocen nuestras estructuras de datos pueden extraer información confidencial de nuestro sistema. Con un lenguaje como C, se pueden tomar números enteros aleatorios y convertirlos en punteros para luego acceder a la memoria: printf("Escribe un valor entero: "); scanf("%u",&puntero ); printf( ". Java imposibilita, también, abrir ningún fichero de la máquina local (siempre que se realizan operaciones con archivos, éstas trabajan sobre el disco duro de la máquina de donde partió el applet), no permite ejecutar ninguna aplicación nativa de una plataforma e impide que se utilicen otros ordenadores como puente, es decir, nadie puede utilizar nuestra máquina para hacer peticiones o realizar operaciones con otra. Cadena de memoria: %s\n",puntero ); Otro tipo de ataque, es el Caballo de Troya. Se presenta un programa como una utilidad, resultando tener una funcionalidad destructiva. Por ejemplo, en UNIX se visualiza el contenido de un directorio con el comando ls. Después de que el caballo de Troya haya enviado por correo el /etc/shadow a su creador, ejecuta la funcionalidad de ls persentando el contenido del directorio. Se notará un retardo, pero nada inusual. El código Java pasa muchos tests antes de ejecutarse en una máquina. El código se pasa a través de un verificador de byte-codes que comprueba el formato de los fragmentos de código y aplica un probador de teoremas para detectar fragmentos de código ilegal -código que falsea punteros, viola derechos de acceso sobre objetos o intenta cambiar el tipo o clase de un objeto-. Si los byte-codes pasan la verificación sin generar ningún mensaje de error, entonces sabemos que: •  El código no produce desbordamiento de operandos en la pila •  El tipo de los parámetros de todos los códigos de operación es conocido y correcto. •  No ha ocurrido ninguna conversión ilegal de datos, tal como convertir enteros en punteros. •  El acceso a los campos de un objeto se sabe que es legal: public, private, protected. •  No hay ningún intento de violar las reglas de acceso y seguridad establecidas

El Cargador de Clases también ayuda a Java a mantener su seguridad, separando el espacio de nombres del sistema de ficheros local, del de los recursos procedentes de la red. Esto limita cualquier aplicación del tipo Caballo de Troya, ya que las clases se buscan primero entre las locales y luego entre las procedentes del exterior. Las clases importadas de la red se almacenan en un espacio de nombres privado, asociado con el origen. Cuando una clase del espacio de nombres privado accede a otra clase, primero se busca en las clases predefinidas (del sistema local) y luego en el espacio de nombres de la clase que hace la referencia. Esto imposibilita que una clase suplante a una predefinida. En resumen, las aplicaciones de Java resultan extremadamente seguras, ya que no acceden a zonas delicadas de memoria o de sistema, con lo cual evitan la interacción de ciertos virus. Java no posee una semántica específica para modificar la pila del programa, la memoria libre o utilizar objetos y métodos de un programa sin los privilegios del kernel del sistema operativo. Además, para evitar modificaciones por parte de los crackers de la red, implementa un método ultraseguro de autenticación por clave pública. El Cargador de Clases puede verificar una firma digital antes de realizar una instancia de un objeto. Por tanto, ningún objeto se crea y almacena en memoria, sin que se validen los privilegios de acceso. Es decir, la seguridad se integra en el momento de compilación, con el nivel de detalle y de privilegio que sea necesario. Java imposibilita, también, abrir ningún fichero de la máquina local (siempre que se realizan operaciones con archivos, éstas trabajan sobre el disco duro de la máquina de donde partió el applet), no permite ejecutar ninguna aplicación nativa de una plataforma e impide que se utilicen otros ordenadores como puente, es decir, nadie puede utilizar nuestra máquina para hacer peticiones o realizar operaciones con otra. Los interpretes que incorporan los navegadores de la Web son aun más restrictivos. Bajo dichas condiciones se puede considerar que Java es un lenguaje seguro y que los applets están libres de virus. Respecto a la seguridad del código fuente, JDK proporciona un desensamblador de byte-code, que permite que cualquier programa pueda ser convertido a código fuente, lo que para el programador significa una vulnerabilidad total a su código. Utilizando Java no se tiene el código fuente original, pero desmonta el programa mostrando el algoritmo que se utiliza. La protección de los programadores ante esto es utilizar llamadas a programas nativos, externos (incluso en C o C++) de forma que no sea descompilable todo el código; aunque así se pierda portabilidad. Esta es otra de las cuestiones que Java tiene pendientes. •  Es portable, aparte de la portabilidad básica por ser de arquitectura independiente, Java implementa otros estándares de portabilidad para facilitar el desarrollo. Los enteros son siempre enteros, y además enteros de 32 bits en complemento a 2. Java construye sus interfaces de usuario a través de un sistema abstracto de ventanas de forma que las ventanas puedan ser implantadas en entornos Unix, Pc o Mac. •  Es interpretado; el interprete Java (sistema run-time) puede ejecutar directamente el código objeto. Enlazar (linkar) un programa consume menos recursos que compilarlo, por que los desarrolladores con Java pasarán más tiempo desarrollando y menos esperando por el ordenador. El compilador actual del JDK es bastante lento, todavía no hay compiladores específicos de Java para las diversas plataformas. Java es más lento que otros lenguajes de programación, como C++ ya que debe ser interpretado y no ejecutado como sucede en cualquier programa tradicional. Se dice que Java es de 10 a 30 veces más lento que C, y que tampoco existen en Java proyectos de gran envergadura como en otros lenguajes. Pero ya hay comparaciones ventajosas entre Java y el resto de los lenguajes de programación. Habría que decidir hasta que punto Java, un lenguaje en pleno desarrollo y todavía sin definición definitiva, esta maduro como lenguaje de programación para ser comparado con otros. Java para conseguir ser lenguaje independiente del sistema operativo y del procesador que incorpore la máquina utilizada, es tanto interpretado como compilado. Esto no es ningún contrasentido, el código fuente escrito con cualquier editor se compila generando el byte-code. Este código intermedio es de muy bajo nivel, pero sin alcanzar las instrucciones máquinas propias de cada plataforma y no tiene nada que ver con el p-code de Visual Basic. El byte-code corresponde al 80% de las instrucciones de las aplicaciones. Ese mismo codigo es el que se puede ejecutar sobre cualquier plataforma. Para ello hace falta el run time, que si es completamente dependiente de la máquina y del sistema operativo, interpreta el byte-code y añade el 20% de instrucciones que faltaban para su ejecución. Con este sistema es fácil crear

aplicaciones multiplataforma, pero para ejecutarlas es necesario que exista el run time correspondiente al sistema operativo utilizado. •  Es multithreaded, permite muchas actividades simultáneas en un programa. Los threads (llamados procesos ligeros) son pequeños procesos o piezas independientes de un gran proceso. Al estar construidos en el lenguaje, son más fáciles de usar y más robustos que sus homólogos en C o C++. El beneficio consiste en un mejor rendimiento interactivo y mejor comportamiento en tiempo real. Aunque el comportamiento en tiempo real esta limitado a las capacidades del sistema operativo subyacente (Unix, Windows, etc.), aun supera a los entornos de flujo único de programa (single-threaded) tanto en la facilidad de desarrollo como en rendimiento. Cualquiera que haya utilizado la tecnología de navegación concurrente, sabe lo frustrante que puede ser esperar por una gran imagen que se está trayendo. En Java las imágenes se pueden ir trayendo en un thread independiente, permitiendo que el usuario pueda acceder a la información en la pagina sin tener que esperar por el navegador. •  Es dinámico, Java se beneficia todo lo posible de la tecnología orientada a objetos; no intenta conectar todos los módulos que componen una aplicación hasta el tiempo de ejecución. Las librerías nuevas o actualizadas no paralizarán las aplicaciones actuales (siempre que mantengan el API anterior). También simplifica el uso de protocolos nuevos o actualizados. Si su sistema ejecuta alguna aplicación Java sobre la red y encuentra una pieza de la aplicación que no sabe manejar, es capaz de traer automáticamente cualquiera de esas piezas que es sistema necesita para funcionar. Para evitar que los módulos de byte-codes o los objetos o nuevas clases, haya que estar trayéndolos de la red cada vez que se necesiten implementa las opciones de persistencia. ¿Cuál es la ventaja de todo esto?. ¿Qué gano con Java? : 1- 1No volver a escribir el código si quiero ejecutar el programa en otra máquina. Un solo código funciona para todos los browsers compatibles con Java o donde se tenga una máquina virtual de Java (Mac's, PC's, Sun's, etc.) 2- 2Java es un lenguaje de programación orientado a objetos y tiene todos los beneficios que ofrece esta metodología de programación. 3- 3Un browser compatible con Java deberá ejecutar cualquier programa hecho en Java, ahorra a los usuarios tener que estar insertando "plug-ins", y además programas que a veces quitan tiempo y espacio en disco. 4- 4Java es un lenguaje y puede hacer todas las cosas que puede hacer un lenguaje de programación: cálculos matemáticos, procesadores de palabras, bases de datos, aplicaciones gráficas, animaciones, sonidos, hojas de cálculo, etc. 5- 5Si lo que interesa son las paginas web, ya no tienen que ser estáticas, se les puede poner toda clase de elementos multimedia y permiten un alto nivel de interactividad, sin tener que gastar en paquetes carísimos de multimedia. Algunas limitantes: 1- 1La velocidad. 2- 2Los programas hechos en Java no tienden a ser muy rápidos, se está trabajando en mejorar esto. Como los programas de Java son interpretados nunca alcanzan la velocidad de un verdadero ejecutable. 3- 3Java es un lenguaje de programación, esa es otra limitante; aprenderlo no es cosa fácil, especialmente para los no programadores. 4- 4Es nuevo, todavía no se conocen bien todas sus capacidades. En general posee muchas ventajas, y se pueden hacer cosas muy interesantes, posee mucha fuerza.

3- HOTJAVA Es un navegador con soporte Java (Java-enabled), desarrollado en Java. Como cualquier navegador de Web, HotJava puede decodificar HTML estándar y URLs estándares, aunque no soporta completamente el estándar HTML 3.0. La ventaja sobre el resto de navegadores, sin soporte Java, es que puede ejecutar programas Java sobre la red. La diferencia con Netscape, es que tiene implementado completamente los sistemas de seguridad que propone Java, esto significa que puede escribir y leer en el disco local, aunque esto hace disminuir la seguridad, ya que se pueden grabar en nuestro disco programas que contengan código malicioso e introducirnos un virus, por ejemplo. No obstante, el utilizar esta característica de HotJava es decisión del usuario. 4- JAVA PARA APLICACIONES CORPORATIVAS Surge la pregunta de si esta es una buena tecnología para desarrollar aplicaciones corporativas. Y la respuesta es afirmativa, en donde la red sea algo crítico, Java facilita tremendamente la vida de la programación corporativa. Durante años, las grandes empresas se han convencido de que la "red" corporativa es la que mantiene vivo su negocio. Desde el gran servidor de sus oficinas centrales, hasta los servidores de las delegaciones, las estaciones de trabajo de los programadores y las Pcs, la información va fluyendo de unos a otros. Para muchas compañías, la Red es la Empresa. Si esta red no se mantiene sana, los pedidos no llegan, el inventario no se actualiza, el software no se desarrolla adecuadamente, los clientes no están satisfechos y, fundamentalmente, el dinero no entra. La necesidad de diagnosticar y reducir los problemas de la red, hace que se estén implementando continuamente nuevas metodologías que subsanen este grave problema. 4.1- Desarrollo rápido de aplicaciones Hace años, se decía que los programadores pronto desaparecerían. Los generadores automáticos de programas, eliminarían a los generadores humanos y el mundo sería un lugar mejor para vivir. Desafortunadamente, quienes decían esto no tuvieron en cuenta una acelerada demanda de software de calidad para muy diferentes aplicaciones. Sin embargo, la tecnología de objetos pronto vino a intentar facilitar la tarea, adoptando el modelo de "generar parte de un programa", así, generando la parte básica de un programa (los objetos), se podría conectar con otras partes para proporcionar diferentes utilidades al usuario. El lenguaje C++ es una buena herramienta, pero no cumple totalmente la premisa. Visual Basic y NextStep, se acercan cada vez más al poder de los objetos. Java facilita la creación de entornos de desarrollo-aplicaciones de modo similar, pero además es flexible, poderoso y efectivo. Los programadores ahora disponen de herramientas de programación de calidad, que apuntan hacia esa meta, como son el Java WorkShop de SunSoft, el entorno Java de Borland, el Café de Symantec, y pronto, herramientas más sofisticadas como Netcode o FutureTense. Esto proporciona una gran progresión a los entornos de desarrollo Java. Aplicaciones efectivas y eficientes Las aplicaciones que se crean en grandes empresas deben ser más efectivas que eficientes; es decir, conseguir que el programa funcione y el trabajo salga adelante es más importante que el que lo haga eficientemente. Esto es una realidad de la programación corporativa. Al ser un lenguaje más simple que cualquiera de los que ahora están en el cajón de los programadores, Java permite a éstos concentrarse en la mecánica de la aplicación, en vez de pasarse horas y horas incorporando APIs para el control de las ventanas, controlando minuciosamente la memoria, sincronizando los ficheros de cabecera y corrigiendo los agónicos mensajes del linker. Java tiene su propio toolkit para interfaces, maneja por sí mismo la memoria que utilice la aplicación, no permite ficheros de cabecera separados (en aplicaciones puramente Java) y solamente usa enlace dinámico. Muchas de las implementaciones de Java actuales son puros intérpretes. Los byte-codes son interpretados por el sistema run-time de Java, la Máquina Virtual Java (JVM), sobre el

ordenador del usuario. Aunque ya hay ciertos proveedores que ofrecen compiladores nativos Just-In-Time (JIT). Si la Máquina Virtual Java dispone de un compilador instalado, las secciones (clases) del byte-code de la aplicación se compilarán hacia la arquitectura nativa del ordenador del usuario. Los programas Java en ese momento rivalizarán con el rendimiento de programas en C++. Los compiladores JIT no se utilizan en la forma tradicional de un compilador; los programadores no compilan y distribuyen binarios Java a los usuarios. La compilación JIT tiene lugar a partir del byte-code Java, en el sistema del usuario, como una parte (opcional) del entorno run-time local de Java. Muchas veces, los programadores corporativos, ansiosos por exprimir al máximo la eficiencia de su aplicación, empiezan a hacerlo demasiado pronto en el ciclo de vida de la aplicación. Java permite algunas técnicas innovadoras de optimización. Por ejemplo, Java es inherentemente multithreaded, a la vez que ofrece posibilidades de multithread como la clase Thread y mecanismos muy sencillos de usar de sincronización; Java en sí utiliza threads. Los desarrolladores de compiladores inteligentes pueden utilizar esta característica de Java para lanzar un thread que compruebe la forma en que se está utilizando la aplicación. Más específicamente, este thread podría detectar qué métodos de una clase se están usando con más frecuencia e invocar a sucesivos niveles de optimización en tiempo de ejecución de la aplicación. Cuanto más tiempo esté corriendo la aplicación o el applet, los métodos estarán cada vez más optimizados. Si un compilador JIT está embebido en el entorno run-time de Java, el programador no se preocupa de hacer que la aplicación se ejecute óptimamente. 4.2- Portabilidad para programador y programa En una empresa de relativo tamaño hay cantidades diferentes de ordenadores. Probablemente nos encontremos con estaciones de trabajo Sun para el desarrollo de software, hordas de PCs para cada empleado, algún Mac en el departamento de documentación, una estación de trabajo HP en administración y una estación SGI en la sala de demos. Desarrollar aplicaciones corporativas para un grupo tan diferente de plataformas en excesivamente complejo y caro. Hasta ahora era complicado convencer a los programadores de cada arquitectura que utilicen un API común para reducir el coste de las aplicaciones. Con un entorno run-time de Java portado a cada una de las arquitecturas de las plataformas presentes en la empresa y una buena librería de clases ("packages" en Java), los programadores pueden entenderse y encontrar muy interesante trabajar con Java. Esta posibilidad hará tender a los programadores hacia Java, justo donde otros intentos anteriores con entornos universales (como Galaxy o XVT) han fracasado. Estos APIs eran simplemente inadecuados, no orientados a redes y, verdaderamente, pesados. Una vez que los programas estén escritos en Java, otro lado interesante del asunto es que los programadores también son portables. El grupo de programadores de la empresa puede ahora enfrentarse a un desarrollo para cualquiera de las plataformas. La parte del cliente y del servidor de una aplicación estarán ahora escritas en el mismo lenguaje. Ya no será necesario tener un grupo que desarrolle en Solaris en del departamento de I+D, programadores trabajando sobre Visual Basic en el departamento de documentación y programadores sobre GNU en proyectos especiales; ahora todos ellos podrán estar juntos y formar el grupo de software de la empresa. 4.3- Costos de desarrollo En contraste con el alto coste de los desarrollos realizados sobre estaciones de trabajo, el costo de creación de una aplicación Java es similar al de desarrollar sobre un PC. Desarrollar utilizando un software caro para una estación de trabajo (ahora barata) es un problema en muchas empresas. La eficiencia del hardware y el poco costo de mantenimiento de una estación de trabajo Sun, por ejemplo, resulta muy atractivo para las empresas; pero el costo adicional del entorno de desarrollo con C++ es prohibitivo para la gran mayoría de ellas. La llegada de Java e Intranet reducen considerablemente estos costos. Las herramientas Java ya no están en el entorno de precios de millones de pesos, sino a los niveles confortables de precio de las herramientas de PCs. Y con el crecimiento cada día mayor de la comunidad de desarrolladores de software freeware y shareware que incluso proporcionan el código fuente,

los programadores corporativos tienen un amplio campo donde moverse y muchas oportunidades de aprender y muchos recursos a su disposición. El éxito que Internet ha proporcionado a los equipos de software corporativos es un regalo. El precio del software es ahora el mismo para un poderoso equipo corriendo Unix que para un PC. Incluso Netscape tiene al mismo precio la versión Unix de su servidor Web SuiteSpot que la versión PC/NT. Esta es la filosofía de precios que parece ser será la que se siga con las herramientas basadas en Java. 4.4- Mantenimiento y soporte Un problema bien conocido que ocurre con el software corporativo es la demanda de cuidados y realimentación. Java no es, ciertamente, la solución para el problema del mantenimiento, pero tiene varias características que la harán más fácil. Uno de los componentes del JDK es javadoc. Si se usan ciertas convenciones en el código fuente Java (como comenzar un comentario con /** y terminarlo con */), javadoc se puede fácilmente generar páginas HTML con el contenido de esos comentarios, que pueden visualizarse en cualquier navegador. La documentación del API de Java ha sido creada de este modo. Esto hace que el trabajo de documentar el código de nuevas clases Java sea trivial. Otro gran problema del desarrollador corporativo es la creación y control de makefiles. Leerse un makefile es como estar leyendo la historia de empresa. Normalmente se pasan de programador a programador, quitando la información que no es esencial, siempre que se puede. Esto hace que muchos de los makefiles de las aplicaciones contengan docenas de librerías, una miríada de ficheros de cabecera y macros muy confusos. Java reduce la dependencia de complejos makefiles drásticamente. Primero, no hay ficheros de cabecera. Java necesita que todo el código fuente de una clase se encuentre en un solo fichero. Java tiene la inteligencia de make en el propio lenguaje para simplificar la compilación de byte-codes. Por ejemplo: public class pepe { // Fichero: pepe.java Guitarra flamenca ; } public class guitarra { // Fichero: guitarra.java } % javac -verbose pepe.java [parsed pepe.java in 720ms] [loaded C:\JAVA\BIN\..\classes\java\lang\Object.class in 220ms] [checking class pepe] [parsed .\\Guitarra.java in 50ms] [wrote pepe.class] [checking class Guitarra] [wrote .\\Guitarra.class] [done in 2300ms] El compilador Java se da cuenta de que necesita compilar el fichero guitarra.java. Ahora vamos a forzarlo a que recompile pepe.java sin cambiar guitarra.java, podremos comprobar que el compilador de byte-code Java no recompila innecesariamente el fichero guitarra.java. % javac -verbose pepe.java [parsed pepe.java in 440ms] [loaded C:\JAVA\BIN\..\classes\java\lang\Object.class in 160ms] [checking class pepe] [loaded .\\Guitarra.java in 0ms] [wrote pepe.class] [done in 1860ms] Ahora, si modificamos guitarra.java (añadiendo, por ejemplo, otro miembro a la clase) y compilamos pepe.java, el compilador Java se dará cuenta de que debe recompilar tanto pepe.java como guitarra.java % javac -verbose pepe.java [parsed pepe.java in 710ms] [loaded C:\JAVA\BIN\..\classes\java\lang\Object.class in 220ms] [checking class pepe]

[parsed .\\Guitarra.java in 0ms] [wrote pepe.class] [checking class Guitarra] [wrote .\\Guitarra.class] [done in 2640ms] ejemplo extraído de: 4.5- Aprendizaje Si la empresa está llena de programadores de C++ con alguna experiencia en el manejo de librería gráficas, aprenderán rápidamente lo esencial de Java. Si el equipo de ingenieros no conoce C++, pero maneja cualquier otro lenguaje de programación orientada a objetos, les llevará pocas semanas dominar la base de Java. Lo que sí que no es cierto es que haya que aprender C++ antes de aprender Java. Si los ingenieros de la empresa no conocen ningún lenguaje orientado a objetos, sí que tienen que aprender los fundamentos de esta tecnología antes de nada, y luego aplicarlos a la programación con Java. El análisis y diseño orientado a objetos debe ser comprendido antes de intentar nada con Java. Los programadores de Java sin un fondo de conocimientos de OOA/D producirán código pobre. 5- LO NECESARIO PARA TRABAJAR EN JAVA Herramientas necesarias para desarrollar en Java: para desarrollar programas en Java es suficiente con instalar el paquete JDK de Sun, que es de libre distribución. En el site de Sun se encuentra toda clase de información relacionada con Java: ejemplos de programas escritos en Java, documentación, bugs conocidos y su solución, etc. 6- COMO HACER UN PROGRAMA EN JAVA a- aAplicaciones: •  Escribir el programa fuente en cualquier editor y guardarlo con extensión.java. •  Compilar el fichero fuente mediante: javac.miPrograma.java. esto genera el fichero.class. •  Ejecutarlo (interpretar los byte-code): java.miPrograma. b- b•  •  •  html • 

Applets: Escribir el programa fuente en cualquier editor y guardarlo con extensión.java Compilar el fichero fuente mediante: javac.miProgramaApplet.java Escribir la pagina web que contendrá al applet y guardar el código con extensión el código mínimo será:





lanzar un navegador y cargar la página html, o bien usar el programa provisto por Sun para ver applets: appletviewermiProgramaApplet.html un ejemplo de herramientas básicas para comenzar a programar en lenguaje Java podría ser: 1- 1Editor de código multilenguaje y con utilidades de edición y detección automática de errores. Un buen editor con estas propiedades y más es ED for Windows v3.80 pero existen muchos otros. -

2- 2JDK1.1.x, con el que podemos compilar y probar las aplicaciones y applets realizados. 3- 3Documentación HTML de las clases Java. Es aconsejable trabajar con paquetes de componentes que no pertenecen a los básicos de Java, como puede ser swing o symbeans. Estos componentes o beans proporcionan utilidades y facilidades añadidas a paquete básico de jdk. Otra posibilidad para desarrollar en Java es utilizar una herramienta Visual como Visual Café o V++. Estas herramientas suponen un entorno integrado de programación con módulos editor, de diseño visual, compilador, depurador, etc. Proporcionan componentes especialmente útiles en diseño de interfaces gráficas. 7- 7-

LA GRAMATICA DE JAVA.

7.1- Comentarios: en Java hay tres tipos de comentarios: // comentarios para una sola línea /* comentarios de una o más líneas */ /** comentario de documentación, de una o más líneas */ Los dos primeros tipos de comentarios son los que todo programador conoce y se utilizan del mismo modo. Los comentarios de documentación, colocados inmediatamente antes de una declaración (de variable o función), indican que ese comentario ha de ser colocado en la documentación que se genera automáticamente cuando se utiliza la herramienta de Java, javadoc. Sirven como descripción del elemento declarado permitiendo generar una documentación de nuestras clases escrita al mismo tiempo que se genera el código. 7.2- Identificadores: nombran variables, funciones, clases y objetos; cualquier cosa que el programador necesite identificar o usar. un identificador comienza con una letra, un subrayado (_) o un símbolo de dólar ($). Los siguientes caracteres pueden ser letras o dígitos. Se distinguen las mayúsculas de las minúsculas y no hay longitud máxima. Ejemplos de identificadores válidos: Identificador nombre_usuario Nombre_Usuario _variable_de_sistema $transaccion y su uso sería, por ejemplo: int contador_principal; char _lista_de_ficheros; float cantidad_en_Ptas;

Palabra clave: las siguientes son palabras claves que están definidas en Java y que no se pueden utilizar como identificadores: abstract continue for new switch boolean default goto null synchronizedbreak do if package thisbyte double implements private threadsafebyvalue else import protected throwcase extends instanceof public transient catch false int return true char final interface short try class finally long static void const float native super while

Palabras reservadas: el lenguaje se reserva unas cuantas palabras mas, pero que hasta ahora no tienen un cometido especifico. Son: cast future generic inneroperator outer rest var Tags HTML Atributos del tag



Texto alternativo

8- 8-

LAS APLICACIONES Y LOS APPLETS

Las características propias del lenguaje java hacen que además de poder desarrollar aplicaciones que se ejecutan en el intérprete local, se puedan desarrollar módulos descargables a través de una pagina web y ejecutables en la JVM (Java Virtual Machine) del navegador. Estos módulos reciben el nombre de APPLETS. Ejemplos sencillos de cada tipo de desarrollo para apreciar las diferencias de estructura gramatical: 1. Aplicaciones class EchoArgs { public static void main (String args[]) { for ( int i = 0;i devolver un objeto propio - variable estática: al cambiarla, varían las de todas las instancias - método constructor con parámetro Nombre del propietario Comentarios: - al no declarar que hereda de nadie, se asume que es de Object - comentarios - aritmética de Strings, se suman - println es menos potente que en C - null y los valores por defecto - this - las referencias -> programa de ejemplo - la recogida de basura -> el programador no gestiona la memoria */ public static void main(String args[]) { Perro miPerro; miPerro = new Perro( ); miPerro.raza = "AFGANO"; miPerro.color = "blanco marfil"; miPerro.describePerro( ); System.out.println("-------------------"); System.out.println("Hacer ladrar al perro..."); miPerro.ladrarPerro( ); System.out.println("-------------------"); miPerro.describePerro( ); System.out.println("-------------------"); miPerro.ladrarPerro( ); // Otro Perro Perro elPerroDeMiHermana = new Perro( ); elPerroDeMiHermana.raza = "Labrador"; System.out.println("-------------------"); elPerroDeMiHermana.describePerro( ); // Altera la variable estatica de la clase Perro Perro.peso = 15; elPerroDeMiHermana.describePerro( ); miPerro.describePerro( ); // NOTA: el color saldra null } } Ejemplo extraído de: www.monografias.com/trabajos/java/java.stml

9.1 LOS TIPOS DE CLASES Hasta ahora sólo se ha utilizado la palabra clave public para calificar el nombre de las clases que se ha visto, pero hay tres modificadores más. Los tipos de clases que se pueden definir son: abstract Una clase abstract tiene al menos un método abstracto. Una clase abstracta no se instancia, sino que se utiliza como clase base para la herencia. final Una clase final se declara como la clase que termina una cadena de herencia. No se puede heredar de una clase final. Por ejemplo, la clase Math es una clase final. public Las clases public son accesibles desde otras clases, ya sea directamente o por herencia. Son accesibles dentro del mismo paquete en el que se han declarado. Para acceder desde otros paquetes, primero tienen que ser importadas. synchronizable Este modificador especifica que todos los métodos definidos en la clase son sincronizados, es decir, que no se puede acceder al mismo tiempo a ellos desde distintos threads; el sistema se encarga de colocar los flags necesarios para evitarlo. Este mecanismo hace que desde threads diferentes se puedan modificar las mismas variables sin que haya problemas de que se sobreescriban. 9.2 LAS VARIABLES Y LOS METODOS DE INSTANCIAS Una clase en Java puede contener variables y métodos. Las variables pueden ser tipos primitivos como int, char, etc. Los métodos son funciones. Por ejemplo, en el siguiente trozo de código podemos observarlo: public MiClase { int i; public MiClase() { i = 10; } public void Suma_a_i( int j ) { i = i + j; } } La clase MiClase contiene una variable (i) y dos métodos, MiClase que es el constructor de la clase y Suma_a_i( int j ). 9.3 LOS METODOS Y LOS CONSTRUCTORES Los métodos son funciones que pueden ser llamadas dentro de la clase o por otras clases. El constructor es un tipo específico de método que siempre tiene el mismo nombre que la clase. Cuando se declara una clase en Java, se pueden declarar uno o más constructores opcionales que realizan la inicialización cuando se instancia (se crea una ocurrencia) un objeto de dicha clase. Utilizando el código de ejemplo anterior, cuando se crea una nueva instancia de MiClase, se crean (instancian) todos los métodos y variables, y se llama al constructor de la clase: MiClase mc; mc = new MiClase(); La palabra clave new se usa para crear una instancia de la clase. Antes de ser instanciada con new no consume memoria, simplemente es una declaración de tipo. Después de ser instanciado un nuevo objeto mc, el valor de i en el objeto mc será igual a 10. Se puede referenciar la variable (de instancia) i con el nombre del objeto: mc.i++; // incrementa la instancia de i de mc Al tener mc todas las variables y métodos de MiClase, se puede usar la primera sintaxis para llamar al método Suma_a_i() utilizando el nuevo nombre de clase mc: mc.Suma_a_i( 10 ); y ahora la variable mc.i vale 21.

9.4 LA HERENCIA La Herencia es el mecanismo por el que se crean nuevos objetos definidos en términos de objetos ya existentes. Por ejemplo, si se tiene la clase Ave, se puede crear la subclase Ganso, que es una especialización de Ave. class Ganso extends Ave { int numero_de_patas; } La palabra clave extends se usa para generar una subclase (especialización) de un objeto. Una Ganso es una subclase de Ave. Cualquier cosa que contenga la definición de Ave será copiada a la clase Ganso, además, en Ganso se pueden definir sus propios métodos y variables de instancia. Se dice que Ganso deriva o hereda de Ave. Además, se puede sustituir los métodos proporcionados por la clase base. Utilizando nuestro anterior ejemplo de MiClase, un ejemplo de una clase derivada sustituyendo a la función Suma_a_i(): import MiClase; public class MiNuevaClase extends MiClase { public void Suma_a_i( int j ) { i = i + ( j/2 ); } } Ahora cuando se crea una instancia de MiNuevaClase, el valor de i también se inicializa a 10, pero la llamada al método Suma_a_i() produce un resultado diferente: MiNuevaClase mnc; mnc = new MiNuevaClase(); mnc.Suma_a_i( 10 ); En Java no se puede hacer herencia múltiple. Por ejemplo, de la clase aparato con motor y de la clase animal no se puede derivar nada, sería como obtener el objeto perro mecánico a partir de una máquina motorizada (aparato con motor) y un perro (animal). En realidad, lo que se pretende es copiar los métodos, es decir, pasar la funcionalidad del perro de verdad al perro mecánico, con lo cual no sería necesaria la herencia múltiple sino simplemente la compartición de funcionalidad que se encuentra implementada en Java a través de interfaces. 9.5 EL CONTROL DE ACCESO Cuando se crea una nueva clase en Java, se puede especificar el nivel de acceso que se quiere para las variables de instancia y los métodos definidos en la clase: public public void CualquieraPuedeAcceder(){} Cualquier clase desde cualquier lugar puede acceder a las variables y métodos de instancia públicos. protected protected void SoloSubClases(){} Sólo las subclases de la clase y nadie más puede acceder a las variables y métodos de instancia protegidos. private private String NumeroDelCarnetDeIdentidad; Las variables y métodos de instancia privados sólo pueden ser accedidos desde dentro de la clase. No son accesibles desde las subclases. friendly (sin declaración específica) void MetodoDeMiPaquete(){} Por defecto, si no se especifica el control de acceso, las variables y métodos de instancia se declaran friendly (amigas), o sea que son accesibles por todos los objetos dentro del mismo paquete, pero no por los externos al paquete. Es lo mismo que protected. Los métodos protegidos (protected) pueden ser vistos por las clases derivadas, como en C++, y también, en Java, por los paquetes (packages). Todas las clases de un paquete pueden ver los métodos protegidos de ese paquete. Para evitarlo, se deben declarar como private protected, lo que hace que ya funcione como en C++ en donde sólo se puede acceder a las variables y métodos protegidos de las clases derivadas.

9.6 LAS VARIABLES Y LOS METODOS ESTADISTICOS En un momento determinado se puede querer crear una clase en la que el valor de una variable de instancia sea el mismo (y que sea la misma variable) para todos los objetos instanciados a partir de esa clase. Es decir, que exista una única copia de la variable de instancia. Se usará para ello la palabra clave static. class Documento extends Pagina { static int version = 10; } El valor de la variable versión será el mismo para cualquier objeto instanciado de la clase Documento. Siempre que un objeto instanciado de Documento cambie la variable versión, ésta cambiará para todos los objetos. De la misma forma se puede declarar un método como estático, lo que evita que el método pueda acceder a las variables de instancia no estáticas: class Documento extends Pagina { static int version = 10; int numero_de_capitulos; static void annade_un_capitulo() { numero_de_capitulos++; // esto no funciona } static void modifica_version( int i) { version++; // esto si funciona } } La modificación de la variable numero_de_capitulos no funciona porque se está violando una de las reglas de acceso al intentar acceder desde un método estático a una variable no estática. Todas las clases que se derivan, cuando se declaran estáticas, comparten la misma página de variables; es decir, todos los objetos que se generen comparten la misma zona de memoria. Las funciones estáticas se usan para acceder solamente a variables estáticas. class UnaClase { int var; UnaClase() { var = 5; } UnaFuncion() { var += 5; } } En el código anterior, si se llama a la función UnaFuncion a través de un puntero a función, no se podría acceder a var, porque al utilizar un puntero a función no se pasa implícitamente el puntero al propio objeto (this). Sin embargo, sí se podría acceder a var si fuese estática, porque siempre estaría en la misma posición de memoria para todos los objetos que se creasen de UnaClase. 9.7 LAS INTERFACES Los métodos abstractos son útiles cuando se quiere que cada implementación de la clase parezca y funcione igual, pero necesita que se cree una nueva clase para utilizar los métodos abstractos. Las interfaces proporcionan un mecanismo para abstraer los métodos a un nivel superior. Una interface contiene una colección de métodos que se implementan en otro lugar. Los métodos de una clase son public, static y final. La principal diferencia entre interface y abstract es que una interface proporciona un mecanismo de encapsulación de los protocolos de los métodos sin forzar al usuario a utilizar la herencia. Por ejemplo:

public interface VideoClip { // comienza la reproduccion del video void play(); // reproduce el clip en un bucle void bucle(); // detiene la reproduccion void stop(); } Las clases que quieran utilizar la interface VideoClip utilizarán la palabra implements y proporcionarán el código necesario para implementar los métodos que se han definido para la interface: class MiClase implements VideoClip { void play() {

} void bucle() {

} void stop() {

} Al utilizar implements para la interface es como si se hiciese una acción de copiar-y-pegar del código de la interface, con lo cual no se hereda nada, solamente se pueden usar los métodos. La ventaja principal del uso de interfaces es que una clase interface puede ser implementada por cualquier número de clases, permitiendo a cada clase compartir la interfaz de programación sin tener que ser consciente de la implementación que hagan las otras clases que implementen la interface. class MiOtraClase implements VideoClip { void play() {

} void bucle() {

} void stop() {

} 10• • •

10-

LA CREACIÓN DE APPLETS SENCILLOS

 Se incrustan en las paginas web  Se cargan dinámicamente de la red  Son programas, luego problema de seguridad: restricciones •  Un applet no puede cargar librerías o definir métodos nativos (programas en C por ejemplo) •  Como norma general no puede leer ni escribir ficheros en el ordenador en que se ejecuta. Si es necesario, se pueden escribir en el HD del ordenador host. •  No puede conectarse por red excepto al host del cual se cargo el applet •  No puede ejecutar ningún programa en el ordenador local •  No pueden lanzar programas en el equipo local •  Se supone que hay seguridad total, pero un muy buen hacker podría ocasionar problemas. •  Un applet puede invocar métodos de otros applets que residan en la misma pagina •  Los applets cargados desde el sistema local (desde un directorio definido en CLASSPATH) no tienen, por defecto, ninguna de las restricciones de los applets cargados desde la red •  Se pueden leer algunas características del sistema local;

Permitidas Key Meaning "file.separator" File separator (for example, "/") "java.class.version" Java class version number "java.vendor" Java vendor-specific string "java.vendor.url" Java vendor URL "java.version" Java version number "line.separator" Line separator "os.arch" Operating system architecture "os.name" Operating system name "path.separator" Path separator (for example, ":") Ejemplo de uso: String s = System.getProperty("os.name"); No permitidas Key Meaning "java.class.path" Java classpath "java.home" Java installation directory "user.dir" User's current working directory "user.home" User home directory "user.name" User account name • •

• • •

 Cada N crea un objeto de la clase SecurityManager  Se puede definir que restricciones se le aplican al applet. Si se violan, se produce una excepcion, que el programador puede tratar. •  Algunos applets paran su ejecución al salir de la pagina, pero otros continuan  Subclase de java.applet.Applet: por tanto hereda los métodos y clases para manipular gráficos, sonidos, etc...  PUBLIC class miclase extends java.applet.Applet: solo la clase principal debe ser pública por fuerza  A diferencia de las aplicaciones main(), applets son algo más complicados. Fases en la vida de un applet; Public void init() {...}: Ocurre cuando se carga por 1º vez el applet o al recargar. Crea objetos, estado inicial, carga imágenes o fuentes. Solo ocurre 1 vez en la vida de un applet. Public void start() {...}: Después de init o de stop: por ejemplo si vamos a otra página y después volvemos. Ocurre 1 o más veces por tanto Public void Stop() {...}:



Contrapartida de start(). Cuando el usuario deja una pagina, los threads lanzados se siguen ejecutando Destroy() {...} No es destrucción como en C++. Sirve para dejar bien atadas los cosas, p.ej. matar threads. Similar a finalize(), que es para objetos individuales. Destroy() solo en applets.  Public void paint(Graphics g) •  Applet crea una ventana y pinta en ella: texto, lineas, imágenes •  Paint puede ocurrir cientos de veces: cada vez que se mueve el navegador •  Toma argumento g pasado por N automáticamente •  Incluir import java.awt.Graphics Ejemplo1: // CicloVidaApplet.java

import java.awt.Graphics; import java.applet.Applet; public class CicloVidaApplet extends Applet { int contadorInit = 0; int contadorStart = 0; int contadorPaint = 0; int contadorStop = 0; int contadorDestroy = 0; public void init() {contadorInit++;} public void start() {contadorStart++;} public void paint(Graphics g) { contadorPaint++; g.drawString("Contador Init: " + contadorInit, 25,25); g.drawString("Contador Start: " + contadorStart, 25,50); g.drawString("Contador Paint: " + contadorPaint, 25,75); g.drawString("Contador Stop: " + contadorStop, 25,100); g.drawString("Contador Destroy: " + contadorDestroy, 25,125); } public void stop() {contadorStop++;} public void destroy() {contadorDestroy++;} } Ejemplo2: // BuenDiaSeñoraApplet.java import java.awt.Graphics; import java.awt.Font; import java.awt.Color; public class BuenDiaSeñoraApplet extends java.applet.Applet { Font f = new Font("Arial", Font.BOLD, 36); public void paint(Graphics g) { g.setFont(f); g.setColor(Color.red); g.drawString("Buen dia señora",5,50); } } Crear BuenDiaSeñoraApplet.HTML:



En el applet Java: •  No hay init(), start(), destroy() sobreescritos. •  36 es el tamaño •  posicion (x=5, y=50). El origen (0,0) es la esquina superior izquierda. •  Probar a cortar el texto •  No funciona. Hay que salir de N y volver a entrar •  Desactivando caché, tampoco funciona.

En el HTML: •  Ejemplo anterior es el más sencillo posible. •  El tag : extensión del lenguaje HTML para applets •  CODE es un atributo, el nombre del fichero class. •  El class debe estar en el mismo directorio. Para directorio especifico, CODEBASE (má tarde) •  WIDTH, HEIGTH son obligatorios. Dimensiones de la caja de applet. Si pequeña, se recorta. •  Cerrar con •  Opcionalmente línea siguiente a para N no Java ("Debería aparecer aquí un applet si el navegador es compatible con Java") •  Más sobre el tag . Otros atributos;





Texto alternativo

 * Parámetros: en aplicaciones, línea de comandos iba a args[] en main(). Applets no tiene línea de comandos. Para pasarlos en applets se necesitan dos cosas; •  un tag especial en el HTML •  código en el applet .java para recoger los parámetros Ej:

y String nombreDeLaFuente = getParameter("fuente"); Proteccion: se añade a continuación; If(nombreDelaFuente == null) nombreDeLaFuente == "Courier"; •  Los parámetros son siempre Strings. Si necesario valor numérico, tendremos que convertir Ej:

y int tamañoDeLetra; String tam = getParameter("tamaño"); If (tam == null) tamañoDeLetra = 20; } else tamañoDeLetra = Integer.parseInt(tam);

// OtroBuenDiaSeñoraApplet.java import java.awt.Graphics; import java.awt.Font; import java.awt.Color; public class OtroBuenDiaSeñoraApplet extends java.applet.Applet { Font f = new Font("Arial", Font.BOLD, 36); String nombre; // nuevo // nuevo public void init() { nombre = getParameter("Nombre"); if (nombre == null) nombre = "Maurito"; nombre = "Hola" + nombre + "!!!"; } // public void paint(Graphics g) { g.setFont(f); g.setColor(Color.red); g.drawString("Buen dia señora",5,50); } }



 • • •

11-

11-

Si se sumara "Hola " + etc... en paint, seria menos eficiente. En init(), solo se ejecuta 1 vez. Usar applets públicos:  O los cargamos localmente (dificultad: hay que bajar todas las clases, imágenes, sonidos, en misma jerarquía de directorios)  O llamamos a la clase principal con su URL en CODE  Las restricciones de seguridad: Son tan severas que los applets no pueden hacer nada demasiado serio sin autorización expresa (escribir, leer de disco, base de datos, procesador de textos). Al menos manteniendo la seguridad al 100%. GRAFICOS, TEXTO Y SONIDO • • • •

 Gráficos: coordenadas, líneas, puntos, círculos, óvalos, polígonos o imágenes GIF  Texto: fuentes, tamaños  Color: de fondo, de dibujo  Gráficos Líneas: g.drawline(10,10,50,50) Rectángulos: •  Cuadrados •  Esquinas redondeadas •  Con efecto 3D: borde en relieve Ej: g.drawRect(x,y,ancho,altura) g.fillRect(20,20,80,80) g.drawRoundRect(a,b,c,d,E,F) (ver p151 21days)

g.fillRoundRect(...) g.draw3Drect(20,20,60,60,true); •

Poligonos:

 Ej:

int listaCoordX[] = {0,10,20,10,50,0}; int listaCoordY[] = {0,20,30,60,40,0}; int numeroPuntosPoligono = listaCoordX.length; g.drawPolygon(listaCoordX,listaCoordY,numeroP untosPoligono); Con objetos;





int listaCoordX[] = {0,10,20,10,50,0}; int listaCoordY[] = {0,20,30,60,40,0}; int numeroPuntosPoligono = listaCoordX.length; Polygon poligono = new Polygon(listaCoordX, listaCoordY,numeroPuntosPoligono); g.drawPolygon(poligono); // poligono.addPoint(20,30); // boolean estaDentro = poligono.contains(x,y); •  Ovalos: g.drawOval(a,b,c,d) •  Arcos: g.drawArc(a,b,c,d,e,f,g) Copiando áreas de la pantalla g.copyAerea(origenX,origenY,ancho,altura,destinoX,destinoY) // Borrar un area. Se rellena con el color de fondo // Para borrar todo el applet;

• •



g.clearRect(0,0,size().width,size().heigth) // size() devuelve un objeto Dimension  Texto y fuentes  Clases Font y FontMetrics •  public Font(String nombre, int estilo, int tamaño) Estilos; PLAIN, BOLD(negrita), ITALIC, BOLD+ITALIC Ej: Font f = new Font("Helvetica", Font.BOLD, 14); // Font f = new Font("Helvetica", Font.BOLD + Font.ITALIC, 14); g.setFont(f); g.drawString("Texto en Helvetica y negrita", 10, 10); •  public FontMetrics(Font fuente) Permite centrar un texto. Da medidas de las letras, ancho, distancia a la base, etc...  Color •  De 24 bits. 3 componentes, espacio RGB •  0,0,0 es negro •  255,0,0 es rojo •  255,255,255 es blanco •  etc... •  colores predefinidos como constantes: Color.white, Color.yellow, Color.lightGray,etc.. Ej: Color miColor = new Color(130,124,31); g.setColor(miColor); // empieza a dibujar con el nuevo color

setBackground(Color.blue); // cambia el color de fondo del applet setForegrounf(Color.black(; // cambia de golpe el color de todo lo dibujado // CajasDeColores.java import java.awt.Graphics; import java.awt.Color; public class CajasDeColores extends java.applet.Applet { public void paint(Graphics g) { int rojo,verde,azul; for (int j = 30; j < (size().height - 25); j += 30) { for (int i = 5; i < (size().width - 25); i += 30) { rojo = (int) Math.floor(Math.random() * 256); verde = (int) Math.floor(Math.random() * 256); azul = (int) Math.floor(Math.random() * 256); g.setColor(new Color(rojo,verde,azul)); g.fillRect(i,j,25,25); g.setColor(Color.black); g.drawRect(i-1, j-1, 25, 25); } } •



}

} Imágenes: clase Image, método drawImage() // PintaFoto.java import java.applet.Applet; import java.awt.Graphics; import java.awt.Image; public class PintaFoto extends Applet { Image imagen; public void init() { imagen = getImage(getCodeBase(), "orb.gif"); //poner orb.gif en el directorio java ¡!! } public void paint(Graphics g) { int alturaImagen = imagen.getHeight(this); int anchuraImagen = imagen.getWidth(this); g.drawImage(imagen, 0, 0, this); g.drawImage(imagen, anchoImagen,0,anchoImagen/2, alturaImagen*2, this); // dibuja la imagen deformada }



 • • • •

} Sonido (p209 21days)  Java tiene soporte para reproducir el formato .AU de Sun.  Solo en applets  En aplicaciones, se puede recurrir a una clase no documentada, sun.audio  Las clases que comienzan por sun.XXX incluyen funciones que aun no se han estandarizado, pero que se prevé lo hagan en un futuro próximo. Pasará de

• • •

sun.audio a java.audio. De cualquier forma, no es recomendable utilizarla, cuestión de asegurar compatibilidad.  AU esta comprimido, pero calidad mediocre  método play(URL)  Ej: play(getCodeBase(), "audio/guitarra.au"); // SonidoApplet.java public class SonidoApplet extends java.applet.Applet { public void init() { play(getCodeBase(), "yahoo1.au"); // poner yahoo1.au en dir java! } } Comienza en cuanto carga el sonido Si no lo encuentra, no da error. No hará nada. Para lanzar sonidos que se repitan constantemente; AudioClip

•  •  •  Ej: import java.applet.AudioClip;

AudioClip clip = getAudioClip(getCodeBase(), "audio/ruidoDeFondo.au"); clip.play(); // suena solo una vez clip.loop(); // suena indefinidamente clip.stop(); // obliga a que se pare •  AudioClip no para de sonar aunque cambiemos de página. Por tanto, se suele implementar clip.stop() en el método stop() del applet. Ej: // SonidoApplet.java import java.applet.AudioClip; public class SonidoApplet extends java.applet.Applet { AudioClip sonido; public void init() { sonido = getAudioClip(getCodeBase(), "yahoo1.au"); } public void start() { sonido.loop(); } public void stop() { sonido.stop(); } } Ejemplos extraídos de: www.monografias.com/trabajos/java/java.shtml

12- ANIMACIONES SIMPLES Y MULTITHREADING Se puede hablar de dos tipos: •  Animación de tipo ‘dibujos animados’: presentar una sucesión rápida de Imagenes precargadas GIF o JPEG (p205 21days) •  Animación dibujada en tiempo real; veamos Un ejemplo que NO funciona (no aparece nada en pantalla); // MalRelojDigitalApplet.java import java.awt.Graphics; import java.awt.Font; import java.util.Date; public class MalRelojDigitalApplet extends java.applet.Applet { Font fuente = new Font("TimesRoman", Font.BOLD, 24); Date fecha; public void start() { while (true) { fecha = new Date(); repaint(); try { Thread.sleep(10000); } catch(InterruptedException e) {;} } }

• •

public void paint(Graphics g) { g.setFont(fuente); g.drawString(fecha.toString(), 10, 50); } }  ¿Porqué no funciona?: paint nunca se ejecuta ya que el bucle while monopoliza la ejecución.  Cómo debe hacerse para que funcione: usando Threads Ej: // BienRelojDigitalApplet.java import java.awt.Graphics; import java.awt.Font; import java.util.Date; public class BienRelojDigitalApplet extends java.applet.Applet implements Runnable //cambio { Font fuente = new Font("TimesRoman", Font.BOLD, 24); Date fecha; Thread runner; //cambio

//cambio public void start() { if (runner == null) { runner = new Thread(this); runner.start(); } else

}

{ System.out.println("Stop"); }

//cambio public void stop() { if (runner != null) { runner.stop(); runner = null; } else { System.out.println("Stop"); } } //cambio public void run() { while (true) { fecha = new Date(); repaint(); try { Thread.sleep(1000); } catch(InterruptedException e) {;} } }

• •

public void paint(Graphics g) { { g.setFont(fuente); g.drawString(fecha.toString(), 10, 50); } } }  El problema del parpadeo: el programa anterior funciona, pero se aprecia un parpadeo molesto cada 3 o 4 segundos  Porqué aparece parpadeo:

• • •

• •

 (las imagenes son demasiado grandes. Con pequeños cuadros es inapreciable el parpadeo)  repaint() llama al método update()  update() borra la pantalla por completo y la rellena con el color de fondo. Después llama a paint()

public void update(Graphics g) { g.setColor(getBackground()); g.fillRect(0,0,width,height); g.setColor(getForeground()); paint(g); } •  paint() escribe el nuevo pantallazo  Es la llamada a update() la que produce el parpadeo.  Soluciones posibles 1- 1Sobreescribir update() para que no borre la pantalla o que solo borre una cierta área 2- 2Clipping: re-dibujar solo aquello que cambia. Metodo clipRect() de la clase Graphics 3- 3Doble-buffering: hacer los cambios en una pantalla ‘virtual’ y volcar el resultado a la pantalla ‘real’. Es el método más complicado...

Ejemplo extraído de: www.monografias.com/trabajos/java/java.shtml

13- 13- LOS EVENTOS Y RESPUESTA AL USUARIO • •

• Ej:

 Los eventos son una parte del paquete AWT  Un evento es aparece cuando hay interacción con el usuario. Ejemplos de eventos; Se pulsa el botón del mouse (Java no se distingue entre botón izquierdo y derecho, por un problema de compatibilidad entre plataformas. En MacIntosh el mouse es de 1 solo botón) Se arrastra con el mouse Se maximiza o minimiza una ventana Se pulsa una tecla etc...  Eventos de mouse // PosicionDeClickApplet.java import java.awt.Event; import java.awt.Graphics; public class PosicionDeClickApplet extends java.applet.Applet { int x,y; //Point ultimo = null; //Point nuevo = null; public void paint(Graphics g) { if ( x*y != 0) { g.drawString("Has hecho CLICK en x = " + x +" , y = " + y,0,10); g.fillOval(x,y,10,10); } } public boolean mouseDown(Event evt, int x,int y) { this.x = x; this.y = y; System.out.println("Has hecho CLICK en x = " + x +" , y = " + y); repaint(); return true; }

•  •  •  Ej:

} Variación en el ejemplo anterior: cambiar mouseDown() por mouseMove() Si se cliquea y arrastra no lo detecta: habría que usar mouseDrag() mouseEnter() y mouseExit()

public boolean mouseEnter(Event evt, int x, int y) { setBackground(java.awt.Color.blue); repaint(); return true; }





Ej:

• • •

  

public boolean mouseExit(Event evt, int x, int y) { setBackground(java,awt.Color.red); repaint(); return true; } Eventos de teclado keyDown(Event evt, int key) keyUp(Event evt, int key) Modificadores: la clase Event tiene 3 métodos para controlar si se ha pulsado una tecla modificadora junto con el propio evento. Devuelven un booleano Event.shiftDown() Event.metaDown() (¿?) (un metakey parece ser algo popular en Unix, tipicamente corresponde a Alt, pero no se aconseja en beneficio de Control y Shift) Event.controlDown() public boolean mouseDown(Event evt, int x, int y) { if (evt.shiftDown()) {// tratar el evento shift+click} else {// tratar el evento click simple} } El manejador de eventos (‘AWT Event Handler’) Hay muchos más eventos, relacionados con el AWT Interfaz gráfica de usuario (AWT) AWT = Abstract Windowing Toolkit Permite crear entornos gráficos de ventanas, a la manera de Windows Aspecto ‘similar’ en varias plataformas Se han utilizado elementos comunes a todas las plataformas: barras deslizantes, botones, menús desplegables, etc.

1. Controles básicos •  Button •  Chekboxes •  Choice •  List •  Menu •  Text Field 2. Otros controles •  Slider •  Scrollbar •  Text Area •  Canvas •  Label •  Panel •  Scroll Pane 14- 14- CONCEPTO DE JERARQUIA DE COMPONENTES DEL PROGRAMA • • • •

 Una interfaz grafica lleva asociada una jerarquía (árbol)  P.ej.: las opciones de un menú son ‘hijas’ del menú, que a su vez es ‘hijo’ de la ventana en la que aparece, que a su vez es hijo del applet, etc.  Al [re]dibujar la interfaz, se hace siguiendo la jerarquía, de arriba a abajo.  Demasiado rápido para verse a simple vista.

15- COMO USAR LABELS // EjemploLabelApplet.java import java.awt.*; public class EjemploLabelApplet extends java.applet.Applet { public void init() { Label etiqueta1 = new Label("Label1"); Label etiqueta2 = new Label("Label2"); Label etiqueta3 = new Label("Label3"); add(etiqueta1); add(etiqueta2); add(etiqueta3); } } 16- COMO USAR BUTTONS //EjemploButtonApplet.java import java.awt.*; public class EjemploButtonApplet extends java.applet.Applet { public void init() { Label etiqueta1 = new Label("Label1"); Button boton1 = new Button("Boton 1"); Button boton2 = new Button("Boton 2");

}

add(boton1); add(etiqueta1); add(boton2); }

Probar a cambiar las dimensiones de la ventana de appletviewer: la disposición de los elementos es automática. 17- COMO USAR CHECKBOXES // EjemploAWTApplet.java ... add(new add(new add(new add(new ...



Checkbox("Concordia")); Checkbox("Rosario", null, true)); Checkbox("Chaco")); Checkbox("Catamarca"));

Metodos útiles: setState() //consulta el estado del checkbox setState() //altera el estado del checkbox etc...  RadioButton

• •

 Son un caso especial de Checkbox: solo 1 puede estar activo en su grupo, como los botones de una radio, que saltan al cambiarlos.  Hay que crear el CheckboxGroup

... CheckboxGroup cbg = new CheckboxGroup(); add(new Checkbox("Rojo", cbg, false)); add(new Checkbox("Azul", cbg, false)); add(new Checkbox("Verde", cbg, true)); add(new Checkbox("Negro", cbg, false)); ... Ejemplos extraidos de: htpp//:arcoinf.uc3m.esp/yy_pstr 18- 18- COMO USAR CHOICE MENU Un menú Choice es desplegable. Permite seleccionar un item del menú ... Choice c = new Choice(); // crea el menu desplegable c.addItem("Naranja"); c.addItem("Manzana"); c.addItem("Pera"); add(c); // añade el menu al panel ... Métodos útiles: getItem(int n) devuelve el string de la opcion n-esima getSelectedIndex() devuelve el índice de la opción seleccionada //Este tipo de menús solo permiten seleccionar una opción. Para múltiples opciones, usar una lista 19- COMO USAR TEXTFIELDS •  Permite al usuario introducir texto ... add(new Label("Nombre completo")); add(new TextField("-escriba aquí su nombre-")); add(new Label("Telefono")); add(new TextField(12)); add(new Label("Password")); TextField t = new TextField(20); t.setEchoCharacter('*'); add(t); ... Metodos útiles: setEditable(boolean) define si el testo es editable o no select(int, int) selecciona el texto entre las dos posiciones (origen = 0) etc. 20- COMO USAR TEXTAREA Es un componente similar a TextField. TextField es más conveniente para pequeños textos, idealmente de una sola linea. No tiene barras de deslizamiento TextArea en más conveniente para textos largos, de más de una linea. Por defecto, tiene barras de deslizamiento

•  •  ... String texto = "Erase una vez un bosque en el que vivían siete enanitos que eran\n" +

"hermanos. Decidieron construirse una casa, y vivir en el bosque\n" + "ellos trabajaban todo el dia, Blancanieves cocinaba y limpiaba la casa\n" + "Un buen dia apareció por allí la malvada bruja y blablabla..."; // el carácter ‘\n’ es para forzar el retorno de línea add(new TextArea(texto, 10, 60)); ... Metodos útiles: insertText(String, int) // inserta texto en la posicion indicada replaceText(String, int,int) // reemplaza el texto entre las posiciones dadas etc. 21- 21- COMO USAR FRAMES Y DIALOGS La clase Window de AWT permite crear ventanas independientes del navegador que contiene al applet. Frame es más potente que Dialog El LayoutManager por defecto para Frame es BorderLayout Los Dialog son ventanas emergentes pensadas para mensajes no permanentes, como ‘ADVERTENCIA’, peticion de información especifica, etc, que una vez presentados al usuario pueden desaparecer (p.ej.: ‘Se va a proceder a la instalación de HyperQuake V. Confirmar?’) Se puede forzar a que sean no redimensionables o ‘modales’ Un Dialog ‘modal’ es aquel que impide usar otra ventana hasta que no se lleve a cabo la acción de la presente ventana (p.ej.: ‘Es necesario que introduzca la clave de acceso para continuar la ejecucion’) A su vez existen dos clases de Dialog: •  Dialog (a secas!) •  FileDialog: •  Presenta los ficheros del directorio, abrir, cancelar, etc. •  Debido a las restricciones de los applets, tiene muchas más funcionalidades si se emplea en una aplicación Java ... // Ejemplo de utilización de Frame Frame ventanaFrame = new Frame("Mi ventana FRAME"); ventanaFrame.setLayout(new FlowLayout()); //por defecto es BorderLayout ventanaFrame.add(new Button("Opcion 1")); ventanaFrame.add(new Button("Opcion 2")); ventanaFrame.add(new Button("Opcion 3")); ventanaFrame.resize(100,150); //define el tamaño de la ventana Point dim = location(); //devuelve la posicion de este componente, como la esquina supizda //medida respecto al componente padre ventanaFrame.move(dim.x + 50, dim.y + 50); ventanaFrame.show(); //cuando se crea la ventana, es invisible. Para ocultarla, hide() 22- COMO USAR LIST Son menús, pero no desplegables Es una lista de ítems en la que se puede elegir uno o varios Si el numero de ítems es mayor que la longitud de la lista, aparecen barras de deslizamiento ... List lista = new List(5, true); // crea una lista que tendra 5 líneas, y que permitirá // seleccion multiple (valor 'true') lista.addItem("Marte"); lista.addItem("Saturno"); lista.addItem("Pluton");

lista.addItem("Urano"); lista.addItem("Jupiter"); // si se añade un sexto elemento, se creara automaticamente // una barra deslizante add(lista); ... Métodos utiles: getSelectedIndex() // devuelve el indice del item seleccionado, si no se permite seleccion mult. getSlectedIndexes() // devuelve un array de indices de los items seleccionados getSelectedItem() // devuelve el item seleccionado getSlectedItems() // idem varios items select(int) // fuerza a que esté seleccionado el item de la posición dada etc. 23-

23-

COMO USAR SCROLLBARS Los componentes TextArea y TextField vienen con sus propias barras deslizantes. Pero también se pueden crear barras deslizantes independientes, típicamente para manipular rangos de valores entre un máximo y un mínimo. Para variar el valor asociado, hay tres formas: Cliquear las flechas de los extremos. Variación unitaria. Cliquear en la barra. Variacion en saltos, 10 por defecto. Cliquear y arrastar el ‘elevador’.

...Scrollbar barraDeslizante = new Scrollbar(Scrollbar.HORIZONTAL); add(barraDeslizante); ... // constructor más general: // Scrollbar(int orientacion, int valorInicial, int anchura, int valorMinimo, int valorMaximo); ... Métodos utiles: getValue() // Devuelve el valor actual de la barra setValue() // Asigna un valor a la barra Ejemplos extraído de: htpp//:arcoinf.uc3m.esp/yy_pstr 24-

24-

COMO USAR CANVAS Un componente Canvas es un objeto que permite dibujar en él. No hace nada por sí mismo. Esta pensado para ser extendido por herencia.

Canvas can = new Canvas(); add(can); 25-

25-

COMO USAR PANELS Es un tipo de ‘Container’ Permite definir un área en la cual incluir otros componentes, incluidos otros Panels (‘paneles anidados’). De esta forma los componentes se agrupan, dando un aspecto ordenado al conjunto de la interfaz gráfica. Para que esta ordenación sea eficaz, hay que usar Panel en un componente que tenga bien definida la disposición mediante un LayoutManager (se ve más adelante).

Panel unPanel = new Panel(); unPanel.add(new Label("Arriba")); unPanel.add(new Label("Abajo")); add(unPanel);

26-

26-

COMO USAR SCROLL PANES Define un área para mostrar un solo componente con barras deslizantes. La utilización típica es la de visualizar una imagen dentro del ScrollPane. Si la imagen es mayor que el arrea del ScrollPane, este crea automáticamente las barras deslizantes necesarias. Se puede forzar que no haya barras.

NOTA: utilizar ScrollPane es un poco más complicado que los componentes anteriores. En este ejemplo se ha tenido que definir una clase aparte, que hereda de Canvas, e implementar varios Metodos para que la imagen aparezca con un tamaño adecuado Image foto = getImage(getCodeBase(), "orb.gif"); ScrollableCanvas sCanvas = new ScrollableCanvas(foto); ScrollPane sPane = new ScrollPane(); sPane.add(sCanvas); add(sCanvas); // Ahora viene la clase que hemos definido (se pueden incluir varias clases en un mismo fichero siempre que solo haya una de ellas con el atributo ‘public’ class ScrollableCanvas extends Canvas { Dimension preferredSize; Dimension minimumSize; Image imagen; // Constructor de la clase ScrollableCanvas (definida por nosotros ¡!) public ScrollableCanvas(Image imagen) { this.imagen = imagen; preferredSize = new Dimension(600, 320); minimumSize = new Dimension(10, 10); } public Dimension getMinimumSize() { return minimumSize; } public Dimension getPreferredSize() { return preferredSize; } public void paint(Graphics g)

}

{ g.drawImage(imagen, 0, 0, getBackground(), this); }

Ejemplos extraidos de: htpp//:arcoinf.uc3m.esp/yy_pstr

27-

27-

OTROS COMPONENTES MenuShortcut: asocia una combinación de teclas para activar una opción de menu (p.ej.:Control-S para grabar archivo) PopupMenu: menu flotante

28-

28-

LAYOUTMANAGER

La disposición de componentes en un panel depende del Layout Manager establecido y del orden en que se van añadiendo los componentes con add(). Cada Panel puede tener su propio LM, incluso si se anidan paneles. El AWT tiene los siguientes LM: FlowLayout GridLayout GridBagLayout BorderLayout CardLayout Layout hecho ‘a medida’ por el usuario Sin Layout: posicionamiento absoluto de los componentes •  No es recomendable usarlo, porque las coordenadas de pantalla dependen de la plataforma, y esto va en contra de la filosofía Java de hacer programas portables •  En un sistema puede quedar perfecto y otro ser un completo desastre. •  FlowLayout Es la clase más sencilla. Simplemente se van añadiendo los componentes uno detrás de otro, en línea. Si no caben en una línea, se pasa a la siguiente. Es el LM por defecto. setLayout(new FlowLayout()); setLayout(new FlowLayout(FlowLayout.LEFT), 10, 10); // alineacion izquierda, con distancias de 10 pixeles en horizontal y vertical •  GridLayout Dividen la superficie del panel en filas y columnas. •  Al añadir componentes con add(), estos se distribuyen por las celdas

Panel panelGridLayout = new Panel(); panelGridLayout.setLayout(new GridLayout(3,3)); // Layout de 3 filas y 3 columnas pa.nelGridLayout.add(etiqueta1); panelGridLayout.add(boton1); panelGridLayout.add(boton2); panelGridLayout.add(boton3); add(panelGridLayout); Otro constructor: public GridLayout(int rows, int columns, int horizontalGap, int verticalGap) // define tambien la separación entre celdas, en pixels •







GridBagLayout Es el LM más complejo y potente. Permite definir celdas, pero de distinto tamaño Tambien se puede definir el comportamiento de las celdas al variar el tamaño de la ventana que los contiene (ver GridBagConstraints): se mantiene su tamaño, utilizan el nuevo espacio disponible, etc. BorderLayout

Se indica la posicion ‘geográfica’ del componente: norte, sur, este, oeste o centro. Panel panelBorderLayout = new Panel(); panelBorderLayout.setLayout(new BorderLayout(5,5)); panelBorderLayout.add("Center", etiqueta1); panelBorderLayout.add("North", boton1); panelBorderLayout.add("East", boton2); panelBorderLayout.add("West", boton3); panelBorderLayout.add("South", boton4); add(panelBorderLayout); •



CardLayout Esta clase se usa para hacer ‘slide show’, es decir una sucesión de ‘tarjetas’ en pantalla. Los paneles se presentan ‘uno cada vez’.

... Panel panelCardLayout = new Panel(); panelCardLayout.setLayout(new CardLayout()); panelCardLayout.add("primero", new Button("Boton 14")); panelCardLayout.add("segundo", new Button("Boton 15")); panelCardLayout.add("tercero", new Button("Boton 16")); panelCardLayout.add("cuarto", new Button("Boton 17")); ((CardLayout)panelCardLayout.getLayout()).show(panelCardLayout, "tercero"); // complicadillo... add(panelCardLayout); Metodos utiles: public void first(Container parent) public void next(Container parent) public void previous(Container parent) public void last(Container parent) •  Sin LayoutManager Para hacer posicionamiento absoluto, se declara hace: setLayout(null) •  Insets •  Definen un espacio de ‘marco’ del panel. •  Se pueden asignar anchos independientes a los 4 lados public Insets insets() { return new Insets(10,10,10,10); // 10 pixels en los 4 lados }

29• • •

• • •

29-

EL CONTROL DE EVENTOS (EVENT HANDLING)

 Los componentes que hemos usado hasta ahora no hacen nada.  En realidad, generan un evento, que hay que recoger e interpretar para asociarlo a una acción.  Situaciones que generan eventos; Pulsar una tecla Ampliar una ventana Pulsar Return en una entrada de texto Mover el mouse Hacer click con el mouse etc. y en general cualquier cosa que haga el usuario  En JDK1.0.x, los eventos se pasan hacia arriba en la jerarquía de componentes hasta que un objeto responde al evento  En JDK1.1.x, los eventos se envían a objetos que están registrados como escuchadores de eventos (event listeners)  Eventos en JDK1.0.x •  Usa un mecanismo que ha quedado obsoleto. No se recomienda su uso. La version JDK1.1.x conserva el mecanismo antiguo para asegurar la compatibilidad, pero define uno nuevo, cuyo uso se recomienda. •  El compilador devuelve ‘deprecated’ si se usan los Metodos del antiguo, pero no da error. •  El gestionador de eventos de cada componente puede reaccionar de alguna de las formas siguientes; •  Ignorando el evento y pasándolo al Componente superior en jerarquía. Es lo que se hace por defecto. •  Modificando el evento (que es un objeto) y pasándolo al nivel superior. P.ej.: un texto se convierte a mayúsculas y se pasa •  Reaccionando al evento y parando su propagación hacia arriba. P.ej.: si se introduce un carácter no valido en un TextField, el evento no se propaga, y los componentes superiores nunca lo verán •  Los objetos de la clase Event Cada evento produce la creación de un objeto de la clase predefinida Event, que incluye la siguiente información; •  Tipo de evento: p.ej. pulsación de tecla, Boton del mouse, apertura de ventana,... •  Objeto en el que se ha producido el evento: p.ej. Boton, ventana, textField,... •  Tiempo en que se produjo el evento •  Posicion (x,y) en que se produjo, relativo al origen del componente. •  Para eventos de teclado, la tecla pulsada y el estado de los modificadores Shift, Alt, Ctrl •  Un argumento arbitrario, como un String •  etc.

action() (Event.ACTION_EVENT) // solo lo producen los componentes básicos: // Button, Checkbox, Choice, List, MenuItem, y TextField mouseEnter() (Event.MOUSE_ENTER) mouseExit() (Event.MOUSE_EXIT) mouseMove() (Event.MOUSE_MOVE) mouseDown() (Event.MOUSE_DOWN) mouseDrag() (Event.MOUSE_DRAG) mouseUp() (Event.MOUSE_UP) keyDown() (Event.KEY_PRESS or Event.KEY_ACTION) keyUp() (Event.KEY_RELEASE or Event.KEY_ACTION_RELEASE)

gotFocus() (Event.GOT_FOCUS) lostFocus() (Event.LOST_FOCUS) handleEvent() (all event types) Ejemplo de programa que interpreta eventos a la manera de JDK1.0.x; // BotonesColoresApplet.java // EVENTOS JDK 1.0.x import java.awt.*; public class BotonesColoresApplet extends java.applet.Applet { TextArea areaTexto; Panel panel1; public void init() { setLayout(new BorderLayout()); panel1 = new Panel(); panel1.add(new Button("Rojo")); panel1.add(new Button("Azul")); panel1.add(new Button("Verde")); panel1.add(new Button("Amarillo")); areaTexto = new TextArea(15, 10); areaTexto.setEditable(false); add("North",panel1); add("South",areaTexto); } public boolean handleEvent(Event evt) { switch(evt.id) { case Event.ACTION_EVENT : if (evt.target instanceof Button) { cambiaColor((String) evt.arg); } break; case Event.GOT_FOCUS: areaTexto.append("GOT_FOCUS \n"); return true; case Event.LOST_FOCUS: areaTexto.append("LOST_FOCUS \n"); return true; case Event.MOUSE_ENTER: areaTexto.append("MOUSE_ENTER, x=" + evt.x + " y=" + evt.y + "\n"); return true;

case Event.MOUSE_EXIT: areaTexto.append("MOUSE_EXIT, x=" + evt.x + " y=" + evt.y + "\n"); return true; default: return false; } return true; } public void cambiaColor(String nombreColor) { if (nombreColor.equals("Rojo")) areaTexto.setBackground(Color.red); else if (nombreColor.equals("Azul")) areaTexto.setBackground(Color.blue); else if (nombreColor.equals("Verde")) areaTexto.setBackground(Color.green); else if (nombreColor.equals("Amarillo")) areaTexto.setBackground(Color.yellow); } } •



 Despues de tratar el evento, se devuelve un boolean, que indica si se debe propagar hacia arriba el evento True: no se propaga el evento False: se propaga el evento  Eventos en JDK 1.1.x En el nuevo mecanismo, todo objeto que desee recibir los eventos generados debe darse de alta (declararse) como ‘observador’ de estos eventos. asi, cada objeto esta ‘atento’ solo a los eventos que le interesan. Se utiliza el concepto de ‘interface’ •  Cuando una clase implementa una ‘interface’, debe tener definidos unos métodos que están asociados a esa interface. Esto permite crear una especie de herencia múltiple, que de otro modo seria imposible.

// EjemploDeEventos.java // EVENTOS JDK 1.1.x import java.awt.*; import java.awt.event.*; class BotonesDeColores implements MouseListener, ActionListener { TextArea areaTexto; Button boton1, boton2, boton3; MenuBar barraMenu; Menu menu1; MenuItem opcionMenu1_1; Label label1; Panel panel1; // Constructor public BotonesDeColores() { Frame f = new Frame(); f.setLayout(new BorderLayout()); // Creo todos los objetos Componentes panel1 = new Panel();

label1 = new Label("Normal"); boton1 = new Button("Rojo"); boton2 = new Button("Azul"); boton3 = new Button("Verde"); barraMenu = new MenuBar(); menu1 = new Menu("Archivo"); opcionMenu1_1 = new MenuItem("Salir"); areaTexto = new TextArea(15, 10); areaTexto.setEditable(false); // Estructuro todos los componentes panel1.add(boton1); panel1.add(boton2); panel1.add(boton3); panel1.add(label1); menu1.add(opcionMenu1_1); barraMenu.add(menu1); f.add("North", panel1); f.add("South", areaTexto); f.setMenuBar(barraMenu); f.setSize(300,320); f.setVisible(true); // Observador de areaTexto areaTexto.addMouseListener(this); // Observador de label1 label1.addMouseListener(this); // Observador de los botones boton1.addActionListener(this); boton2.addActionListener(this); boton3.addActionListener(this); // Observador de la opcion de menu opcionMenu1_1.addActionListener(this); } // Métodos de la interfaz MouseListener public void mouseClicked(MouseEvent e) { areaTexto.append("mouseClicked: x=" + e.getX() + ", y=" + e.getY() + "\n"); } public void mouseEntered(MouseEvent e) { areaTexto.append("mouseEntered: x=" + e.getX() + ", y=" + e.getY() + "\n"); if (e.getComponent() == label1) { label1.setText("CURSIVA"); label1.setBackground(Color.red); areaTexto.setFont(new Font("TimesRoman", Font.ITALIC, 14)); } } public void mouseExited(MouseEvent e)

{ areaTexto.append("mouseExited: x=" + e.getX() + ", y=" + e.getY() + "\n"); if (e.getComponent() == label1) { label1.setText("Normal"); label1.setBackground(Color.white); areaTexto.setFont(new Font("TimesRoman", Font.PLAIN, 14)); } } public void mousePressed(MouseEvent e) { areaTexto.append("mousePressed: x=" + e.getX() + ", y=" + e.getY() + "\n"); } public void mouseReleased(MouseEvent e) { areaTexto.append("mouseReleased: x=" + e.getX() + ", y=" + e.getY() + "\n"); } // Métodos de la interfaz ActionListener public void actionPerformed(ActionEvent e) { String cadena = e.getActionCommand(); if (cadena.equals("Salir")) { System.exit(0); } else { cambiaColor(cadena); } } // Otros metodos public void cambiaColor(String nombreColor) { if (nombreColor.equals("Rojo")) areaTexto.setBackground(Color.red); else if (nombreColor.equals("Azul")) areaTexto.setBackground(Color.blue); else if (nombreColor.equals("Verde")) areaTexto.setBackground(Color.green); else if (nombreColor.equals("Amarillo")) areaTexto.setBackground(Color.yellow); } } public class EjemploDeEventos { public static void main(String args[]) { BotonesDeColores bdc = new BotonesDeColores(); } } •







En el ejemplo solo se han utilizado dos clases de eventos: ActionEvent MouseEvent Pero existen muchos mas en la clase java.awt.event .

Ejemplos extraídos de: htpp//:arcoinf.uc3m.esp/yy_pstr 30- EJEMPLOS DE LOS TEMAS VISTOS Ilustración de las fases de vida de un applet // CicloVidaApplet.java import java.awt.Graphics; import java.applet.Applet; public class CicloVidaApplet extends Applet { int contadorInit = 0; int contadorStart = 0; int contadorPaint = 0; int contadorStop = 0; int contadorDestroy = 0; public void init() {contadorInit++;} public void start() {contadorStart++;} public void paint(Graphics g) { contadorPaint++; g.drawString("Contador g.drawString("Contador g.drawString("Contador g.drawString("Contador g.drawString("Contador }

Init: " + contadorInit, 25,25); Start: " + contadorStart, 25,50); Paint: " + contadorPaint, 25,75); Stop: " + contadorStop, 25,100); Destroy: " + contadorDestroy, 25,125);

public void stop() {contadorStop++;} public void destroy() {contadorDestroy++;} } Clases para hacer gráficos sencillos. Colores.

// CajasDeColores.java // Dibuja una serie de rectángulos y los rellena con colores de componentes RGB aleatorias import java.awt.Graphics; import java.awt.Color; public class CajasDeColores extends java.applet.Applet { public void paint(Graphics g) { int rojo,verde,azul; for (int j = 30; j < (size().height - 25); j += 30) { for (int i = 5; i < (size().width - 25); i += 30) { rojo = (int) Math.floor(Math.random() * 256); verde = (int) Math.floor(Math.random() * 256); azul = (int) Math.floor(Math.random() * 256);

g.setColor(new Color(rojo,verde,azul)); g.fillRect(i,j,25,25); g.setColor(Color.black); g.drawRect(i-1, j-1, 25, 25); } }

}

} Carga un sonido y lo interpreta

// SonidoApplet.java import java.applet.AudioClip; public class SonidoApplet extends java.applet.Applet { AudioClip sonido; public void init() { // El fichero de sonido se llama 'yahoo.au' y está en el directorio del fichero html sonido = getAudioClip(getCodeBase(), "yahoo1.au"); } public void start() { sonido.loop(); } public void stop() { sonido.stop(); } } Cómo tratar los eventos

// EjemploDeEventos.java // EVENTOS JDK 1.1.x // Muestra una ventana con 3 botones que cambian el color al cliquearlos import java.awt.*; import java.awt.event.*; class BotonesDeColores implements MouseListener, ActionListener { // Declara los componentes que luego se usaran para crear la interfaz grafica TextArea areaTexto; Button boton1, boton2, boton3; MenuBar barraMenu; Menu menu1; MenuItem opcionMenu1_1; Label label1; Panel panel1;

// Constructor public BotonesDeColores() { Frame f = new Frame(); f.setLayout(new BorderLayout()); // Creo todos los objetos Componentes panel1 = new Panel(); label1 = new Label("Normal"); boton1 = new Button("Rojo"); boton2 = new Button("Azul"); boton3 = new Button("Verde"); barraMenu = new MenuBar(); menu1 = new Menu("Archivo"); opcionMenu1_1 = new MenuItem("Salir"); areaTexto = new TextArea(15, 10); areaTexto.setEditable(false); // Estructuro todos los componentes panel1.add(boton1); panel1.add(boton2); panel1.add(boton3); panel1.add(label1); menu1.add(opcionMenu1_1); barraMenu.add(menu1); f.add("North", panel1); f.add("South", areaTexto); f.setMenuBar(barraMenu); f.setSize(300,320); f.setVisible(true); // Observador de areaTexto areaTexto.addMouseListener(this); // Observador de label1 label1.addMouseListener(this); // Observador de los botones boton1.addActionListener(this); boton2.addActionListener(this); boton3.addActionListener(this); // Observador de la opcion de menu opcionMenu1_1.addActionListener(this); } // Métodos del interfaz MouseListener public void mouseClicked(MouseEvent e) { areaTexto.append("mouseClicked: x=" + e.getX() + ", y=" + e.getY() + "\n"); } public void mouseEntered(MouseEvent e) { areaTexto.append("mouseEntered: x=" + e.getX() + ", y=" + e.getY() + "\n"); if (e.getComponent() == label1) { label1.setText("CURSIVA");

label1.setBackground(Color.red); areaTexto.setFont(new Font("TimesRoman", Font.ITALIC, 14)); } } public void mouseExited(MouseEvent e) { areaTexto.append("mouseExited: x=" + e.getX() + ", y=" + e.getY() + "\n"); if (e.getComponent() == label1) { label1.setText("Normal"); label1.setBackground(Color.white); areaTexto.setFont(new Font("TimesRoman", Font.PLAIN, 14)); } } public void mousePressed(MouseEvent e) { areaTexto.append("mousePressed: x=" + e.getX() + ", y=" + e.getY() + "\n"); } public void mouseReleased(MouseEvent e) { areaTexto.append("mouseReleased: x=" + e.getX() + ", y=" + e.getY() + "\n"); } // Métodos del interfaz ActionListener public void actionPerformed(ActionEvent e) { String cadena = e.getActionCommand(); if (cadena.equals("Salir")) { System.exit(0); } else { cambiaColor(cadena); } } // Otros métodos public void cambiaColor(String nombreColor) { if (nombreColor.equals("Rojo")) areaTexto.setBackground(Color.red); else if (nombreColor.equals("Azul")) areaTexto.setBackground(Color.blue); else if (nombreColor.equals("Verde")) areaTexto.setBackground(Color.green); else if (nombreColor.equals("Amarillo")) areaTexto.setBackground(Color.yellow); } } // Método de entrada al programa. Es el primero que se ejecuta al lanzarlo public class EjemploDeEventos { public static void main(String args[]) {

BotonesDeColores bdc = new BotonesDeColores(); }

} Control de eventos mediante clases internas

// EjemploDeEventos2.java // EVENTOS JDK 1.1.x mediante clases internas import java.awt.*; import java.awt.event.*; class BotonesDeColores { TextArea areaTexto; Button boton1, boton2, boton3; MenuBar barraMenu; Menu menu1; MenuItem opcionMenu1_1; Label label1; Panel panel1; SymMouse aSymMouse; SymAction aSymAction; // Constructor public BotonesDeColores() { Frame f = new Frame(); f.setLayout(new BorderLayout()); // Creo todos los objetos Componentes panel1 = new Panel(); label1 = new Label("Normal"); boton1 = new Button("Rojo"); boton2 = new Button("Azul"); boton3 = new Button("Verde"); barraMenu = new MenuBar(); menu1 = new Menu("Archivo"); opcionMenu1_1 = new MenuItem("Salir"); areaTexto = new TextArea(15, 10); areaTexto.setEditable(false); // Estructuro todos los componentes panel1.add(boton1); panel1.add(boton2); panel1.add(boton3); panel1.add(label1); menu1.add(opcionMenu1_1); barraMenu.add(menu1); f.add("North", panel1); f.add("South", areaTexto); f.setMenuBar(barraMenu); f.setSize(300,320); f.setVisible(true); aSymMouse = new SymMouse(); aSymAction = new SymAction(); // Observador de areaTexto areaTexto.addMouseListener(aSymMouse);

// Observador de label1 label1.addMouseListener(aSymMouse); // Observador de los botones boton1.addActionListener(aSymAction); boton2.addActionListener(aSymAction); boton3.addActionListener(aSymAction); // Observador de la opción de menu opcionMenu1_1.addActionListener(aSymAction); } //Clase interna que controla los eventos de mouse. Extiende de MouseAdapter que a su vez implementa el interfaz MouseListener class SymMouse extends MouseAdapter { public void mouseClicked(MouseEvent event) { areaTexto.append("mouseClicked: x=" + event.getX() + ", y=" + event.getY() + "\n"); Object object = event.getSource(); if (object == boton1) { //boton1_MouseClick(event); areaTexto.append("\t boton1"); } else if (object == boton2) { //boton2_MouseClick(event); areaTexto.append("\t boton2"); } else if (object == boton3) { //boton3_MouseClick(event); areaTexto.append("\t boton3"); } } public void mouseEntered(MouseEvent e) { areaTexto.append("mouseEntered: x=" + e.getX() + ", y=" + e.getY() + "\n"); if (e.getComponent() == label1) { label1.setText("CURSIVA"); label1.setBackground(Color.red); areaTexto.setFont(new Font("TimesRoman", Font.ITALIC, 14)); } } public void mouseExited(MouseEvent e) { areaTexto.append("mouseExited: x=" + e.getX() + ", y=" + e.getY() + "\n"); if (e.getComponent() == label1) { label1.setText("Normal");

}

label1.setBackground(Color.white); areaTexto.setFont(new Font("TimesRoman", Font.PLAIN, 14));

} public void mousePressed(MouseEvent e) { areaTexto.append("mousePressed: x=" + e.getX() + ", y=" + e.getY() + "\n"); } public void mouseReleased(MouseEvent e) { areaTexto.append("mouseReleased: x=" + e.getX() + ", y=" + e.getY() + "\n"); } } //fin de la clase interna SymMouse //Clase interna que controla los eventos generales class SymAction implements ActionListener { // Métodos del interfaz ActionListener public void actionPerformed(ActionEvent e) { String cadena = e.getActionCommand(); if (cadena.equals("Salir")) { System.exit(0); } else { cambiaColor(cadena); } } } //fin de la clase interna SymMouse public void cambiaColor(String nombreColor) { if (nombreColor.equals("Rojo")) areaTexto.setBackground(Color.red); else if (nombreColor.equals("Azul")) areaTexto.setBackground(Color.blue); else if (nombreColor.equals("Verde")) areaTexto.setBackground(Color.green); else if (nombreColor.equals("Amarillo")) areaTexto.setBackground(Color.yellow); } } //fin de la clase BotonesDeColores public class EjemploDeEventos2 { public static void main(String args[]) { new BotonesDeColores(); } }

Aplicación de los streams a la lectura y escritura en disco // EscribeEnDisco.java import java.io.*; public class EscribeEnDisco { public static void main(String args[]) { FileOutputStream fos = null; PrintWriter pw = null; // Crea el fichero para guardar los datos File ficheroDeSalida = new File("c:/Javadir/historia", "salida.txt"); try

{ fos = new FileOutputStream(ficheroDeSalida); } catch (IOException e) { System.out.println(e); } catch(SecurityException e) { System.out.println(e); } pw = new PrintWriter(fos); // Escribe una secuencia de texto en el fichero for (int i = 0; i < 10; i++) { pw.println("Linea " + i + " " + System.currentTimeMillis()); } // Escribir realmente en el disco pw.flush(); // Cerrar Streams try { fos.close(); } catch(IOException e) { System.out.println(e); } } } import java.io.*; public class LeeDeDisco { public static void main(String args[])

{ FileInputStream fis = null; BufferedReader br = null; String linea; File ficheroDeEntrada = new File("c:/Javadir/historia", "salida.txt"); try { fis = new FileInputStream(ficheroDeEntrada); } catch (FileNotFoundException e) { System.out.println(e); } catch(SecurityException e) { System.out.println(e); } br = new BufferedReader(new InputStreamReader(fis)); while (true) { try { linea = br.readLine(); pw.flush(); } catch (UnknownHostException e) { System.err.println(e); } catch (IOException e) { System.err.println(e); } } } Utilización de los sockets para mandar mensajes entre dos máquinas // Cliente.java import java.io.*; import java.net.*; public class Cliente { public static void main(String args[]) { Socket socketCliente = null; InputStream is = null; OutputStream os = null; BufferedReader br; PrintWriter pw = null; try { socketCliente = new Socket("",3000); // dirIP y port System.out.println("Me he conectado con el servidor!"); // Recibe texto de bienvenida is = socketCliente.getInputStream( ); os = socketCliente.getOutputStream();

}

pw = new PrintWriter(os); br = new BufferedReader(new InputStreamReader(is)); while (true) { if (is.available() != 0) { System.out.println(is.available()); System.out.println("El servidor me envia este mensaje: " + br.readLine()); } } // pw.println("¿Que tal? Soy un cliente"); // pw.flush(); } catch (UnknownHostException e) { System.err.println(e); } catch (IOException e) { System.err.println(e); }

} // Servidor.java import java.io.*; import java.net.*; public class Servidor { // Constructor public Servidor( ) { super( ); } public static void main(String args[]) { int numeroDePuerto = 3000; ServerSocket socketServidor = null; OutputStream os = null; InputStream is = null; PrintWriter pw = null; BufferedReader br; try { socketServidor = new ServerSocket(numeroDePuerto); System.out.println("Servidor creado. Esperando conexion de clientes..."); } catch (IOException e) { System.err.println(e); } int contador = 0; while (true) { try { Socket socketCliente = socketServidor.accept( );

System.out.println("He aceptado otro socket cliente"); System.out.println("Ya se han conectado " + ++contador + " clientes"); // Envia texto de bienvenida os = socketCliente.getOutputStream(); pw = new PrintWriter(os); is = socketCliente.getInputStream(); br = new BufferedReader(new InputStreamReader(is)); pw.println("HOLA. Bienvenido al servidor !"); pw.flush(); System.out.println("El cliente me envia este mensaje: " + br.readLine());

} }

} catch (IOException e) { System.err.println(e); }

}

Muestra una página web dentro de un applet // CargaPaginaWeb.java import java.net.*; public class CargaPaginaWeb extends java.applet.Applet { public void init() { URL direccionURL = null; try { direccionURL = new URL("http://www.yahoo.com/"); } catch(MalformedURLException e) { System.out.println(e); } getAppletContext().showDocument(direccionURL); } } Carga la fuente de una pagina web en formato html y la muestra en pantalla // CargaOrigenDeURL.java import java.io.*; import java.net.URL; public class CargaOrigenDeURL { // Constructor public CargaOrigenDeURL() { InputStream conn; DataInputStream data; String linea; StringBuffer buferDeTexto = new StringBuffer(); URL direccionURL = null; try { direccionURL = new URL("http://www.yahoo.com");

conn = direccionURL.openStream(); data = new DataInputStream(new BufferedInputStream(conn)); while ((linea = data.readLine()) != null) { buferDeTexto.append(linea + "\n"); } System.out.println(buferDeTexto.toString()); } catch(IOException e) {} } public static void main(String args[]) { new CargaOrigenDeURL(); } } Los ejemplos fueron extraídos de: htpp//:arcoinf.uc3m.esp/yy_pstr 31- Paquetes de Java El lenguaje Java proporciona una serie de paquetes que incluyen ventanas, utilidades, un sistema de entrada/salida general, herramientas y comunicaciones. En la versión actual del JDK, los paquetes Java que se incluyen son: java.applet Este paquete contiene clases diseñadas para usar con applets. Hay una clase Applet y tres interfaces: AppletContext, AppletStub y AudioClip. java.awt El paquete Abstract Windowing Toolkit (awt) contiene clases para generar widgets y componentes GUI (Interfaz Gráfico de Usuario). Incluye las clases Button, Checkbox, Choice, Component, Graphics, Menu, Panel, TextArea y TextField. java.io El paquete de entrada/salida contiene las clases de acceso a archivos: FileInputStream y FileOutputStream. java.lang Este paquete incluye las clases del lenguaje Java propiamente dicho: Object, Thread, Exception, System, Integer, Float, Math, String, etc. java.net Este paquete da soporte a las conexiones del protocoloTCP/IP y, además, incluye las clases Socket, URL y URLConnection. java.util Este paquete es una miscelánea de clases útiles para muchas cosas en programación. Se incluyen, entre otras, Date (fecha), Dictionary (diccionario), Random (números aleatorios) y Stack (pila FIFO). 32-

32-

Referencias

Java se asemeja mucho a C y C++. Esta similitud, es la mejor herramienta para los programadores, ya que facilita en gran manera su transición a Java. Desafortunadamente, tantas similitudes hacen que no nos paremos en algunas diferencias que son vitales. La terminología utilizada en estos lenguajes, a veces es la misma, pero hay grandes diferencias subyacentes en su significado. C tiene tipos de datos básicos y punteros. C++ modifica un poco este panorama y le añade los tipos referencia. Java también especifica sus tipos primitivos, elimina cualquier tipo de punteros y tiene tipos referencia mucho más claros. Conocemos ya ampliamente todos los tipos básicos de datos: datos base, integrados, primitivos e internos; que son muy semejantes en C, C++ y Java; aunque Java simplifica un poco su uso a los desarrolladores haciendo que el chequeo de tipos sea bastante más rígido. Además, Java añade los tipos boolean y hace imprescindible el uso de este tipo booleano en sentencias condicionales.

Bibliografia: Desarrollo de bases de datos en Java. Martin Rinehart, editorial Mc Graw-Hill. Año 1.998. Manual de Java Patrick Naughton, Editorial Mc Graw-Hill. Año 1.999. Aplicaciones de negocios en Java Jorge Bourdette. Compumagazine. Direcciones de internet consultadas: www.monografias.com/trabajos/java/java.shtml http://arco.inf.uc3m.esp/ii_pstr www.geocities.com/CollegePark/Quad/8901/tema05.html ftp://ftp.javasoft.com/docs/tutorial.html.zip