Your SlideShare is downloading. ×
Introducción a java
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

Introducción a java

196
views

Published on

Apostila Java

Apostila Java

Published in: Education

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
196
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Introducción a Java DÍA 1 Introducción a la programación orientada a objetos Introducción a Java Herramientas necesarias para desarrollar en Java DÍA 2 Gramática de Java Estructura de componentes AWT Aplicaciones vs. Applets Clases, métodos, atributos y objetos en Java DÍA 3 Creación de applets sencillos Animaciones simples y multithreading DÍA 4 Interfaz gráfica de usuario (AWT) Control de eventos (Event Handling) DÍA 5 Ejemplo de programas BIBLIOGRAFÍA RECOMENDADA DIRECCIONES EN iNTERNET GRUPOS DE NOTICIASDIA 1Introducción a la OOP (programación orientada a objetos)Junto con el paradigma de la orientación a procedimientos, son las dos filosofíasgenerales de diseño más importantes. A diferencia de la orientación a procedimientos(OP), la orientación a objetos (OO) no concibe los procesos como una secuencia deprocedimientos con su entrada y salida sino que se basa en un conjunto de objetosinteractuando:
  • 2. Veamos a continuación los aspectos más destacados de esta filosofía general de diseño. 1. Clases y objetos Es importante distinguir entre los conceptos de clase y objeto: Clase: Es un modelo abstracto de un tipo de objeto. Define sus métodos y atributos. Objeto: Es una instancia de una clase, es decir, la implementación con valores de un modelo abstracto. Las clases no son entidades independientes sino que se agrupan jerárquicamente heredando características y atributos. Cada instancia o implementación real de
  • 3. una clase constituirá un nuevo objeto por lo que se pueden crear infinitos objetosdistintos a partir de una sola clase.2. EncapsulaciónSe define como el proceso de empaquetar juntos los métodos y los datos en unobjeto. El objeto se encarga de ocultar sus datos al resto de objetos. Laencapsulación permite una seguridad mayor en el acceso a los datos ya que esteacceso depende directamente de cada objeto. Asimismo, permite abstraer losdetalles internos de funcionamiento del objeto.3. Intercambio de mensajesLos objetos se comunican entre sí mediante mensajes de invocación a métodos:4. HerenciaEs el concepto que define la adopción de todas las características de una clasepor parte de otra clase que es definida como descendiente o heredera de laprimera.
  • 4. La principal consecuencia de la herencia es la posibilidad de reutilizar clases ya que se pueden crear nuevas a partir de las ya creadas. La herencia puede ser de dos tipos, simple si sólo es posible heredar características de una sola clase, o múltiple si se pueden heredar características de varias clases.Introducción a Java 1. Historia de JAVA A finales de los años ochenta Sun Microsystems decide introducirse en el mercado de la electrónica de consumo y más concretamente en los equipos domésticos, incluyendo la televisión interactiva. Java, nace como un lenguaje ideado en sus comienzos para programar electrodomésticos! En sus primeras versiones, se llamó OAK. 2. Objetivos de diseño de los creadores de JAVA LENGUAJE FAMILIAR: Java no sería un lenguaje totalmente nuevo, se parecería a lo que conocemos como C++, así que no le sería tan complicado recalar en los programadores escépticos. LENGUAJE ORIENTADO A OBJETOS: Para que un lenguaje pueda considerarse orientado a objetos debe soportar como mínimo las características de: - encapsulación - herencia - polimorfismo - enlace dinámico. LENGUAJE ROBUSTO: Uno de los problemas más comunes en los lenguajes de programación es la posibilidad de escribir programas que pueden bloquear el sistema. Algunas veces este bloqueo puede ser inmediato, pero en otras ocasiones llega a aparecer inesperadamente porque, por ejemplo, la aplicación accede a zonas de memoria que no estaban siendo ocupadas por otros programas hasta ese momento. Un ejemplo claro de lenguaje no robusto es C. Al escribir código en C o C++ el programador debe hacerse cargo de la gestión de memoria de una forma explícita, solicitando la
  • 5. asignación de bloques a punteros y liberándolos cuando ya no son necesarios. En Java, los punteros, la aritmética de punteros y las funciones de asignación y liberación de memoria (malloc( ) y free( ) ) no existen. En lugar de los punteros se emplean referencias a objetos, los cuales son identificadores simbólicos. El gestor de memoria de Java lleva una contabilidad de las referencias a los objetos. Cuando ya no existe una referencia a un objeto, éste se convierte en candidato para la recogida de basura (garbage collection). LENGUAJE DE ALTO RENDIMIENTO ( MÚLTIPLES THREADS ): Una de las características del lenguaje es que soporta la concurrencia a través de threads. En ocasiones puede interesarnos dividir una aplicación en varios flujos de control independientes, cada uno de los cuales lleva a cabo sus funciones de manera concurrente. Cuando los distintos flujos de control comparten un mismo espacio lógico de direcciones, se denominan threads. LENGUAJE PORTABLE: El principal objetivo de los diseñadores de Java, y dado el gran crecimiento de las redes en los últimos años, fue el de desarrollar un lenguaje cuyas aplicaciones una vez compiladas pudiesen ser inmediatamente ejecutables en cualquier máquina y sobre cualquier sistema operativo. Por ejemplo, un programa desarrollado en Java en una estación de trabajo Sun que emplea el sistema operativo Solaris, debería poderse llevar a un PC que utilice sistema operativo Windows NT. LENGUAJE LO MÁS SIMPLE POSIBLE: Los diseñadores de Java trataron de mantener las facilidades básicas del lenguaje en un mínimo y proporcionar un gran número de extras con las librerías de clases. LENGUAJE SEGURO: Se pretendía construir un lenguaje de programación que fuese seguro, esto es, que no pudiera acceder a los recursos del sistema de manera incontrolada. Por este motivo se eliminó la posibilidad de manipular la memoria mediante el uso de punteros y la capacidad de transformación de números en direcciones de memoria ( tal y como se hace en C ) evitando así todo acceso ilegal a la memoria. Esto se asegura porque el compilador Java efectúa una verificación sistemática de conversiones.3. Lo nuevo en JAVALa gran novedad que aporta Java dentro de las nuevas generaciones denavegadores es la capacidad de desplazar el control de la interactividad de los
  • 6. servidores hacia las máquinas de los usuarios que se utilizan para recorrer Internet. Por la misma estructura del lenguaje, los nuevos navegadores permiten la telecarga de "applets", pequeños fragmentos de programas compactos, precompilados, que pueden entonces interpretar de modo distinto los datos telecargados para producir por ejemplo animaciones, sonido y especialmente la verdadera interactividad. El lenguaje Java, visto desde un navegador de Internet, es pues un lenguaje que no es ni totalmente interpretado, ni totalmente compilado. El lenguaje se transforma en un código elemental parecido al ensamblador, llamado también p- code o byte-code. Posee la particularidad de ser compacto y por tanto puede ser compilado (traducido a lenguaje máquina) muy rápidamente, en el transcurso de la propia ejecución del programa. El p-code constituye una capa intermedia que facilita enormemente la portabilidad de un entorno o de una máquina a otra. La facilita hasta el punto de lograrla desaparecer. Aparece entonces la "máquina virtual". 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 sólo ve una reconstrucción lógica de un ordenador. Para ejecutar un programa Java compilado (que está en p-code), es preciso también que cuente con una implementación de la máquina virtual específica donde se desea ejecutar, la cual efectúa la transformación del p-code en un programa comprensible para la máquina.Herramientas necesarias para desarrollar en JavaPara desarrollar programas en Java es suficiente con instalar el paquete JDK de Sun,que es de libre distribución. En el site de Sun podemos encontrar toda clase deinformación relacionada con Java: Ejemplos de programas escritos en Java, tutoriales,documentación, bugs conocidos y su solución, etc..
  • 7. La dirección base es : www.sun.comLa ultima version disponible hasta la fecha es la JDK 1.2Pasos para crear un programa en Java - Aplicaciones 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 - 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 contendra al applet y guardar el codigo con extension .html El codigo minimo será: <HTML> <BODY> <APPLET code="miProgramaApplet.class" width=400 height=400> </APPLET> </BODY> </HTML> 2 posibilidades para ejecutar el applet: - Lanzar un navegador y cargar la pagina html, o bien - Usar el programa provisto por Sun para ver applets: appletviewer miProgramaApplet.html Un ejemplo de herramientas básicas para comenzar a programar en lenguaje JAVA podría ser:
  • 8. 1.- Editor de código multilenguaje y con utilidades de edición y detección automática de errores. Un muy buen editor con estas propiedades y muchas más es ED for Windows v3.80 (www.getsoft.com) pero existen muchos otros y casi todos de libre distribución. 2.- JDK1.1.x, con el que podemos compilar y probar las aplicaciones y applets realizados. 3.- Documentación HTML de las clases JAVA. Además de lo arriba indicado, 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 al paquete básico de jdk. Otra posibilidad para desarrollar en JAVA es utilizar una herramienta Visual como Visual Cafe o V++. Estas herramientas suponen un entorno integrado de programación con módulos editor, de diseño visual, compilador, depurador, etc. Además proporcionan componentes propios especialmente útiles en diseño de interfaces gráficas.DÍA 2Gramática de Java 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. Dichos comentarios 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.
  • 9. 2. IdentificadoresLos identificadores nombran variables, funciones, clases y objetos; cualquiercosa que el programador necesite identificar o usar.En Java, un identificador comienza con una letra, un subrayado (_) o un símbolode dólar ($). Los siguientes caracteres pueden ser letras o dígitos. Se distinguenlas 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 $transacciony su uso sería, por ejemplo: int contador_principal; char _lista_de_ficheros; float cantidad_en_Ptas;3. Palabras claveLas siguientes son las palabras clave que están definidas en Java y que no sepueden utilizar como identificadores:abstract continue for new switchboolean default goto null synchronizedbreak do if package thisbyte doubleimplements private threadsafebyvalue else import protected throwcaseextends instanceof public transientcatch false int return truechar final interface short tryclass finally long static voidconst float native super while4. Palabras reservadasAdemás, el lenguaje se reserva unas cuantas palabras más, pero que hasta ahorano tienen un cometido específico. Son:cast future generic inneroperator outer rest var5. Tags HTMLAtributos del tag <APPLET>; (en negrita los imprescindibles)
  • 10. <APPLETCODEBASE=url raizCODE=fichero con la clase principal WIDTH=anchura HEIGTH=altura ALT=texto alternativo (para navegadores sin soporte Java pero que saben interpretar el tag APPLET) NAME=nombre del applet. Para hacer referencia al applet desde otro o desde JavaScript ALIGN=alineacion (hasta 9 valores: LEFT, RIGHT, TOP, MIDDLE, etc...) VSPACE=espacio en pixeles dejado en blanco como margen en la ventana del applet HSPACE=idem izqda-dcha > <PARAM NAME=unPArametro VALUE=valorDelParametro> <PARAM NAME=otroParametro VALUE=valor> <ídem etc> Texto alternativo </APPLET>Estructura de componentes AWTAplicaciones vs. 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 página web y ejecutables en la JVM (Java Virtual Machine) del navegador. Estos módulos reciben el nombre de Applets.
  • 11. Veamos 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<args.length ; i++ ) { System.out.println("Argumento " + i + ": " + args[i]); } } } 2. Applets // HolaMundoCruelApplet.java import java.awt.Graphics; import java.awt.Font; import java.awt.Color; public class HolaMundoCruelApplet 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("Hola mundo cruel",5,50); } }Clases, métodos, atributos y objetos en JavaVeamos a continuación mediante un ejemplo cómo se implementan los conceptos másimportantes vistos teóricamente en la introducción a la OOP en JAVA:
  • 12. // Moto.javapackage java.testJavadoc;/***Este texto es un comentario sobre la clase Moto* @author CTI* @version 1* @see clase UsarMoto*/class Moto{String fabricante;private String color;boolean motorEncendido;//private int numeroDeSerie;static int cilindrada = 250; //centimetros cubicosString nombreDelPropietario;// Metodo Constructor/** Metodo constructor*/Moto(String nombre) { this.nombreDelPropietario = nombre; }Moto( ) { ; }void encenderMotor( ) { if (motorEncendido == true) { System.out.println("El motor ya esta encendido !"); } else { motorEncendido = true; System.out.println("Brrummm. El motor se acaba de encender"); } }void describeMoto( ) { System.out.println("Descripcion de La moto;"); System.out.println("- marca: " + fabricante); System.out.println("- pintada de color: " + color); System.out.println("- cilindrada: " + cilindrada + " centimetros cubicos"); if (motorEncendido == true) { System.out.println("- el motor esta encendido");
  • 13. } else { System.out.println("- el motor esta apagado"); } }/* Añadir: - apagarMotor - cambiarColor (declarar color private) - escribir main en la propia clase y como clase independiente - metodo que devuelve un valor en vez de void -> devolver un objeto propio - variable estatica: al cambiarla, varian las de todas las instancias - metodo constructor con parametro Nombre del propietarioComentarios: - al no declarar que hereda de nadie, se asume que es de Object - comentarios !!!! - aritmetica 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[]) { Moto miMoto; miMoto = new Moto( ); miMoto.fabricante = "Kawasaki"; miMoto.color = "verde fosforito"; miMoto.describeMoto( ); System.out.println("-------------------"); System.out.println("Arrancando el motor..."); miMoto.encenderMotor( ); System.out.println("-------------------"); miMoto.describeMoto( ); System.out.println("-------------------"); miMoto.encenderMotor( ); // Otra moto Moto laMotoDeMiHermano = new Moto( ); laMotoDeMiHermano.fabricante = "Suzuki"; System.out.println("-------------------"); laMotoDeMiHermano.describeMoto( ); // Altera la variable estatica de la clase Moto Moto.cilindrada = 500; laMotoDeMiHermano.describeMoto( ); miMoto.describeMoto( ); // NOTA: el color saldra null
  • 14. }}1. Tipos de ClasesHasta ahora sólo se ha utilizado la palabra clave public para calificar el nombre de lasclases que hemos visto, pero hay tres modificadores más. Los tipos de clases quepodemos 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, bien 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.2. Variables y métodos de instanciaUna clase en Java puede contener variables y métodos. Las variables pueden ser tiposprimitivos 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;
  • 15. } 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 constructorde la clase y Suma_a_i( int j ).3. Métodos y ConstructoresLos métodos son funciones que pueden ser llamadas dentro de la clase o por otrasclases. El constructor es un tipo específico de método que siempre tiene el mismonombre que la clase.Cuando se declara una clase en Java, se pueden declarar uno o más constructoresopcionales que realizan la inicialización cuando se instancia (se crea una ocurrencia) unobjeto de dicha clase.Utilizando el código de ejemplo anterior, cuando se crea una nueva instancia deMiClase, se crean (instancian) todos los métodos y variables, y se llama al constructorde la clase: MiClase mc; mc = new MiClase();La palabra clave new se usa para crear una instancia de la clase. Antes de serinstanciada 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 a10. Se puede referenciar la variable (de instancia) i con el nombre del objeto: mc.i++; // incrementa la instancia de i de mcAl tener mc todas las variables y métodos de MiClase, se puede usar la primera sintaxispara 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.4. Herencia
  • 16. La Herencia es el mecanismo por el que se crean nuevos objetos definidos en términosde objetos ya existentes. Por ejemplo, si se tiene la clase Ave, se puede crear la subclasePato, que es una especialización de Ave. class Pato extends Ave { int numero_de_patas; }La palabra clave extends se usa para generar una subclase (especialización) de unobjeto. Una Pato es una subclase de Ave. Cualquier cosa que contenga la definición deAve será copiada a la clase Pato, además, en Pato se pueden definir sus propios métodosy variables de instancia. Se dice que Pato deriva o hereda de Ave.Además, se pueden sustituir los métodos proporcionados por la clase base. Utilizandonuestro anterior ejemplo de MiClase, aquí hay un ejemplo de una clase derivadasustituyendo 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 inicializaa 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 motory de la clase animal no se puede derivar nada, sería como obtener el objeto toromecánico a partir de una máquina motorizada (aparato con motor) y un toro (aminal).En realidad, lo que se pretende es copiar los métodos, es decir, pasar la funcionalidaddel toro de verdad al toro mecánico, con lo cual no sería necesaria la herencia múltiplesino simplemente la compartición de funcionalidad que se encuentra implementada enJava a través de interfaces.5. Control de accesoCuando se crea una nueva clase en Java, se puede especificar el nivel de acceso que sequiere para las variables de instancia y los métodos definidos en la clase:
  • 17. public public void CualquieraPuedeAcceder(){} Cualquier clase desde cualquier lugar puede acceder a las variables y métodos de instacia 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), lo que significa 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.6. Variables y métodos estadísticosEn un momento determinado se puede querer crear una clase en la que el valor de unavariable de instancia sea el mismo (y de hecho sea la misma variable) para todos losobjetos instanciados a partir de esa clase. Es decir, que exista una única copia de lavariable de instancia. Se usará para ello la palabra clave static. class Documento extends Pagina { static int version = 10;
  • 18. }El valor de la variable version será el mismo para cualquier objeto instanciado de laclase Documento. Siempre que un objeto instanciado de Documento cambie la variableversion, ésta cambiará para todos los objetos.De la misma forma se puede declarar un método como estático, lo que evita que elmé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 unavariable no estática.Todas las clases que se derivan, cuando se declaran estáticas, comparten la mismapágina de variables; es decir, todos los objetos que se generen comparten la misma zonade memoria. Las funciones estáticas se usan para acceder solamente a variablesestá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 afunción, no se podría acceder a var, porque al utilizar un puntero a función no se pasaimplícitamente el puntero al propio objeto (this). Sin embargo, sí se podría acceder a varsi fuese estática, porque siempre estaría en la misma posición de memoria para todos losobjetos que se creasen de UnaClase.7. InterfacesLos métodos abstractos son útiles cuando se quiere que cada implementación de la claseparezca y funcione igual, pero necesita que se cree una nueva clase para utilizar losmétodos abstractos.
  • 19. Los interfaces proporcionan un mecanismo para abstraer los métodos a un nivelsuperior.Un interface contiene una colección de métodos que se implementan en otro lugar. Losmétodos de una clase son public, static y final.La principal diferencia entre interface y abstract es que un interface proporciona unmecanismo de encapsulación de los protocolos de los métodos sin forzar al usuario autilizar 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 el interface VideoClip utilizarán la palabra implements yproporcionarán el código necesario para implementar los métodos que se han definidopara el interface: class MiClase implements VideoClip { void play() { <código> } void bucle() { <código> } void stop() { <código> }Al utilizar implements para el interface es como si se hiciese una acción de copiar-y-pegar delcódigo del 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 implementadapor cualquier número de clases, permitiendo a cada clase compartir el interfaz de programaciónsin tener que ser consciente de la implementación que hagan las otras clases que implementenel interface. class MiOtraClase implements VideoClip { void play() { <código nuevo> } void bucle() { <código nuevo> } void stop() { <código nuevo> }
  • 20. DÍA 3Creación de applets sencillos Se incrustan en las paginas web Se cargan dinamicamente de la red Son programas, luego problema de seguridad: restricciones Un applet no puede cargar librerias o definir metodos 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 ningun programa en el ordenador local No pueden lanzar programas en el equipo local Se supone que hay seguridad total, pero algun listillo podria desbaratarla... Sun desafió a los hackers! Un applet puede invocar metodos 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 caracteristicas 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" Users current working directory
  • 21. "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 ("vaya, aqui no me dejan leer de disco") Algunos applets paran su ejecucion al salir de la pagina, pero otros continuanSubclase de java.applet.Applet: por tanto hereda los metodos y clases paramanipular graficos, sonidos, etc...PUBLIC class miclase extends java.applet.Applet: solo la clase principal debeser publica por fuerzaA diferencia de las aplicaciones main(), applets son algo mas 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 imagenes o fuentes. Solo ocurre 1 vez en la vida de un applet. o Public void start() {...}: Despues de init o de stop: por ejemplo si vamos a otra pagina y despues volvemos. Ocurre 1 o mas veces por tanto o Public void Stop() {...}: Contrapartida de start(). Cuando el usuario deja una pagina, los threads lanzados se siguen ejecutando(¡!??)  Destroy() {...} No es destruccion 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, imagenes
  • 22.  Paint puede ocurrir cientos de veces: cada vez que se mueve el navegador Toma argumento g pasado por N automaticamente 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: // HolaMundoCruelApplet.java import java.awt.Graphics; import java.awt.Font; import java.awt.Color; public class HolaMundoCruelApplet extends java.applet.Applet
  • 23. { Font f = new Font("Arial", Font.BOLD, 36); public void paint(Graphics g) { g.setFont(f); g.setColor(Color.red); g.drawString("Hola mundo cruel",5,50); } } Crear HolaMundoCruelApplet.HTML: <HTML> <BODY> <applet code="HolaMundoCruelApplet.class" width=400 height=400> </applet> </BODY> </HTML> En el applet Java:  No hay init(), start(), destroy() sobreescritos. Demasiado simple!  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...En el HTML:  Ejemplo anterior es el mas sencillo posible.  El tag <APPLET>: extension 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 (mas tarde)  WIDTH, HEIGTH son obligatorios. Dimensiones de la caja de applet. Si pequña, se recorta.  Cerrar con </APPLET>  Opcionalmente linea siguiente a </APPLET> para N no Java ("Deberia aparecer aqui un applet si tu navegador es compatble con Java")  Mas sobre el tag <APPLET>. Otros atributos;
  • 24. <APPLET CODEBASE=url raiz CODE=fichero con la clase principal WIDTH=anchura HEIGTH=altura ALT=texto alternativo (para navegadores sin soporte Java pero que saben interpretar el tag APPLET NAME=nombre del applet. Para hacer referencia al applet desde otro o desde JavaScript ALIGN=alineacion (hasta 9 valores: LEFT, RIGHT, TOP, MIDDLE, etc...) VSPACE=espacio en pixeles dejado en blanco como margen por el N (ver p.141 21days) HSPACE=idem izqda-dcha > [* Parametros: explicado mas adelante] <PARAM NAME=unPArametro VALUE=valorDelParametro > <PARAM NAME=otroParametro VALUE=valor> <idem etc> Texto alternativo </APPLET> * Parametros: en aplicaciones, linea de comandos iba a args[] en main(). Applets no tiene linea de comandos! Para pasarlos en applets se necesitan dos cosas;  un tag especial en el HTML  codigo en el applet .java para recoger los parametros Ej: <PARAM NAME=fuente VALUE="TimesRoman"> y String nombreDeLaFuente = getParameter("fuente"); Proteccion: se añade a continuacion; If(nombreDelaFuente == null) nombreDeLaFuente == "Courier";
  • 25.  Los parametros son siempre Strings. Si necesario valor numerico, tendremos que convertir Ej: <PARAM NAME=tamañoLetras VALUE="36"> y int tamañoDeLetra; String tam = getParameter("tamaño"); If (tam == null) tamañoDeLetra = 20; } else tamañoDeLetra = Integer.parseInt(tam); / / O t r o H o l a M u n d o C r u e l A p p l e t . j a v a i m p o r
  • 26. tjava.awt.Graphics;importjava.awt.Font;importjava.aw
  • 27. t.Color;publicclassOtroHolaMundoCruelAppletextendsj
  • 28. ava.applet.Applet{Fontf=newFont("Arial",Font.BOLD,
  • 29. 36);Stringnombre;//nuevo//nuevopublicvoidinit(
  • 30. ) { n o m b r e = g e t P a r a m e t e r ( " N o m b r e " ) ; i f ( n o m b r e = = n u l l )
  • 31. nombre="Fulanito";nombre="Hola"+nombre+"!!!";
  • 32. }//publicvoidpaint(Graphicsg) { g . s e t F o n t ( f ) ; g .
  • 33. setColor(Color.red);g.drawString("Holamundocruel",5,50
  • 34. ) ; } } Si se sumara "Hola " + etc... en paint, seria menos eficiente. En init(), solo se ejecuta 1 vez! Usar applets publicos:  O los cargamos localmente (dificultad: hay que bajar todas las clases, imagenes, sonidos, en misma jerarquia 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 demsiado serio sin autorizacion expresa (escribir, leer de disco). Base de datos?!?! Procesador de textos?!?! Imposible!!! Al menos manteniendo la seguridad al 100%. Graficos, texto y sonido  Graficos: coordenadas, lineas, puntos, circulos, ovalos, poligonos o imagenes GIF  Texto: fuentes, tamaños  Color: de fondo, de dibujo  Graficos  Lineas: g.drawline(10,10,50,50)  Rectangulos:  Cuadrados  Esquinas redondeadas  Con efecto 3D: borde en relieve Ej: g . d r a w R e c t
  • 35. (x,y,anchura,altura)g.fillRect(20,20,80,80)g.drawRoundR
  • 36. ect(a,b,c,d,E,F)(verp15121days)g.fillRoundRect(...)g
  • 37. . d r a w 3 D r e c t ( 2 0 , 2 0 , 6 0 , 6 0 , t r u e ) ; Poligonos: Ej: i n t l i s t a C o o r d X [ ]
  • 38. ={0,10,20,10,50,0};intlistaCoordY[]={0,20,30,60,40,0
  • 39. };intnumeroPuntosPoligono=listaCoordX.length;g.drawP
  • 40. olygon(listaCoordX,listaCoordY,numeroPuntosPoligono);Co
  • 41. nobjetos;intlistaCoordX[]={0,10,20,10,50,0};intli
  • 42. staCoordY[]={0,20,30,60,40,0};intnumeroPuntosPoligono
  • 43. =listaCoordX.length;Polygonpoligono=newPolygon(lis
  • 44. taCoordX,listaCoordY,numeroPuntosPoligono);g.drawPolygo
  • 45. n(poligono);//poligono.addPoint(20,30);//booleanesta
  • 46. D e n t r o = p o l i g o n o . c o n t a i n s ( x , y ) ; Ovalos: g.drawOval(a,b,c,d) Arcos: g.drawArc(a,b,c,d,e,f,g) Copiando areas de la pantalla g.copyAerea(origen X,origenY,anchura, altura,destinoX,des tinoY) // Borrar un area. Se rellena con el color de fondo // Para borrar todo el applet; g.clearRect(0,0,size ().width,size().heigt
  • 47. h) // 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, anchura, 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...
  • 48.  colores predefinidos como constantes: Color.white, Color.yellow, Color.lightGray,etc.. Ej: Color miCol or = new Color (130, 124,3 1); g.set Color (miC olor); // empi eza a dibuj ar con el nuev o color setBa ckgro und( Color .blue ); // camb ia el color de fondo del apple t setFo regro unf(C olor.b lack(; // camb ia de golpe el
  • 49. colordetodolodibujado//CajasDeColores.javaimportjava.awt.Graphics;importjava.awt.Color;publicclassCajasDeColoresextendsjava.applet.Applet{publicvoidpaint(Graphicsg) { i n t r o j o ,
  • 50. verde,azul;for(intj=30;j<(size().height-25);j
  • 51. +=30) { f o r ( i n t i = 5 ; i < ( s i z e ( ) . w i d t h - 2 5 ) ; i + = 3
  • 52. 0) { r o j o = ( i n t ) M a t h . f l o o r ( M a t h . r a n d o m ( ) * 2 5 6 ) ; v e r d e
  • 53. =(int)Math.floor(Math.random()*256);azul=(int)Ma
  • 54. th.floor(Math.random()*256);g.setColor(newColor(rojo
  • 55. ,verde,azul));g.fillRect(i,j,25,25);g.setColor(Color.bl
  • 56. a c k ) ; g . d r a w R e c t ( i - 1 , j - 1 , 2 5 , 2 5 ) ; } } } } Imagenes: clase Image, metodo drawImage() / / P i
  • 57. ntaFoto.javaimportjava.applet.Applet;importjava.awt.
  • 58. Graphics;importjava.awt.Image;publicclassPintaFoto
  • 59. extendsApplet{Imageimagen;publicvoidinit()
  • 60. publicvoidpaint(Graphics
  • 61. g)
  • 62. } 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, cuestion de asegurar compatibilidad.  AU esta comprimido, pero calidad mediocre  metodo play(URL)  Ej: p l a y ( g e t C o d e B a s
  • 63. e(),"audio/violin.au");//SonidoApplet.javapubliccl
  • 64. assSonidoAppletextendsjava.applet.Applet{publicvoid
  • 65. init() { p l a y ( g e t C o d e B a s e ( ) , " y a h o o 1 . a u " ) ; / / p o n e r y a h
  • 66. o o 1 . a u e n d i r j a v a ! } } 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 (getCodeBas e(), "audio/ruido DeFondo.au" ); clip.play(); // suena solo una vez clip.loop(); // suena indefinidame nte clip.stop();
  • 67. // obliga a que se pare AudioClip no para de sonar aunque cambiemos de pagina. Por tanto, se suele implementar clip.stop() en el metodo stop() del applet. Ej: // SonidoApple t.java import java.applet. AudioClip; public class SonidoApple t extends java.applet. Applet { AudioClip sonido; public void init() { sonid o= getA udioC lip(ge tCode Base( ), "yaho o1.au "); } public void start() { sonid o.loo p(); }
  • 68. public void stop() { sonid o.sto p(); } } No se cuenta exhaustivamente todo lo que se puede hacer con las clases de Java. VER DOCUMENTACION!!!!Animaciones simples y multithreading Se puede hablar de dos tipos:  Animacion de tipo ‘dibujos animados’: presentar una sucesion rapida de imagenes precargadas GIF o JPEG (p205 21days)  Animacion dibujada en tiempo real; veamos  Un ejemplo que NO funciona (no aparece nada en pantalla); / / M a l R e l o j D i
  • 69. gitalApplet.javaimportjava.awt.Graphics;importjava.a
  • 70. wt.Font;importjava.util.Date;publicclassMalRelojDig
  • 71. italAppletextendsjava.applet.Applet{Fontfuente=new
  • 72. Font("TimesRoman",Font.BOLD,24);Datefecha;publicv
  • 73. oidstart() { w h i l e ( t r u e )
  • 74. }publicvoidpaint(Graphicsg) { g . s e t
  • 75. Font(fuente);g.drawString(fecha.toString(),10,50);}
  • 76. } ¿Porqué no funciona?: paint nunca se ejecuta ya que el bucle while monopoliza la ejecucion. Cómo debe hacerse para que funcione: usando Threads Ej: / / B i e n R e l o j D i g i t a l A p p l e t . j a v a i m p o r t j a
  • 77. va.awt.Graphics;importjava.awt.Font;importjava.util.D
  • 78. ate;publicclassBienRelojDigitalAppletextendsjava.ap
  • 79. plet.AppletimplementsRunnable//cambio{Fontfuente=
  • 80. newFont("TimesRoman",Font.BOLD,24);Datefecha;Thread
  • 81. runner;//cambio//cambiopublicvoidstart() { i f ( r u
  • 82. nner==null)
  • 83. e l s e }//cambio
  • 84. publicvoidstop() { i f ( r u n n e r ! = n u l l )
  • 85. else
  • 86. }//cambiopublicvoidrun() { w h i l e ( t r u e )
  • 87. }publicvoidpaint
  • 88. (Graphicsg) {
  • 89. } } 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 metodo update()  update() borra la pantalla por completo y la rellena con el color de fondo. Despues llama a paint() p u
  • 90. blicvoidupdate(Graphicsg)
  • 91.  paint() escribe el nuevo pantallazo  Es la llamada a update() la que produce el parpadeo.  Soluciones posibles 1. Sobreescribir update() para que no borre la pantalla o que solo borre una cierta area 2. Clipping: re-dibujar solo aquello que cambia. Metodo clipRect() de la clase Graphics 3. Doble-buffering: hacer los cambios en una pantalla ‘virtual’ y volcar el resultado a la pantalla ‘real’ (p212 21days). Es el metodo mas complicado...Eventos y respuesta al usuario  Los eventos son una parte del paquete AWT  Un evento es aparece cuando hay interaccion con el usuario. Ejemplos de eventos;
  • 92.  Se pulsa el boton del raton (Java no se distingue entre boton izquierdo y derecho, por un problema de compatibilidad entre plataformas. En MacIntosh los ratones son de 1 solo boton!!!)  Se arrastra con el raton  Se maximiza o minimiza una ventana  Se pulsa una tecla  etc... Eventos de raton Ej: // PosicionDeCl ickApplet.jav a import java.awt.Eve nt; import java.awt.Gra phics; public class PosicionDeCl ickApplet extends java.applet. Applet { int x,y; //Point ultimo = null; //Point nuevo = null; public void paint(Graphi cs g) { if ( x*y != 0)
  • 93. {g.drawString("HashechoCLICKenx="+x+",y="+
  • 94. y , 0 , 1 0 ) ; g . f i l l O v a l ( x , y , 1 0 , 1 0 ) ; } }publicbooleanmouseDown(Event evt,int x,int y) { this.x = x; this.y = y; Syste m.ou t.prin tln(" Has hech o CLIC
  • 95. K en x=" +x +" , y=" + y); repai nt(); retur n true; } } Variacion en el ejemplo anterior: cambiar mouseDown() por mouseMove() Si se picha y arrastra no lo detecta: habria que usar mouseDrag() mouseEnter() y mouseExit() Ej: public boolean mouseEnter( Event evt, int x, int y) { setBa ckgro und(j ava.a wt.Co lor.bl ue); repai nt(); retur n true; } public boolean mouseExit(E vent evt, int x, int y)
  • 96. { setBa ckgro und(j ava,a wt.Co lor.re d); repai nt(); retur n true; } Eventos de teclado  keyDown(Event evt, int key)  keyUp(Event evt, int key)  Modificadores: la clase Event tiene 3 metodos 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 se desaconseja en beneficio de Control y Shift)  Event.controlDown() Ej: public boolean mouseDown (Event evt, int x, int y) { if (evt. shift Down ()) {// tratar el event
  • 97. o shift +clic k} else {// tratar el event o click simpl e} }  El manejador de eventos (‘AWT Event Handler’)  Hay muchos mas eventos, relacionados con el AWTDÍA 4Interfaz gráfica de usuario (AWT) AWT = Abstract Windowing Toolkit Permite crear entornos graficos de ventanas, a la manera de Windows Aspecto ‘similar’ en varias plataformas Se han utilizado elementos comunes a todas las plataformas: barras deslizantes, botones, menus desplegables, etc...1. Controles basicos  Button  Chekboxes  Choice  List  Menu  Text Field
  • 98. 2. Otros controles  Slider  Scrollbar  Text Area  Canvas  Label  Panel  Scroll Pane Ejemplo: appletviewer GUIWindow.html (tutorial SUN) Jerarquia de clases (ver grafico) Los menus dependen de otra rama de Object;3. Concepto de Jerarquia de Componentes del programa  Una interfaz grafica lleva asociada una jerarquia (arbol)  P.ej.: las opciones de un menu son ‘hijas’ del menu, que a su vez es
  • 99. ‘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 jerarquia, de arriba a abajo.  Demasiado rapido para verse a simple vista ¡!!4. Como usar Labels// EjemploLabelApplet.javaimport java.awt.*;public class EjemploLabelApplet extendsjava.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); }}5. Como usar Buttons//EjemploButtonApplet.javaimport java.awt.*;public class EjemploButtonAppletextends java.applet.Applet{public void init() { Label etiqueta1 = new Label("Label1"); Button boton1 = new
  • 100. 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 disposicion de los elementos es automatica. 6. Como usar Checkboxes // EjemploAWTApplet.java ... add(new Checkbox("Pamplona")); add(new Checkbox("Bilbao", null, true)); add(new Checkbox("Madrid")); add(new Checkbox("Barcelona")); ... Metodos utiles: 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 cambiar...  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)); ... 7. Como usar Choice Menu
  • 101.  Un menu Choice es desplegable.  Permite seleccionar un item del menu ... 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 ... Metodos utiles: getItem(int n) devuelve el string de la opcion n-esima getSelectedIndex() devuelve el indice de la opcion seleccionada //Este tipo de menus solo permiten seleccionar una opcion. Para multiples opciones, usar una lista8. Como usar TextFields  Permite al usuario introducir texto ... add(new Label("Nombre completo")); add(new TextField("-esciba aqui su nombre-")); add(new Label("Telefono")); add(new TextField(12)); add(new Label("Password")); TextField t = new TextField(20); t.setEchoCharacter(*); add(t); ... Metodos utiles: setEditable(boolean) define si el testo es editable o no select(int, int) selecciona el texto entre las dos posiciones (origen = 0) etc...9. Como usar TextArea
  • 102.  Es un componente similar a TextField.  TextField es mas conveniente para pequeños textos, idealmente de una sola linea. No tiene barras de deslizamiento  TextArea en mas conveniente para textos largos, de mas de una linea.  Por defecto, tiene barras de deslizamiento ... String texto = "Erase una vez un pais en el que vivian tres cerditos que erann" + "hermanos. Decidieron construirse una casa, y uno el primero den" + "ellos se la hizo de paja, el segundo de madera y el tercero de ladrillon" + "Un buen dia aparecio por alli el lobo y blablabla..."; // el caracter ‘n’ es para forzr el retorno de linea add(new TextArea(texto, 10, 60)); ... Metodos utiles: insertText(String, int) // inserta texto en la posicion indicada replaceText(String, int,int) // reepmplaza el texto entre las posiciones dadas etc...10. Como usar Frames y Dialogs  La clase Window de AWT permite crear ventanas independientes del navegador que contiene al applet. Frame es mas 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 informacion especifica, etc..., que una vez presentados al usuario pueden desaparecer (p.ej.: ‘Se va a proceder a la instalacion 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 accion de la presente ventana (p.ej.:
  • 103. ‘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 mas funcionalidades si se emplea en una aplicacion Java...// Ejemplo de utilizacion de FrameFrame ventanaFrame = new Frame("Mi ventanaFRAME");ventanaFrame.setLayout(new FlowLayout());//por defecto es BorderLayoutventanaFrame.add(new Button("Opcion 1"));ventanaFrame.add(new Button("Opcion 2"));ventanaFrame.add(new Button("Opcion 3"));ventanaFrame.resize(100,150); //define eltamaño de la ventanaPoint dim = location(); //devuelve la posicion deeste componente, como la esquina sup-izda//medida respecto al componente padreventanaFrame.move(dim.x + 50, dim.y + 50);ventanaFrame.show(); //cuando se crea laventana, es invisible. Para ocultarla, hide()...// Ejemplo de utilizacion de Dialog...// Ejemplo de utilizacion de FileDialog...11. Como usar List  Son menus, pero no desplegables  Es una lista de items en la que se puede elegir uno o varios
  • 104.  Si el numero de items es mayor que la longitud de la lista, aparecen barras de deslizamiento ... List lista = new List(5, true); // crea una lista que tendra 5 lineas, y que permitira // seleccion multiple (valor true) lista.addItem("Afrodita"); lista.addItem("Apolo"); lista.addItem("Ares"); lista.addItem("Hades"); lista.addItem("Zeus"); // si se añade un sexto elemento, se creara automaticamente // una barra deslizante add(lista); ... Metodos 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 posicion dada etc...12. Como usar Scrollbars  Los componentes TextArea y TextField vienen con sus propias barras deslizantes. Pero tambien se pueden crear barras deslizantes independientes, tipicamante para manipular rangos de valores entre un maximo y un minimo.  Para variar el valor asociado, hay tres formas:  Pinchar las flechas de los extremos. Variacion unitaria.  Pinchar en la barra. Variacion en saltos, 10 por defecto.  Pinchar y arrastar el ‘elevador’.
  • 105. ...Scrollbar barraDeslizante = newScrollbar(Scrollbar.HORIZONTAL);add(barraDeslizante);...// constructor mas general:// Scrollbar(int orientacion, int valorInicial, intanchura, int valorMinimo, int valorMaximo);...Metodos utiles: getValue() // Devuelve el valor actual de la barra setValue() // Asigna un valor a la barra13. Como usar Canvas  Un componente Canvas es un objeto que permite dibujar en él.  No hace nada por si mismo. Esta pensado para ser extendido por herencia.Canvas can = new Canvas();add(can);14. Como usar Panels  Es un tipo de ‘Container’  Permite definir un area 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 grafica. Para que esta ordenacion sea eficaz, hay que usar Panel en un componente que tenga bien definida la disposicion mediante un LayoutManager (se ve mas adelante)....Panel unPanel = new Panel();unPanel.add(new Label("Arriba"));
  • 106. unPanel.add(new Label("Abajo")); add(unPanel); ...15. Como usar Scroll Panes  Define un area para mostrar un solo componente con barras deslizantes.  La utilizacion tipica es la de visualizar una imagen dentro del ScrollPane.  Si la imagen es mayor que el area del ScrollPane, este crea automaticamente las barras deslizantes necesarias.  Se puede forzar que no haya barras. NOTA: utilizar ScrollPane es un poco mas 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 definida por nosotros (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,
  • 107. 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); } }16. Otros componentes  MenuShortcut: asocia una combinacion de teclas para activar una opcion de menu (p.ej.:Control-S para grabar archivo)  PopupMenu: menu flotante 17. Como aprovechar un applet grafico desde una aplicacion  Se puede lanzar desde una aplicacion un applet haciendo lo siguiente; // Heredar –con extends- de las clases Applet, AWT, etc...
  • 108. public static void main(String args[]) { Frame f = new Frame("Mi ventana para el applet"); // Crea una ventana para mostrar el applet, //a la manera de un navegador EjemploAWTApplet unApplet = new EjemploAWTApplet(); // El fichero EjemploAWTApplet es //tambien una clase y por lo tanto se puede instanciar ¡! unApplet.init(); // Lanza init(), igual que haria el navegador unApplet.start(); // idem con start() f.add("Center", unApplet); f.resize(300, 300); // Hace las veces de WIDTH y HEIGHT en el HTML!! f.show(); //ATENCION: esta ‘adaptacion’ para ver applets como aplicaciones debe tener en cuenta si el applet lee //parametros del fichero HTML. Habria que pasar los parametros en la linea de comandos, a main(String //args[]) }18. LayoutManager  La disposicion 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
  • 109. contra de la filosofia Java de hacer programas portables  En un sistema puede quedar perfecto y en otro salir como un churro...  FlowLayout  Es la clase mas sencilla. Simplemente se van añadiendo los componentes uno detras de otro, en linea. Si no caben en una linea, 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 columnaspa.nelGridLayout.add(etiqueta1);panelGridLayout.add(boton1);panelGridLayout.add(boton2);panelGridLayout.add(boton3);add(panelGridLayout);...Otro constructor:public GridLayout(int rows, int columns, inthorizontalGap, int verticalGap) // define tambien laseparacion entre celdas, en pixels  GridBagLayout
  • 110.  Es el LM mas 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 ‘geografica’ 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 sucesion de ‘tarjetas’ en pantalla.  Los paneles se presentan ‘uno cada vez’....Panel panelCardLayout = new Panel();panelCardLayout.setLayout(new CardLayout());panelCardLayout.add("primero", new Button("Boton14"));panelCardLayout.add("segundo", new Button("Boton15"));panelCardLayout.add("tercero", new Button("Boton16"));panelCardLayout.add("cuarto", new Button("Boton17"));((CardLayout)panelCardLayout.getLayout()).show(panelCardLayout, "tercero"); // complicadillo...add(panelCardLayout);...Metodos utiles:public void first(Container parent)public void next(Container parent)
  • 111. 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 anchuras independientes a los 4 lados ... public Insets insets() { return new Insets(10,10,10,10); // 10 pixels en los 4 lados } ...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 accion.  Situaciones que generan eventos;  Pulsar una tecla  Ampliar una ventana  Pulsar Return en una entrada de texto  Mover el raton  Hacer click con el raton  etc...  y en general cualquier cosa que haga el usuario
  • 112.  En JDK1.0.x, los eventos se pasan hacia arriba en la jerarquia de componentes hasta que un objeto responde al evento En JDK1.1.x, los eventos se envian a objetos que estan 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 pasandolo al Componente superior en jerarquia. Es lo que se hace por defecto.  Modicando el evento (que es un objeto) y pasandolo al nivel superior. P.ej.: un texto se convierte a mayusculas y se pasa  Reaccionando al evento y parando su propagacion hacia arriba. P.ej.: si se introduce un caracter no valido en un TextField, el evento no se propaga, y los componentes superiores nunca lo veran  Los objetos de la clase Event  Cada evento produce la creacion de un objeto de la clase predefinida Event, que incluye la siguiente informacion;  Tipo de evento: p.ej. pulsacion de tecla, boton del raton, apertura de ventana,...
  • 113.  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 basicos: // 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 manerade JDK1.0.x;// BotonesColoresApplet.java// EVENTOS JDK 1.0.ximport java.awt.*;public class BotonesColoresApplet extendsjava.applet.Applet
  • 114. {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((Strin g) evt.arg); } break; case Event.GOT_FOCUS: areaTexto.append("GOT_F OCUS n"); return true; case Event.LOST_FOCUS: areaTexto.append("LOST_ FOCUS n"); return true;
  • 115. 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
  • 116.  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 metodos que estan asociados a esa interface.  Esto permite crear una especie de herencia multiple, que de otro modo seria imposible.// EjemploDeEventos.java// EVENTOS JDK 1.1.ximport 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;// Constructorpublic 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
  • 117. 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); }// Metodos del interfaz MouseListenerpublic 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)); }
  • 118. }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"); }// Metodos del interfaz ActionListenerpublic void actionPerformed(ActionEvent e) { String cadena = e.getActionCommand(); if (cadena.equals("Salir")) { System.exit(0); } else {
  • 119. cambiaColor(cadena); } }// Otros metodospublic 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 (ver documentacion)DÍA 5Ejemplo de programas
  • 120. Ilustración de las fases de vida de un applet// CicloVidaApplet.javaimport 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, }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 comaleatoriasimport 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() * 25 azul = (int) Math.floor(Math.random() * 256
  • 121. 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.javaimport java.applet.AudioClip;public class SonidoApplet extendsjava.applet.Applet{AudioClip sonido;public void init() {// El fichero de sonido se llama yahoo.au yesta 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
  • 122. cambian el color al pincharlosimport java.awt.*;import java.awt.event.*;class BotonesDeColores implementsMouseListener, ActionListener{// Declara los componentes que luego se usaranpara crear la interfaz graficaTextArea areaTexto;Button boton1, boton2, boton3;MenuBar barraMenu;Menu menu1;MenuItem opcionMenu1_1;Label label1;Panel panel1;// Constructorpublic 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);
  • 123. // Observador de los botones boton1.addActionListener(this); boton2.addActionListener(this); boton3.addActionListener(this); // Observador de la opcion de menu opcionMenu1_1.addActionListener(this); }// Metodos del interfaz MouseListenerpublic 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");
  • 124. }// Metodos del interfaz ActionListenerpublic void actionPerformed(ActionEvent e) { String cadena = e.getActionCommand(); if (cadena.equals("Salir")) { System.exit(0); } else { cambiaColor(cadena); } }// Otros metodospublic 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); }}// Metodo de entrada al programa. Es elprimero que se ejecuta al lanzarlopublic 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 internasimport java.awt.*;import java.awt.event.*;class BotonesDeColores{
  • 125. TextArea areaTexto;Button boton1, boton2, boton3;MenuBar barraMenu;Menu menu1;MenuItem opcionMenu1_1;Label label1;Panel panel1;SymMouse aSymMouse;SymAction aSymAction;// Constructorpublic 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);
  • 126. // Observador de la opcion de menu opcionMenu1_1.addActionListener(aSymAction); }//Clase interna que controla los eventos de raton. Extiende de Mosu vez implementa el interfaz MouseListenerclass SymMouse extends MouseAdapter { public void mouseClicked(MouseEvent event) { areaTexto.append("mouseClicked: x=" + event.get 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. e.getY() + "n"); if (e.getComponent() == label1) { label1.setText("CURSIVA"); label1.setBackground(Color.red); areaTexto.setFont(new Font("TimesR Font.ITALIC, 14)); } } public void mouseExited(MouseEvent e) { areaTexto.append("mouseExited: x=" + e.g e.getY() + "n"); if (e.getComponent() == label1) { label1.setText("Normal"); label1.setBackground(Color.white); areaTexto.setFont(new Font(" Font.PLAIN, 14)); } }
  • 127. public void mousePressed(MouseEvent e) { areaTexto.append("mousePressed: x=" + e. e.getY() + "n"); } public void mouseReleased(MouseEvent e) { areaTexto.append("mouseReleased: x=" + e + e.getY() + "n"); }} //fin de la clase interna SymMouse//Clase interna que controla los eventos generalesclass SymAction implements ActionListener{// Metodos 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 SymMousepublic void cambiaColor(String nombreColor) { if (nombreColor.equals("Rojo")) areaTexto.setBackground( else if (nombreColor.equals("Azul")) areaTexto.setBackgro else if (nombreColor.equals("Verde")) areaTexto.setBackground(Color.green); else if (nombreColor.equals("Amarillo")) areaTexto.setBackground(Color.yellow); }} //fin de la clase BotonesDeColorespublic class EjemploDeEventos2{ public static void main(String args[]) { new BotonesDeColores(); }}
  • 128. Aplicación de los streams a la lectura y escrituraen disco// EscribeEnDisco.javaimport 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); } }}
  • 129. 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); } }}
  • 130. Utilización de los sockets para mandar mensajesentre dos máquinas// Cliente.javaimport 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(i s.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) {
  • 131. System.err. println(e); } }}// Servidor.javaimport java.io.*;import java.net.*;public class Servidor{// Constructorpublic 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
  • 132. os = socketCliente.getOutputStr eam(); pw = new PrintWriter(os); is = socketCliente.getInputStre am(); 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) { Syste m.err .print ln(e); } } }}Muestra una página web dentro de un applet// CargaPaginaWeb.javaimport java.net.*;public class CargaPaginaWeb extendsjava.applet.Applet{public void init() { URL direccionURL = null; try { direccionURL = new URL("http://www.yahoo.com/"); } catch(MalformedURLException e) { System.out. println(e);
  • 133. } getAppletContext().showDocument(direc cionURL); }}Carga la fuente de una pagina web en formatohtml y la muestra en pantalla// CargaOrigenDeURL.javaimport java.io.*;import java.net.URL;public class CargaOrigenDeURL{// Constructorpublic 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(); }}
  • 134. BIBLIOGRAFÍA RECOMENDADA - Aprendiendo JAVA 1.1 en 21 Días. Laura Lemay y Carles L. Perkins Ed. Prencice Hall - Java Unleashed. Varios autores Ed. Samsnet - The Java FAQ. Kanerva Ed. Addison Wesley - JDBC DB access with JAVA. Hamilton, Cattell y Fisher Ed. Addison Wesley - Manual de JAVA. Patrick Naughton Ed. McGraw-HillDIRECCIONES EN INTERNET http://www.java.sun.com : Dirección donde Sun mantiene información sobre Java. http://www.javasoft.com : Dirección de la división comercial de Sun dedicada al desarrollo de JAVA. http://www.developer.com/directories/pages/dir.java.html : Directorio con utilidades JAVA. http://www.jars.com/ : Directorio con utilidades JAVA. http://ftp.sunet.se/no_sugar/index.htm : Utilidades diversas. http://ftp.sunet.se/pub/lang/java/ : Directorio FTP con información JAVA. http://www.xcf.berkeley.edu/lists.html : Hoja con información para suscribirse a listas de correo de Java. http://www.productlist.com/i_java_faq.htm : Uno de los muchos FAQ’s sobre Java. http://www.unav.es/cti/manuales/Java/curso_java_links.html : Material didáctico complementario al curso.
  • 135. GRUPOS DE NOTICIAS  comp.lang.java.programmer  comp.lang.java  comp.lang.java.tech
  • 136. Qué es JavaJava es un lenguaje de programación orientado a objetos que data del año 1994 y fue desarrollado porSun Microsystems. Esta basado en C++, por lo cual su sintaxis general fue adoptada rápidamente pormiles de programadores.Java y la mayoría que hay a su alrededor ya es una plataforma que se considera software libre.Cómo trabajaJava tiene una particularidad a la hora de compilar su código: por lo general es compilado en bytecode,por lo tanto el código compilado no depende de la arquitectura del microprocesador ni del S.O.¿Cómo se ejecuta entonces? Dispone de una máquina virtual que vendría a ser "el flashplayer" de Java.Entonces, en cualquier S.O. que soporte la JVM (Java Virtual Machine) es posible utilizar los programasdesarrollados en esta plataforma.IDEs para JavaAl ser software libre, existen muchos entornos de desarrollo tanto libres como privativos. Los másconocidos son Eclipse, NetBeans y los desarrollados por las firmas IBM y Oracle. Yo en principio voy autilizar Eclipse por los siguientes motivos:Facilidad de instalación y uso.Es muy potente.El IDE, aún el básico, viene muy completo.Estan disponibles muchos plugins, incluso de organizaciones ajenas al mundo Java.Gran comunidad y soporte.El IDE sirve también para desarrollar en C++, en PHP y en poco tiempo habrá más. Ojo flasheros, encualquier momento puede aparecer algo para AS3, si es que no hay ya.No se preocupen que en le próximo tip les voy a estar diciendo exactamente qué necesitan paracomenzar, con sus respectivos links para descargar.Desarrollo orientado a sitios webSun Microsystems ha hecho muchísimo en los últimos años para que Java sea una alternativa seria en eldesarrollo de páginas web. De hecho, lo es. Para ésto creó la tecnología JSP (Java Server Pages) paragenerar contenido dinámico en los sitios web. Claro, es la competencia de PHP, ASP y tecnologíassimilares.JSP es en realidad una simplificación de los Servlets (programas en el servidor), no hay nada que sepueda hacer en JSP que no se pueda hacer en servlets y viceversa. Los servlets no hacen otra cosa quecompilar el JSP que en definitiva es código Java embebido en HTML.
  • 137. De ahí la facilidad que brindan los JSP: es posible editarlos en programas externos como HTML y facilitala separación de tareas. Es decir, el código Java que se inyecta en las páginas HTML es poco y esopermite por ejemplo a un diseñador ir haciendo el maqueteado del sitio web y los desarrolladores por otraparte haciendo la lógica interna.Java es mejor que PHP y ASPDesde ya, es absolutamente falso. Es de muy troll comenzar a discutir que una tecnología es mejor que laotra. Ojo, sí tienen ventajas y desventajas o bien para ciertos proyectos a lo mejor conviene uno u otrolenguaje.¿Por qué remarco ésto? No tiene caso comenzar con Java pensando que por ahí "es más fácil y esmejor". Yo lo tomo simplemente como una alternativa más. Y al ser una plataforma libre, no hay límite deintegración ni problemas graves de estandarización.¿Comienzo con Java?Si vos sos muy avanzado en otras tecnologías, no hay razón de peso para pasarte a Java más que porcuriosidad o si pensás que podrías trabajar en algo relacionado.Si recién comenzás en el mundo de desarrollo web/escritorio, es una buena oportunidad para tener encuenta.En el caso de que en un futuro te interese desarrollar para aparatos electrónicos, te recomiendo ya mismoir asomando la cabeza en Java.Lógicamente, es necesario saber Programación Orientada a Objetos, sin embargo -para novatos- lobásico es muy fácil de entender y practicar.A divertirseLa tecnología Java abarca muchísimas ramas, desde software de Escritorio a web, desde desarrollos deservidor a cliente, desde celulares a cualquier aparato eletrónico. Sin embargo la lógica básica es lamisma y en este caso me voy a enfocar a desarrollo de páginas web, o combinaciones de ésto conprogramas de Escritorio.Espero que les haya servido esta breve introducción, cualquier duda que tengan pueden consultar a lapágina web de Sun. Mentira, los espero aquí mismo por cualquier duda o corrección.Los próximos tips ya van a ser más prácticos, con códigos y todo el rollo. Primeramente me voy a deteneren lo más sencillo, para luego ir avanzando hasta poder publicar cualquier tutorial sin necesidad de seguiruna línea.