Sie sind auf Seite 1von 83

DA 1

Introduccin a la programacin orientada a objetos


Introduccin a Java
Herramientas necesarias para desarrollar en Java
DA 2
Gramtica de Java
Estructura de componentes AWT
Aplicaciones vs. Applets
Clases, mtodos, atributos y objetos en Java
DA 3
Creacin de applets sencillos
Animaciones simples y multithreading
DA 4
Interfaz grfica de usuario (AWT)
Control de eventos (Event Handling)
DA 5
Ejemplo de programas
BIBLIOGRAFA RECOMENDADA
DIRECCIONES EN iNTERNET
GRUPOS DE NOTICIAS

DIA 1
Introduccin a la OOP (programacin orientada a objetos)
Junto con el paradigma de la orientacin a procedimientos, son las dos
filosofas generales de diseo ms importantes. A diferencia de la
orientacin a procedimientos (OP), la orientacin a objetos (OO) no

concibe los procesos como una secuencia de procedimientos con su entrada


y salida sino que se basa en un conjunto de objetos interactuando:

Veamos a continuacin los aspectos ms destacados de esta filosofa


general de diseo.
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

mtodos y atributos.

Objeto: Es una instancia de una clase, es decir, la implementacin


con valores de un modelo abstracto.

Las clases no son entidades independientes sino que se agrupan


jerrquicamente heredando caractersticas y atributos. Cada instancia o
implementacin real de una clase constituir un nuevo objeto por lo que se
pueden crear infinitos objetos distintos a partir de una sola clase.
2. Encapsulacin
Se define como el proceso de empaquetar juntos los mtodos y los datos en
un objeto. El objeto se encarga de ocultar sus datos al resto de objetos. La
encapsulacin permite una seguridad mayor en el acceso a los datos ya que
este acceso depende directamente de cada objeto. Asimismo, permite
abstraer los detalles internos de funcionamiento del objeto.
3. Intercambio de mensajes
Los objetos se comunican entre s mediante mensajes de invocacin a
mtodos:

4. Herencia
Es el concepto que define la adopcin de todas las caractersticas de una
clase por parte de otra clase que es definida como descendiente o heredera
de la primera.

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 slo es posible heredar
caractersticas de una sola clase, o mltiple si se pueden heredar
caractersticas de varias clases.

Introduccin a Java
1. Historia de JAVA
A finales de los aos ochenta Sun Microsystems decide introducirse en el
mercado de la electrnica de consumo y ms concretamente en los equipos
domsticos, incluyendo la televisin interactiva. Java, nace como un
lenguaje ideado en sus comienzos para programar electrodomsticos!
En sus primeras versiones, se llam OAK.
2. Objetivos de diseo de los creadores de JAVA
LENGUAJE FAMILIAR:
Java no sera un lenguaje totalmente nuevo, se parecera a lo que
conocemos como C++, as que no le sera tan complicado recalar en los
programadores escpticos.
LENGUAJE ORIENTADO A OBJETOS:

Para que un lenguaje pueda considerarse orientado a objetos debe soportar


como mnimo las caractersticas de:
-

encapsulacin
herencia
polimorfismo
enlace dinmico.

LENGUAJE ROBUSTO:
Uno de los problemas ms comunes en los lenguajes de programacin 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 aplicacin 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 cdigo en C o C++ el programador debe hacerse cargo de la gestin
de memoria de una forma explcita, solicitando la asignacin de bloques a
punteros y liberndolos cuando ya no son necesarios.
En Java, los punteros, la aritmtica de punteros y las funciones de
asignacin y liberacin de memoria (malloc( ) y free( ) ) no existen. En lugar
de los punteros se emplean referencias a objetos, los cuales son
identificadores simblicos. 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 ( MLTIPLES THREADS ):
Una de las caractersticas del lenguaje es que soporta la concurrencia a
travs de threads. En ocasiones puede interesarnos dividir una aplicacin 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 lgico de direcciones, se denominan threads.
LENGUAJE PORTABLE:
El principal objetivo de los diseadores de Java, y dado el gran crecimiento
de las redes en los ltimos aos, fue el de desarrollar un lenguaje cuyas
aplicaciones una vez compiladas pudiesen ser inmediatamente ejecutables
en cualquier mquina y sobre cualquier sistema operativo. Por ejemplo, un
programa desarrollado en Java en una estacin de trabajo Sun que emplea
el sistema operativo Solaris, debera poderse llevar a un PC que utilice
sistema operativo Windows NT.
LENGUAJE LO MS SIMPLE POSIBLE:

Los diseadores de Java trataron de mantener las facilidades bsicas del


lenguaje en un mnimo y proporcionar un gran nmero de extras con las
libreras de clases.
LENGUAJE SEGURO:
Se pretenda construir un lenguaje de programacin 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 transformacin de
nmeros 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
efecta una verificacin sistemtica de conversiones.
3. Lo nuevo en JAVA
La gran novedad que aporta Java dentro de las nuevas generaciones de
navegadores es la capacidad de desplazar el control de la interactividad de
los servidores hacia las mquinas de los usuarios que se utilizan para
recorrer Internet. Por la misma estructura del lenguaje, los nuevos
navegadores permiten la telecarga de "applets", pequeos 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 cdigo elemental parecido al ensamblador, llamado
tambin p-code o byte-code.
Posee la particularidad de ser compacto y por tanto puede ser compilado
(traducido a lenguaje mquina) muy rpidamente, en el transcurso de la
propia ejecucin del programa. El p-code constituye una capa intermedia
que facilita enormemente la portabilidad de un entorno o de una mquina a
otra. La facilita hasta el punto de lograrla desaparecer.
Aparece entonces la "mquina virtual". Una mquina virtual es una capa
lgica que hace creer al programa Java que se ejecuta en un ordenador real
(con registros, memoria y procesador), cuando en realidad slo ve una
reconstruccin lgica de un ordenador.
Para ejecutar un programa Java compilado (que est en p-code), es preciso
tambin que cuente con una implementacin de la mquina virtual
especfica donde se desea ejecutar, la cual efecta la transformacin del pcode en un programa comprensible para la mquina.

Herramientas necesarias para desarrollar en Java


Para desarrollar programas en Java es suficiente con instalar el paquete JDK
de Sun, que es de libre distribucin. En el site de Sun podemos encontrar
toda clase de informacin relacionada con Java: Ejemplos de programas
escritos en Java, tutoriales, documentacin, bugs conocidos y su solucin,
etc..
La direccin base es : www.sun.com
La ultima version disponible hasta la fecha es la JDK 1.2
Pasos para crear un programa en Java
- Aplicaciones

Escribir el programa fuente en cualquier editor y guardarlo con


extensin .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


extensin .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 bsicas para comenzar a programar en
lenguaje JAVA podra ser:
1.- Editor de cdigo multilenguaje y con utilidades de edicin y deteccin
automtica de errores. Un muy buen editor con estas propiedades y muchas
ms es ED for Windows v3.80 (www.getsoft.com) pero existen muchos
otros y casi todos de libre distribucin.
2.- JDK1.1.x, con el que podemos compilar y probar las aplicaciones y
applets realizados.
3.- Documentacin HTML de las clases JAVA.
Adems de lo arriba indicado, es aconsejable trabajar con paquetes de
componentes que no pertenecen a los bsicos de Java, como puede ser
swing o symbeans. Estos componentes o beans proporcionan utilidades y
facilidades aadidas al paquete bsico 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 programacin con mdulos editor, de diseo visual,
compilador, depurador, etc. Adems proporcionan componentes propios
especialmente tiles en diseo de interfaces grficas.

DA 2
Gramtica de Java
1. Comentarios

En Java hay tres tipos de comentarios:


// comentarios para una sola lnea
/* comentarios de una o
ms lneas
*/
/** comentario de documentacin, de una o ms lneas
*/
Los dos primeros tipos de comentarios son los que todo programador
conoce y se utilizan del mismo modo. Los comentarios de documentacin,
colocados inmediatamente antes de una declaracin (de variable o funcin),
indican que ese comentario ha de ser colocado en la documentacin que se
genera automticamente cuando se utiliza la herramienta de Java, javadoc.
Dichos comentarios sirven como descripcin del elemento declarado
permitiendo generar una documentacin de nuestras clases escrita al
mismo tiempo que se genera el cdigo.
2. Identificadores
Los identificadores nombran variables, funciones, clases y objetos; cualquier
cosa que el programador necesite identificar o usar.
En Java, un identificador comienza con una letra, un subrayado (_) o un
smbolo de dlar ($). Los siguientes caracteres pueden ser letras o dgitos.
Se distinguen las maysculas de las minsculas y no hay longitud mxima.
Ejemplos de identificadores vlidos:
Identificador nombre_usuario Nombre_Usuario _variable_de_sistema
$transaccion
y su uso sera, por ejemplo:
int contador_principal; char _lista_de_ficheros; float cantidad_en_Ptas;
3. Palabras clave
Las siguientes son las palabras clave que estn 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
4. Palabras reservadas
Adems, el lenguaje se reserva unas cuantas palabras ms, pero que hasta
ahora no tienen un cometido especfico. Son:
cast future generic inneroperator outer rest var
5. Tags HTML
Atributos del tag <APPLET>; (en negrita los imprescindibles)
<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 AWT

Aplicaciones vs. Applets


Las caractersticas propias del lenguaje JAVA hacen que adems de poder
desarrollar aplicaciones que se ejecutan en el intrprete local, se puedan
desarrollar mdulos descargables a travs de una pgina web y ejecutables
en la JVM (Java Virtual Machine) del navegador. Estos mdulos reciben el
nombre de Applets.
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, mtodos, atributos y objetos en Java


Veamos a continuacin mediante un ejemplo cmo se implementan los
conceptos ms importantes vistos tericamente en la introduccin a la OOP
en JAVA:
// Moto.java
package 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 cubicos
String 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");
}
else
{
System.out.println("- el motor esta apagado");
}

/* Aadir:
-

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 propietario

Comentarios:
-

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
}
}

1. Tipos de Clases
Hasta ahora slo se ha utilizado la palabra clave public para calificar el
nombre de las clases que hemos visto, pero hay tres modificadores ms. Los
tipos de clases que podemos definir son:
abstract
Una clase abstract tiene al menos un mtodo 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 mtodos 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 mtodos de instancia

Una clase en Java puede contener variables y mtodos. Las variables


pueden ser tipos primitivos como int, char, etc. Los mtodos son funciones.
Por ejemplo, en el siguiente trozo de cdigo 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 mtodos, MiClase que es el
constructor de la clase y Suma_a_i( int j ).
3. Mtodos y Constructores
Los mtodos son funciones que pueden ser llamadas dentro de la clase o
por otras clases. El constructor es un tipo especfico de mtodo que siempre
tiene el mismo nombre que la clase.
Cuando se declara una clase en Java, se pueden declarar uno o ms
constructores opcionales que realizan la inicializacin cuando se instancia
(se crea una ocurrencia) un objeto de dicha clase.
Utilizando el cdigo de ejemplo anterior, cuando se crea una nueva
instancia de MiClase, se crean (instancian) todos los mtodos 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
declaracin de tipo. Despus 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 mtodos de MiClase, se puede usar la


primera sintaxis para llamar al mtodo 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
La Herencia es el mecanismo por el que se crean nuevos objetos definidos
en trminos de objetos ya existentes. Por ejemplo, si se tiene la clase Ave,
se puede crear la subclase Pato, que es una especializacin de Ave.
class Pato extends Ave {
int numero_de_patas;
}
La palabra clave extends se usa para generar una subclase (especializacin)
de un objeto. Una Pato es una subclase de Ave. Cualquier cosa que
contenga la definicin de Ave ser copiada a la clase Pato, adems, en Pato
se pueden definir sus propios mtodos y variables de instancia. Se dice que
Pato deriva o hereda de Ave.
Adems, se pueden sustituir los mtodos proporcionados por la clase base.
Utilizando nuestro anterior ejemplo de MiClase, aqu hay un ejemplo de una
clase derivada sustituyendo a la funcin 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 tambin
se inicializa a 10, pero la llamada al mtodo Suma_a_i() produce un
resultado diferente:
MiNuevaClase mnc;
mnc = new MiNuevaClase();

mnc.Suma_a_i( 10 );
En Java no se puede hacer herencia mltiple. Por ejemplo, de la clase
aparato con motor y de la clase animal no se puede derivar nada, sera
como obtener el objeto toro mecnico a partir de una mquina motorizada
(aparato con motor) y un toro (aminal). En realidad, lo que se pretende es
copiar los mtodos, es decir, pasar la funcionalidad del toro de verdad al
toro mecnico, con lo cual no sera necesaria la herencia mltiple sino
simplemente la comparticin de funcionalidad que se encuentra
implementada en Java a travs de interfaces.
5. 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 mtodos definidos
en la clase:
public
public void CualquieraPuedeAcceder(){}
Cualquier clase desde cualquier lugar puede acceder a las variables y
mtodos de instacia pblicos.
protected
protected void SoloSubClases(){}
Slo las subclases de la clase y nadie ms puede acceder a las variables y
mtodos de instancia protegidos.
private
private String NumeroDelCarnetDeIdentidad;
Las variables y mtodos de instancia privados slo pueden ser accedidos
desde dentro de la clase. No son accesibles desde las subclases.
friendly (sin declaracin especfica)
void MetodoDeMiPaquete(){}
Por defecto, si no se especifica el control de acceso, las variables y mtodos
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 mtodos protegidos (protected) pueden ser vistos por las clases
derivadas, como en C++, y tambin, en Java, por los paquetes (packages).
Todas las clases de un paquete pueden ver los mtodos protegidos de ese
paquete. Para evitarlo, se deben declarar como private protected, lo que

hace que ya funcione como en C++ en donde slo se puede acceder a las
variables y mtodos protegidos de las clases derivadas.

6. Variables y mtodos estadsticos


En un momento determinado se puede querer crear una clase en la que el
valor de una variable de instancia sea el mismo (y de hecho 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 version ser el mismo para cualquier objeto
instanciado de la clase Documento. Siempre que un objeto instanciado de
Documento cambie la variable version, sta cambiar para todos los
objetos.
De la misma forma se puede declarar un mtodo como esttico, lo que evita
que el mtodo pueda acceder a las variables de instancia no estticas:
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 modificacin de la variable numero_de_capitulos no funciona porque se
est violando una de las reglas de acceso al intentar acceder desde un
mtodo esttico a una variable no esttica.
Todas las clases que se derivan, cuando se declaran estticas, comparten la
misma pgina de variables; es decir, todos los objetos que se generen
comparten la misma zona de memoria. Las funciones estticas se usan para
acceder solamente a variables estticas.

class UnaClase {
int var;
UnaClase()
{
var = 5;
}
UnaFuncion()
{
var += 5;
}
}
En el cdigo anterior, si se llama a la funcin UnaFuncion a travs de un
puntero a funcin, no se podra acceder a var, porque al utilizar un puntero
a funcin no se pasa implcitamente el puntero al propio objeto (this). Sin
embargo, s se podra acceder a var si fuese esttica, porque siempre
estara en la misma posicin de memoria para todos los objetos que se
creasen de UnaClase.
7. Interfaces
Los mtodos abstractos son tiles cuando se quiere que cada
implementacin de la clase parezca y funcione igual, pero necesita que se
cree una nueva clase para utilizar los mtodos abstractos.
Los interfaces proporcionan un mecanismo para abstraer los mtodos a un
nivel superior.
Un interface contiene una coleccin de mtodos que se implementan en
otro lugar. Los mtodos de una clase son public, static y final.
La principal diferencia entre interface y abstract es que un interface
proporciona un mecanismo de encapsulacin de los protocolos de los
mtodos 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 el interface VideoClip utilizarn la palabra


implements y proporcionarn el cdigo necesario para implementar los
mtodos que se han definido para el interface:
class MiClase implements VideoClip {
void play() {
<cdigo>
}
void bucle() {
<cdigo>
}
void stop() {
<cdigo>
}
Al utilizar implements para el interface es como si se hiciese una accin de
copiar-y-pegar del cdigo del interface, con lo cual no se hereda nada,
solamente se pueden usar los mtodos.
La ventaja principal del uso de interfaces es que una clase interface puede
ser implementada por cualquier nmero de clases, permitiendo a cada clase
compartir el interfaz de programacin sin tener que ser consciente de la
implementacin que hagan las otras clases que implementen el interface.
class MiOtraClase implements VideoClip {
void play() {
<cdigo nuevo>
}
void bucle() {
<cdigo nuevo>
}
void stop() {
<cdigo nuevo>
}

DA 3
Creacin 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" 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 ("vaya,
aqui no me dejan leer de disco")

Algunos applets paran su ejecucion al salir de la pagina, pero otros


continuan

Subclase de java.applet.Applet: por tanto hereda los metodos y clases


para manipular graficos, sonidos, etc...

PUBLIC class miclase extends java.applet.Applet: solo la clase


principal debe ser publica por fuerza

A 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

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
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++;}
}
Ejemplo2:
// 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);
}
}
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 tamao

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 pequa, 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;

<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 aade a continuacion;
If(nombreDelaFuente == null)
nombreDeLaFuente == "Courier";

Los parametros son siempre Strings. Si necesario


valor numerico, tendremos que convertir

Ej:
<PARAM NAME=tamaoLetras VALUE="36">
y
int tamaoDeLetra;
String tam = getParameter("tamao");
If (tam == null)
tamaoDeLetra = 20;
}
else tamaoDeLetra = Integer.parseInt(tam);
// OtroHolaMundoCruelApplet.java
import java.awt.Graphics;
import java.awt.Font;
import java.awt.Color;
public class OtroHolaMundoCruelApplet 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 = "Fulanito";
nombre = "Hola " + nombre + "!!!";
}
//
public void paint(Graphics g)
{
g.setFont(f);
g.setColor(Color.red);

g.drawString("Hola mundo cruel",5,50);


}
}
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, tamaos

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.drawRect(x,y,anchura,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,numeroPuntosPoligono);
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 areas de la pantalla

g.copyAerea(origenX,origenY,anchura,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 tamao)
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...

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);
}
}
}
}

// PintaFoto.java
import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Image;

Imagenes: clase Image,


metodo drawImage()

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, anchuraImagen,0,anchuraImagen/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
prximo. 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:

play(getCodeBase(), "audio/violin.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

Ej:

AudioClip no para de sonar


aunque cambiemos de pagina.
Por tanto, se suele
implementar clip.stop() en el
metodo stop() del applet.

// 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();
}
}
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);

// 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
ejecucion.

Cmo 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
pequeos 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()

paint() escribe el nuevo


pantallazo

public void update(Graphics g)


{
g.setColor(getBackground());
g.fillRect(0,0,width,height);
g.setColor(getForeground());
paint(g);
}

Eventos y respuesta al usuario

Es la llamada a update() la que


produce el parpadeo.

Soluciones posibles

Sobreescribir update()
para que no borre la
pantalla o que solo
borre una cierta area

Clipping: re-dibujar solo


aquello que cambia.
Metodo clipRect() de la
clase Graphics

Doble-buffering: hacer
los cambios en una
pantalla virtual y
volcar el resultado a la
pantalla real (p212
21days). Es el metodo
mas complicado...

Los eventos son una parte del


paquete AWT

Un evento es aparece cuando


hay interaccion con el usuario.
Ejemplos de eventos;

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:
// 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;
}
}

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)
{
setBackground(java.awt.Color.blue);
repaint();
return true;
}

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 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.shiftDown()) {// tratar el evento shift+click}
else {// tratar el evento click simple}
}

El manejador de eventos (AWT


Event Handler)

Hay muchos mas eventos,


relacionados con el AWT

DA 4
Interfaz grfica 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...

Button

Chekboxes

Choice

List

Menu

Text Field

Slider

Scrollbar

Text Area

Canvas

Label

Panel

Scroll Pane

1. Controles basicos

2. Otros controles

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
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.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);
}
}

5. 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
disposicion de los elementos es automatica.
6. Como usar Checkboxes
// EjemploAWTApplet.java
...
add(new
add(new
add(new
add(new
...

Checkbox("Pamplona"));
Checkbox("Bilbao", null, true));
Checkbox("Madrid"));
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

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); // aade 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 lista

8. 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

Es un componente similar a TextField.

TextField es mas conveniente para


pequeos 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
eran\n" +
"hermanos. Decidieron construirse una casa, y uno el primero de\n" +
"ellos se la hizo de paja, el segundo de madera y el tercero de ladrillo\n" +
"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.: 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 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 tamao de la ventana
Point dim = location(); //devuelve la posicion de este componente, como la
esquina sup-izda
//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()
...
// 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

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 aade 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.

...Scrollbar barraDeslizante = new Scrollbar(Scrollbar.HORIZONTAL);


add(barraDeslizante);
...
// constructor mas general:
// Scrollbar(int orientacion, int valorInicial, int anchura, int valorMinimo, int
valorMaximo);
...
Metodos utiles:

getValue() // Devuelve el valor actual de la barra


setValue() // Asigna un valor a la barra
13. 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.

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).

Canvas can = new Canvas();


add(can);
14. Como usar Panels

...
Panel unPanel = new Panel();
unPanel.add(new Label("Arriba"));
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 tamao 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, 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...


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 aadiendo 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 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 aadiendo 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 aadir 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 separacion entre celdas, en pixels

GridBagLayout

Es el LM mas complejo y potente.

Permite definir celdas, pero de distinto


tamao

Tambien se puede definir el


comportamiento de las celdas al variar el
tamao de la ventana que los contiene (ver
GridBagConstraints): se mantiene su

tamao, 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("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:

Insets

Definen un espacio de marco del panel.

Se pueden asignar anchuras


independientes a los 4 lados

setLayout(null)

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

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,...

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 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
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.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);
}

// Metodos 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");
}
// Metodos del 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 (ver documentacion)

DA 5
Ejemplo de programas
Ilustracin 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 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,12
}
public void stop() {contadorStop++;}
public void destroy() {contadorDestroy++;}
}
Clases para hacer grficos sencillos. Colores.

// CajasDeColores.java
// Dibuja una serie de rectngulos y los rellena con colores d
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 esta en el direct


html
sonido = getAudioClip(getCodeBase(), "yahoo1.au");
}
public void start()
{
sonido.loop();
}
public void stop()
{
sonido.stop();
}
}

Cmo tratar los eventos

// EjemploDeEventos.java
// EVENTOS JDK 1.1.x
// Muestra una ventana con 3 botones que cambian el color
import java.awt.*;
import java.awt.event.*;

class BotonesDeColores implements MouseListener, ActionL


{
// Declara los componentes que luego se usaran para crear l
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);
}
// Metodos del interfaz MouseListener
public void mouseClicked(MouseEvent e)

{
areaTexto.append("mouseClicked: x=" + e.getX() + ", y=" +
"\n");
}
public void mouseEntered(MouseEvent e)

{
areaTexto.append("mouseEntered: x=" + e.getX() + ", y=" +
"\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=" +
"\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=" +
"\n");
}
public void mouseReleased(MouseEvent e)

{
areaTexto.append("mouseReleased: x=" + e.getX() + ", y="
"\n");
}
// Metodos del 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(Co
else if (nombreColor.equals("Azul")) areaTexto.setBackgroun
else if (nombreColor.equals("Verde"))
areaTexto.setBackground(Color.green);
else if (nombreColor.equals("Amarillo"))
areaTexto.setBackground(Color.yellow);
}
}

// Metodo de entrada al programa. Es el primero que se ejec


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 opcion de menu
opcionMenu1_1.addActionListener(aSymAction);
}

//Clase interna que controla los eventos de raton. Extiende d


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=" +


"\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=" +
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=" +


"\n");
}
public void mouseReleased(MouseEvent e)
{

areaTexto.append("mouseReleased: x=" + e.getX() + ", y="


"\n");
}
} //fin de la clase interna SymMouse
//Clase interna que controla los eventos generales
class 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 SymMouse

public void cambiaColor(String nombreColor)

{
if (nombreColor.equals("Rojo")) areaTexto.setBackground(Co
else if (nombreColor.equals("Azul")) areaTexto.setBackgroun
else if (nombreColor.equals("Verde")) areaTexto.setBackgrou
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();
}
}

Aplicacin 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.t

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
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);
}
}
}

Utilizacin de los sockets para mandar mensajes entre dos mquinas


// 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: " + b
}
}
// 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
} 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 +
// 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
} catch (IOException e)
{
System.err.println(e);
}
}
}
}

Muestra una pgina 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(con
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();
}
}

BIBLIOGRAFA RECOMENDADA
- Aprendiendo JAVA 1.1 en 21 Das. 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-Hill

DIRECCIONES EN INTERNET
http://www.java.sun.com : Direccin donde Sun mantiene informacin sobre
Java.
http://www.javasoft.com : Direccin de la divisin 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 informacin JAVA.


http://www.xcf.berkeley.edu/lists.html : Hoja con informacin para suscribirse
a listas de correo de Java.
http://www.productlist.com/i_java_faq.htm : Uno de los muchos FAQs sobre
Java.
http://www.unav.es/cti/manuales/Java/curso_java_links.html : Material
didctico complementario al curso.
GRUPOS DE NOTICIAS

comp.lang.java.programmer

comp.lang.java

comp.lang.java.tech

Das könnte Ihnen auch gefallen