Beruflich Dokumente
Kultur Dokumente
com
JAVA DESDE
QUÉ
CEROES
JAVA
LENGUAJE DE
INDEPENDIENTE
OBJETOS
3 DE LA
PLATAFORMA
3
ALGUNAS
CARACTERÍSTICAS…
3 JAVA DEVELOPMENT
EL
4EMPECEMOS
KIT DE UNA
4VEZ!
JAVASCRIPT
5
LAS CLASES EN
5ESTRUCTURA
6
JAVA DE UNA
CLASE
ESTRUCTURA DE
7CLASES
DECLARACIÓN DE LA
8EL
CLASE
CUERPO DE LA
12
CLASE
EL CUERPO DE LOS
12
DECLARACIÓN
MÉTODOS DE VARIABLES
14
LOCALES
ASIGNACIONES A
17
VARIABLES
OPERACIONES
18
MATEMÁTICAS
LLAMADAS A
18
MÉTODOS
LAS ESTRUCTURAS DE
IF…[ELSE]
18
CONTROL
19
SWITCH…CASE…BRAKE…DEFAULT
21
WHILE
DO…
22 WHILE
FOR
22
23
BREAK Y
CONTINUE
23
OTRAS...
HAGAMOS
23
ALGO...
LA
24 CLASE
COMPLEJO
ALGO SOBRE LOS
24
MÉTODOS
JAVA A TRAVÉS DE LA
VENTANA PRIMERA
25
NUESTRA
28
VENTANA
UNA VENTANA CON
30
VIDA
VIAJANDO CON
30
JAVA
COMPLETANDO LA
34
VENTANA
UN PARÉNTESIS DE
34
PRIMERA
ENTRADA/SALIDA
41
CAPTURANDO
LECTURA
EXCEPCIONES
LOS
46 APPLETS Y LOS
ARCHIVOS MODESTO
46
NUESTRO
47
"EDITOR"
VOLVIENDO AL
49
MENÚ
AWT A LA
JAVA
51
DIÁLOGOS
54
DIBUJAVA
57
59
CANVAS EN
ACCIÓN
EL
60 APPLET-
CONTAINER
NUESTRO CANVAS A
60
MEDIDA
DIBUJAVA
61
VECTORES
II EN
62
ACCIÓN
FLICKER
MOLESTO!
64
64
66 Descargado de: http://technologycompartida.blogspot.com
Página 1
Descargado de: http://technologycompartida.blogspot.com
ANIMATE!
JAVA EN
67
HEBRAS
LOS PASOS
BÁSICOS
REUNIÓN DE
69
AMIGOS
CREANDO
69
THREADS
Y LOS
69
APPLETS...?
LA LIEBRE Y LA TORTUGA (Y EL
GUEPARDO)
71
SINCRONICEMOS LOS
72
RELOJES
MÁS
74
SINCRONIZACIÓN
CAPÍTULO XV - SOLUCIÓN AL PROBLEMA
75
PROPUESTO
MULTIMEDIA!
77
PARAMETRIZANDO UN
80
APPLET
PASEANDO
83 POR LA
LOS
RED
85
SOCKETS
86
87
Página 2
Descargado de: http://technologycompartida.blogspot.com
Java desde
Cero
Con ésta comienzo una serie de notas sobre Java,
especialmente
conocerlo para Esto
y usarlo. aquellos que quieren
se originó en un comenzar
interés quea surgió en
desarrolladores de web, y que
algunos de los suscriptores delpongo a list de
mailing
Seguramente muchosdel
disposición también dede
ustedes sabrán mucho más sobre
webmasters.
Java que yo, oy les agradeceré todo tipo de
comentarios
La idea es dar una guía ordenada para el estudio de este lenguaje,
correcciones.
muy poderoso
todavía adoleceydede algunas
gran coherencia, aunque
limitaciones que
seguramente se irán superando con el tiempo.
Qué es
Java
Java es un lenguaje originalmente desarrollado por un grupo de
ingenieros de Sun,
posteriormente comoutilizado porJavascript.
base para Netscape Si bien su uso se
aplicaciones
destaca en el (locales,
Web, sirve para crear todo tipo de
intranet
Java es uno internet).
• de
lenguaje:
• independiente de
objetos
la plataforma
Algunas
•
características
• gestiona
notables: rob la memoria
•usto no permite el uso de técnicas de
automáticamente
•
programación inadecuadas
• cliente-
multithr
• mecanismos de
eading
servidor
• herramientas
seguridad incorporados
de
documentación incorporadas
Lenguaje de
Objetos
Por qué puse "de" objetos y no "orientado a" objetos? Para
destacar
C++, no que,
es unallenguaje
contrario de otros lenguajes
modificado como
para poder trabajar con
objetos sino
trabajar que es un
con objetos lenguaje
desde cero. creado paraTODO
De hecho,
lo que hay en Java son objetos.
Qué es un
objeto?
Bueno, se puede decir que todo puede verse como un objeto.
nuestro puntomás
Pero seamos de vista,
claros.puede verse como
Un objeto, desdeuna pieza de
•
software que cumple con ciertas características:
• encapsul
amiento
here
Encapsulamiento significa que el objeto es auto-contenido, o sea
tantoncia
que la misma
los datosdefinición
que éste usadel(atributos)
objeto incluye
como los procedimientos
(métodos)
Cuando se que actúan
utiliza sobre los mismos.
programación orientada a objetos, se definen
forma
clases en
(queque los objetos
definen objetosinteractúan
genéricos)entre
y la ellos, a través de
dice que seAlcrea
mensajes. unauninstancia
crear objeto dedeuna
la clase,
clase odada,
un objeto
se
propiamente
"autos", y un dicho. Por ejemplo,
auto dado es una una clase podría ser
La ventajadedelaesto
instancia es que como no hay programas que actúen
clase.
modificando al objeto, éste del
cierto modo independiente se mantiene
resto de laenaplicación. Si es
necesario modificar el objeto (por
darle más capacidades), esto se puede ejemplo,
hacerpara
sin tocar el resto de
la aplicación… lo que ahorra mucho tiempo
Página 3
Descargado de: http://technologycompartida.blogspot.com
Esta clase no está muy completa así, pero da una idea… Es una
ventana) que tiene
clase heredera de launclase
par de botones
Frame y unde
(un tipo texto. Contiene dos
tipo Button,
atributos y un
("si" únicoque
y "no"), método llamado
son dos Muestra
objetos del (igual que
la clase, por lo que es lo que se llama un
construc
tor).
Independiente de la
plataforma
Esto es casi del
todorealidad,
En cierto…Java podría hacerse correr hasta sobre una
Commodore
todo 64! La
su potencial, realidadunessistema
requiere que para utilizarlo en
operativo
Cómo es esto? Porque
multithreading (como Unix, Windows95,
en realidad Java es OS/2…).
un lenguaje
interpretado…
Al compilar un al menos enJava,
programa principio.
lo que se genera es un
seudocódigo
genérica. definido
Luego, por Sun,
al correr sobrepara
una una máquina
máquina dada, el software
instrucciones,
de ejecución Javaemulando a dichainterpreta
simplemente máquina lasgenérica. Por supuesto
esto no escomo
Netscape muy eficiente,
Hotjava opor lo que tanto
Explorer, al ejecutar el código por
primera
JIT: Justvez, lo van
In Time compilando
compiler), (mediante
de modo que aluncrear por ejemplo la
esté compilado
segunda específicamente
instancia de un objeto el código ya
Además, Sun e Intel
para la máquina se han puesto de acuerdo para desarrollar
huésped.
procesadores
Java, con lo quequeplanean
trabajenhacer
directamente
máquinasenmuy baratas que puedan
Java cliente-servidor
conectarse a
a la red y ejecutar aplicaciones
muy
El bajo costo.
lenguaje de dicha máquina genérica es público, y si uno
quisiera hacersólo
Commodore un intérprete
tendría queJava para una y pedirle a Sun la
implementarlo
los requisitos
aprobación de Java
(para en cuantoque
que verifique a cómo interpreta
cumple con
cada instrucción, la seguridad, etc.)
Algunas
características…
Entre las características que nombramos nos referimos a la
robustez.
diseñado, Justamente por laelforma
Java no permite en directo
manejo que estádel hardware ni de
la memoria (inclusive no permite modificar
Descargado de: http://technologycompartida.blogspot.com
Página 4
Descargado de: http://technologycompartida.blogspot.com
Página 5
Descargado de: http://technologycompartida.blogspot.com
Página 6
Descargado de: http://technologycompartida.blogspot.com
Las clases
en
montón Java
Bueno, antes que nada conviene saber que en Java hay un
de clases
Éstas vienen en lasya definidas y utilizables.
• java.lang
bibliotecas estándar: - clases esenciales, números, strings, objetos,
compilador,
el único runtime,
paquete que seguridad y threads (es
se incluye
• java.io - clases que
automáticamente en todo programa Java)
• java.util
manejan entradas y salidas
- clases útiles, como estructuras genéricas,
manejo de fecha,
aleatorios hora y strings, número
• java.net
, etc. - clases para soportar redes:
• java.awt
URL, TCP, UDP, IP, para
- clases etc. manejo de
• java.awt.image - clasesetc.
interface gráfica, ventanas, para
• java.awt.peer
manejo de imágenes - clases que conectan la interface gráfica
a implementaciones
plataforma (motif, dependientes de la
• java.applet - clases para la creación de applets y
windows)
Pararecursos para
que se den unareproducción de audio.
idea, los números enteros, por ejemplo,
son
Integer, que desciende de la claseredefinible,
"instancias" de una clase no Number e
implementa los siguientes atributos y métodos:
public final class java.lang.Integer
// java.lang.Number {
extends
Atributos
public final static int
MAX_VALUE;
public final static int
// Métodos
MIN_VALUE;
Constructores
public
public
Integer(int
// Más
Integer(String
value);
Métodos
s);public double
doubleValue();
public boolean
public float obj);
equals(Object
floatValue();
public static Integer
public static Integer
getInteger(String nm);
public static Integer
getInteger(String nm, int val);
getInteger(String
public int nm, Integer val);
hashCode();
public int
public long
intValue();
longValue();
public static int
public static int
parseInt(String s);
public static String
parseInt(String s, int radix);
toBinaryString(int
public static String i);
toHexString(int i);
public static String
public String i);
toOctalString(int
toString();
public static String
toString(int i);
Página 7
Descargado de: http://technologycompartida.blogspot.com
Página 8
Descargado de: http://technologycompartida.blogspot.com
public
// Uso laclass
biblioteca
Ejemplo1 de entradas/salidas
{ //
IMPORTANTE: Nombre de la clase // igual al nombre
// entero para asignarle el valor del del archivo!
contador
// aunquee en
imprimirlo
realidad
nostatic
me hace falta.
int// n;
y una variable tipo Contador
para instanciar
static Contadorel objeto…
laCuenta;
// ESTE METODO, MAIN, ES EL QUE
HACE// COMO QUEAPLICACION.
ESTO SE COMPORTE Es donde arranca el
// NOTA:cuando
programa main debe ser "java Ejemplo1"
ejecuto
public&static
public void main (
static.
StringSystem.out.println
args[] ) { ("Cuenta…
");laCuenta = new
System.out.println (laCuenta.getCuenta()); // 0
Contador();
-// Imprimo
Imprimo
n= el
elvalor
títuloactual (cero!)
System.out.println
// Creo
laCuenta.incCuenta();
una instancia del Contador
(n);laCuenta.incCuenta();
// 1System.out.println
- Asignación e incremento
- Lo incremento
// 2Ahora imprimo n (no uso el valor…
(laCuenta.getCuenta());
System.out.println
}
(laCuenta.incCuenta());
}// …de retorno) y lo imprimo
En
// 3 el capítulo
- Ahora todoIII en
vamos a analizar este programa en detalle. Por
un paso!
haga
ahoraloveamos la diferencia con un applet que
mismo:
Página 9
Descargado de: http://technologycompartida.blogspot.com
Página 10
Descargado de: http://technologycompartida.blogspot.com
// Archivo:
// Compilar con: javac
Ejemplo3.java
Ejemplo3.java
import
import
java.applet.*;
import
java.awt.*;
java.io.*;
public class Ejemplo3
static Applet {
extends
intstatic
n; Contador
laCuenta;
public
Ejemplo3
laCuenta()={ new
Contador();
}
Página 11
Descargado de: http://technologycompartida.blogspot.com
Estructura de
clases
Vamos a comenzar analizando la clase Contador, para ir viendo
las detalle.
en partes que
Esteforman unavaclase
capítulo a seruna por una
un poco y
aburrido por lo
exhaustivo
como (aunque algunos
las excepciones puntos los
y los threads másdejaremos
complicados
para
completo
después), de la me parece bueno tener un resumen
pero
Luego
sintaxisiremos
desde armando
ahora. pequeñas
aplicaciones
Recordemos para probar cada
la definición de cosa.
la clase Contador:
// Implementación de un
public
contadorclass
sencillo
Contador {
//
int
Atribut
//
cnt;
os
Construc
public
tor
Contador()
cnt = {
}
0;
//
public
Métod int
cnt+
incCuenta()
os {
+;
return
cnt;
}
public int
getCuenta()
return {
}
cnt;
}
Declaración de
laclase
La clasese declara mediante la línea public class Contador. En el
caso
clase más general,
puede la declaración
contener los de una
siguientes elementos:
Página 12
Descargado de: http://technologycompartida.blogspot.com
Página 13
Descargado de: http://technologycompartida.blogspot.com
El cuerpo de
lacuerpo
El clase de la clase, encerrado entre { y }, es la lista de
constituyen
atributos (variables) y métodos (funciones) que
la
Noclase.
es obligatorio, pero en general se listan primero
los atributos y luego los métodos.
Declaración de
atributos
En Java no hay variables globales; todas las variables se declaran
método.
dentro delLas variables
cuerpo de ladeclaradas dentro
clase o dentro de de
un un método son
locales de
cuerpo al método;
la clase selasdice
variables
que sondeclaradas
miembros ende
el la clase y son
Por otra parte,
accesibles además
por todos losdemétodos
los atributos de la propia clase se puede
de la clase.
la que desciende;
acceder a todos lospor ejemplo,
atributos decualquier
la clase declase que descienda de la
clase Polygon
xpoints e hereda los atributos npoints,
ypoints.
Finalmente, los atributos miembros de la clase pueden ser
que son atributos
atributos de clase de clase si se
o atributos deusa la palabra
instancia; clave static: en
se dice
ese caso la(objetos)
instancias variable es de única para
la clase todasun
(ocupa lasúnico lugar en memoria).
nuevo
Si no separa
usaesa variable
static, con cada
el sistema creainstancia
un lugar (o sea que
La declaración sigue
es independiente parasiempre
cada objeto).
el mismo esquema:
[private|protected|public] [static] [final] [transient]
[volatile] Tipo NombreVariable [= Valor];
Private, protected
oJava
public
tiene 4 tipos de acceso diferente a las variables o métodos de
paquete
una clase:(siprivado,
no se protegido, público o por
De acuerdonada).
especifica a la forma en que se especifica un atributo, objetos de
otras
accederclases tienen distintas posibilidades de
los:
Acceso desde:
la propia claseSSSS privateprotectedpublic(p
ackage)
subclase en
paquete NSSS
el mismo
otras clases en el NSSSmismo
paquete
subclases
paquetes NXSN
en otros
otras clases
paquetes NNSN
en otros
S: puede
acceder
N: no puede
X: puede acceder al atributo en objetos que pertenezcan a la
acceder
subclase,
madre. Espero no en
un caso los que; pertenecen
especial a la clase
más adelante
veremos ejemplos de todo esto.
Static y
final
Como ya se vio, static sirve para definir un atributo como de
clase, o sea único para todos los objetos de la
clas
En cuanto a final, como en las clases, determina que un atributo no
e.
pueda
no ser sobreescrito
se trata o redefinido. O sea:
de una variable,
sino de una constante.
Transient y
volatile
Son casos bastante particulares y que no habían
Transient denomina atributos
sido implementados que no se graban cuando se
en Java 1.0.
estado
archivapermanente
un objeto, o sea que no forman parte del
del mismo.
Página 14
Descargado de: http://technologycompartida.blogspot.com
Página 15
Descargado de: http://technologycompartida.blogspot.com
El resto de la
declaración
Public, private y protected actúan exactamente igual para los
métodos que para los atributos, así que veamos
el
Los métodos estáticos (static), son, como los atributos, métodos
resto.
de clase;desi instancia.
método el métodoEl nosignificado
es static eses
unel mismo que para los
todas las instancias
atributos: un método static es compartido por
de
Ya lahemos
clase.hablado de las clases abstractas; los métodos abstractos
declaración
(abstract) son pero no la implementación
aquellos de los que se da (o
la sea que consiste sólo
contenga al menos un Cualquier
del encabezamiento). método abstracto (o cuya clase madre
clase que
contenga
esté al menos un
implementado en método abstracto que no
la hija) es
unafinal
Es claseunabstracta.
método que no puede ser redefinido por
ningún descendiente de la clase.
Página 16
Descargado de: http://technologycompartida.blogspot.com
El cuerpo de los
métodos
Otra vez recordaremos nuestra
vieja clase Contador:
// Implementación de un
contador
public sencillo
class
…………
Contador {
……..
public int
incCuenta()
cnt+ {
return
+;
}
cnt;
…………
………
}
Página 17
Descargado de: http://technologycompartida.blogspot.com
• Operaciones
• Llamados a
matemáticas
• dentro de
otros métodos:
• clase
la de instancia, de
• de
otras clases
clase, de
• Estructuras clase
cualquier
• control
de Excepciones (try, catch, que
veremos más adelante)
Declaración de
variables
Las locales
variables locales se declaran igual
Tipo
que los atributos de la clase:
Ej: int
NombreVariable [=
suma;
Valor];
float
Contador
precio;
laCuenta;
Sólo que aquí no se declaran private, public, etc., sino que las
variables definidas dentro del método sólo son
accesibles
Las variables pueden
por él.
Ej: int
inicializarse al crearse:
sumaprecio
float = 0;
Contador
= 12.3; laCuenta =
new Contador ( );
Asignaciones a
variables
Se asigna un valor a una variable
mediante
Variable =elConstante
signo =:
|Ej:Expresión
suma = ;
precio
suma +=1;1.05
* precio;
laCuenta.c
El
nt =último
0; caso es válido si cnt es una variable pública de la
conveniente
clase Contador. acceder directamente
Personalmente no acreo
variables de otro objeto, ya
oquedelfuturas
que llama puede propender
modificaciones la difusión
del objeto de errores… Es
llamado
mejor usarinicializarContador
hipotético métodos como getCuenta o unDe hecho, algunos
para ello.
declaren
sugieren como
que todas las variables de una clase se
private.
En el primer caso, o
Variable = Variable
sea en general:
se puede escribir
Operador en
Expresión;
forma más
Variable sencilla:
Operador=
Expresión;
Por ejemplo, suma =
puede
suma +escribirse: suma
9 - cantidad;
y+=precio
9-cantidad;
=
como:
precio *precio
0.97;
*= 0.97;
Operaciones
matemáticas
Hay varios tipos de
operadores:
Unarios: + - ++ -- ~ !
(tipo)
Se …..etc.
colocan antes (o en algunos casos
después)
Por de la-cnt;
ejemplo: constante o expresión.
// cambia de signo; por ejemplo si cnt es
12 el resultado
++cnt; es -12; cnt no cambia.
// equivale
cnt++;
a cnt +=// 1;
equivale a cnt +=1; veremos la diferencia
--cnt; // equivale
al hablar de estructuras de control
a cnt -=
cnt--; 1;
// equivale
Binarios:
a cnt -= 1;+ - * /
% …..etc.
Van entre dos constantes o expresiones
o combinación de ambas.
Descargado de: http://technologycompartida.blogspot.com
Página 18
Descargado de: http://technologycompartida.blogspot.com
Página 19
Descargado de: http://technologycompartida.blogspot.com
public float
Norma() { return
} (float)Math.sqrt(x*x+
// obligatorios
y*y);
(son
public double abstractos en Number):
doubleValue()return
{
} (double)Norma(
public float );
floatValue()return
{
} Norma();
public int
intValue() {return
} (int)Norma()
public long ;
longValue()return
{
} (long)Norma(
public String);
toString() { return
} "("+x+")+i("+y+
}")";
Nombre_del_Objeto<punto>Nombre_
del_Método(parámetros)
// Archivo:
Ejemplo4.java
// Compilar con: javac
Ejemplo4.java
// Ejecutar con: java
import
Ejemplo4
java.io.*;
public class
public static
Ejemplo4 { void
main(String
Complejo args[]) { = new
numComp
Complejo(4,-3);
System.out.println(numCom
System.out.println(numCo
p.toString());
}
mp.Norma());
}
Página 20
Descargado de: http://technologycompartida.blogspot.com
Las estructuras
de control
Las estructuras de control en Java son básicamente las misma que
(al fincon
en C, un excepción del goto, que no existe
lenguaje serio! )
if…[e
lse]
La más común de todas, permite ejecutar una instrucción (o
dada (o, mediante
secuencia la cláusulasielse,
de instrucciones) se daejecutar
una condición
otra secuencia en caso contrario).
if (expresión_booleana)
instrucción_si_true;
[else
instrucción_si_fa
lse;]
Descargado de: http://technologycompartida.blogspot.com
Página 21
Descargado de: http://technologycompartida.blogspot.com
o
bien:
if
(expresión_bool
instrucciones_
}eana) { si_true;
else
{ instrucciones_s
} i_false;
Por
ejemplo:
public final String
toString() { if
(y<0) return x+"-
else i"+(-y);
return
} +x+"+i"+y;
Switch…case…bra
ke…default
Permite ejecutar una serie de operaciones para el caso de que
ejecución
una variable saltea todos
tenga los case
un valor hasta
entero que La
dado. encuentra uno con el
final
valordel case
de la o hastayque
variable, encuentre
ejecuta desde unallíbreak, en cuyo caso salta
hasta el
al
unafinal deldecase.
serie El defaultque
instrucciones permite poner en caso de que la
se ejecutan
igualdad no se de para ninguno de los case.
switch
case (valor1):
(expresión_entera
){ instrucciones_1; [break;
case (valor2): ]
instrucciones_2; [break;
….. ]
case (valorN):
instrucciones_N; [break;
default: ]
} instrucciones_por_def
ecto;
Por
ejemplo:
switch
(mes) { case (2): if
(bisiesto()) dias=29;
else
dias=31;
break
case ;
(4):
case
case
(6):
case (11):
(9):
dias = 30; break
default: ;
} di
as = 31;
Whi
le
Permite ejecutar un grupo de instrucciones
mientras se cumpla una condición dada:
while
instruccion
(expresión_boolea
na) { es…
Descargado de: http://technologycompartida.blogspot.com
Página 22
Descargado de: http://technologycompartida.blogspot.com
}
Por
ejemplo:
while ( linea
linea = {
!= null)
System.out.prin
archivo.LeerLine
tln(linea);
}a();
Do…w
hile
Similar al anterior, sólo que la condición se evalúa
al final del ciclo y no al principio:
do
{ instruccion
} while es…
(expresión_boolea
Por na);
ejemplo:
do
{linea =
archivo.LeerLine
if (linea != null)
}a();
while (linea
System.out.println(linea);
!= null);
Fo
r
También para ejecutar en forma repetida una serie de
instrucciones; es un poco más complejo:
for ( instrucciones_iniciales;
instruccion
condición_booleana; instruccion_repetitiva_x )
}{ es…
Si bien las instrucciones pueden ser cualquiera (el bucle se
usual
repite es utilizarlo
mientras para "contar"
la condición sea la cantidad de
verdadera), lo veces que se
repiten las instrucciones; se podría indicar así:
for ( contador = valor_inicial; contador <
valor_final; instruccion
contador++ ) {
} es…
Por
ejemplo:
for ( i=0;
i<10; i++ ) {System.out.pri
} ntln( i );
o, para contar
hacia atrás:
for ( i=10;
I>0; I-- ) { System.out.pri
} ntln( i );
Break y
continue
Estas instrucciones permiten saltar al final de una ejecución
repetitiva (break) o al principio de la misma
(contin
Por
ue).
ejemplo,
import
en:
java.io.*;
class
Bucles {
Página 23
Descargado de: http://technologycompartida.blogspot.com
La
salida
antes
es:
1después
1antes
2antes
3Por qué? "i" comienza en 1 (imprime "antes" y "después");
bucle
cuando(no imprime
pasa a 2, elel "después").
continue salta Finalmente, cuando "i" vale
al principio del
3, el break da por terminado el bucle for.
Otras
...
Hay otras instrucciones que
• synchronized
controlan (para ver
el flujo del programa:
•
junto con los threads)
• cat
• thr
ch,
•ow, finally
tr (para ver con
Ahora y, sí,excepciones)
las podemos usar todo nuestro conocimiento sobre Java
para
ir ir creando
viendo las algunas aplicaciones y de paso
bibliotecas estándar...
Hagamos
algo...
Bueno, vamos a hacer una pequeña
Para empezar,
aplicación paravamos a desarrollar
practicar un poco. un poquito una clase
para trabajar con números complejos.
Descargado de: http://technologycompartida.blogspot.com
Página 24
Descargado de: http://technologycompartida.blogspot.com
http://www.zonazof
t.com
La clase
Complejo
// grabar como
// compilar con "javac
Complejo.java
Complejo.java"
public final class Complejo
extends Number {
//
atributo private
s: private
float x;
float y;
//
constructor
public
es:
Complejo() x{ =
0;
y=
} 0;
public Complejo(float
rx, float iy) {x =
rx;
y=
} iy;
//
//
método
Norm
s:
public final float
a
Norma() { return
} (float)Math.sqrt(x*x+
public final y*y);
float
Norma(Complejo return c) {
} (float)Math.sqrt(c.x*c.x+
// c.y*c.y);
Conjuga
public final Complejo
do
Conjugado() Complejo
{ r = new
Complejo(x,-y);
return
} r;
public final Complejo
Conjugado(Complejo
Complejo c) r ={new
Complejo(c.x,-c.y);
return
} r;
// obligatorios (son
public finalendouble
abstractos Number):
doubleValue() return
{
} (double)Norma
public final ();
float
floatValue()return
{
} Norma();
public final int
intValue() {return
} (int)Norma();
public final long
longValue()return
{
} (long)Norma()
public final ;String
toString() { if
(y<0) return x+"-
i"+(-y);
Descargado de: http://technologycompartida.blogspot.com
Página 25
Descargado de: http://technologycompartida.blogspot.com
else
return
} x+"+i"+y;
// Operaciones
public static final Complejo
matemáticas
Suma(Complejo returnc1,
newComplejo c2) {
} Complejo(c1.x+c2.x,c1.y+c
public static2.y);
final Complejo
Resta(Complejoreturnc1,new Complejo(c1.x-
Complejo c2) {
} c2.x,c1.y-c2.y);
public static final Complejo
return new
Producto(Complejo c1,Complejo(c1.x*c2.x-
Complejo c2) {
} c1.y*c2.y,c1.x*c2.y+c1.y*c2.x);
// Nos va a venir bien para
// como división
aprender excepciones...
por cero!
public static final Complejo
return newc, float f) {
DivEscalar(Complejo
} Complejo(c.x/
public staticf,c.y/f);
final Complejo
Cociente(Complejo
float x =c1, Complejo c2) {
float y=-
c1.x*c2.x+c1.y*c2.
c1.x*c2.y+c1.y*c2.
y; n =
float
x;
Complejo r = new
c2.x*c2.x+c2.y*c2.
return
Complejo(x,y);
y;
} DivEscalar(r,n
} );
Página 26
Descargado de: http://technologycompartida.blogspot.com
v=
miComplejo.Norma(); otroComplejo =
Con parámetros, en cambio, miComplejo.Conjugado();
devuelven la norma
o// el
porconjugado
ejemplo del parámetro:
v=
unComplejo.Norma(mi
otroComplejo =
Notar que lo Complejo);
unComplejo.Conjugado(miCompl
otroComplejo =
siguiente es inválido: ejo);
Complejo.Norma(miComplejo);
...porque el método no es static, por // NO SE debe llamarse para
lo tanto
PUEDE!
una instancia en particular (en este caso,
unCompl
ejo).
// obligatorios (son
public finalendouble
abstractos Number):
doubleValue()
public final float
public final int
floatValue()
public final long
intValue()
Estos métodos longValue()
es obligatorio definirlos, ya que en la clase madre
Number son métodos abstractos, o sea que
debemos
Como todos los métodos de esta clase son final, o sea que no
implementarlos
puede
aquí. serpuesto
realidad redefinido.
que laNo es no
clase importante en
puede tener descendientes...
public final String
Este métodotoString()
nos sirve para representar el complejo como una
cadena de caracteres, de la forma x+iy.
// Operaciones
public static final Complejo
matemáticas
Suma(Complejo
public static finalc1, Complejo c2)
Complejo
public static finalc1,
Resta(Complejo Complejo
Complejo c2)
Producto(Complejo c1, Complejo c2)
public static final Complejo
DivEscalar(Complejo c, float f)
public static final Complejo
Aquí definimos varias operaciones
Cociente(Complejo c1, matemáticas.
Complejo c2)Notar que se
métodos son como
han definido únicosstatic,
independientemente
o sea que los de las instancias. Esto
permite que
instancia los podamos ejecutar sobre una
o directamente
sobre la clase:
miComplejo =
unComplejo.Suma(comp1,comp2);
miComplejo =
Por ejemplo, la siguiente aplicación nos muestra cómo
Complejo.Suma(comp1,comp2);
// vale usar algunos de estos métodos:
podemos
// Archivo:
TAMBIEN VALE!
Ejemplo5.java
// Compilar con: javac
Ejemplo5.java
// Ejecutar con:
import
java Ejemplo5
java.io.*;
public class
Ejemplo5 {
public static void
main(String
Complejo args[]) {
c1 = new
Complejo(4,-3);
System.out.println(c1+"\tNorm
Complejo c2 = new
a="+c1.Norma());
Complejo(-2,5);
System.out.println(c2+"\tNorma="
+c2.Norma()+"\n");
System.out.println("("+c1+")/4
:"+Complejo.DivEscalar(c1,4));
System.out.println("Suma :
"+Complejo.Suma(c1,c2));
Página 27
Descargado de: http://technologycompartida.blogspot.com
System.out.println("Resta :
"+Complejo.Resta(c1,c2).toString());
System.out.println("Multip:
System.out.println("Divis :
"+Complejo.Producto(c1,c2).toString());
"+Complejo.Cociente(c1,c2).toString());
}
}
Hay varias cosas para notar: por ejemplo, que podemos
declarar las variables a la vez que las creamos:
Complejo c1 = new
c1 y c2 son dos objetos (instancias)
Complejo(4,-3);
de la clase
Notar Complejo.
también que no hace falta
poner para imprimir:
System.out.println(c1.t
ya que println automáticamente usa el método toString() de la
oString().......);
clase para imprimir.
en el programa, Basta con poner c1, como
aunque
c1.toString() también
También se ve el uso de es válido.
los métodos static,
accediéndolos directamente por la clase, en:
System.out.println("Suma :
Y tampoco aquí usamos toString(), aunque no está mal si se
"+Complejo.Suma(c1,c2));
usa Complejo.Suma(c1,c2).toString().
Algo sobre los
métodos
Analicemos un poco ahora cómo implementamos
los métodos de la clase Complejo.
public final int
intValue() {return
} (int)Norma();
Ya que no podemos convertir así nomás un complejo en un
elegido usar implementar
entero, para como valor de retorno
estos la norma
métodos hemos del complejo. En
este caso,un
devuelve y dado
float,que el método
usamos Norma()
typecasting, es decir, lo
convertimos en entero precediéndolo con (int).
public final String
toString() { if
(y<0) return x+"-
else i"+(-y);
return
} x+"+i"+y;
Aquí representamos el complejo en forma de cadena de
adecuadamente
caracteres. Hemos el signo
usadode el la
if parte imaginaria. Noten también
para representar
la asombrosa
convertir ayuda que noslas
automáticamente brinda Java,xale y a String para la
variables
concatenación (mediante el signo "+")!
public static final Complejo
float x =c1, Complejo c2) {
Cociente(Complejo
c1.x*c2.x+c1.y*c2.
float y=-
y; n =
float
c1.x*c2.y+c1.y*c2.
Complejo r = new
c2.x*c2.x+c2.y*c2.
x;
Complejo(x,y);
y;
return
} DivEscalar(r,n
Aquí tengan en cuenta que ); las variables x e y, definidas como
float, no tienen
(atributos) de lanada
claseque
quever
estáncondefinidas
las variables
al principio de la
Podemos
misma, sino usarque
return DivEscalar(r,n),
son variables locales ya que DivEscalar es un
al método.
método propio de la clase; no hace falta
poner
Complejo.DivEsca
Qué pasa con r, el new Complejo(x,y) que creamos? Nada; cuando
lar.objetodeno
un
basura" se usa
Java más, elautomáticamente
lo elimina "recogedor de
(tarde o temprano) de la memoria.
public final float
Norma(Complejo c) {
Descargado de: http://technologycompartida.blogspot.com
Página 28
Descargado de: http://technologycompartida.blogspot.com
return
} (float)Math.sqrt(c.x*c.x+
Aquí estamos usando otra c.y*c.y);
clase, Math, que nos permite realizar
varias operaciones
dispone matemáticas.
de las constantes E y Esta clase
PI, y los métodos:
abs(x)
acos(x)
valor
asin(x)absoluto
arco coseno
atan(x)
arco seno
atan2(x,y) componente angular de
arco
ceil(x)
la tangente
representación polar de x,y
cos(x) m
exp(x)
enor entero mayor que x
coseno
floor(x) mayor
eIEEEremainder(x,y)
entero
x menor que x resto de la división
x/y
log(x) según el estándar IEEE 754
max(x,y) el
min(x,y)
mayor
logaritmo de xnatural
ey el
pow(x,y)
menor de x e y
random() número
xy
rint(x)
aleatorio entre 0 y 1 entero más
cercano a x (devuelve unentero
round(x) doble)más cercano a x
sin(x)
(devuelve un entero o un long)
sqrt(x)
seno
tan(x)
raíz cuadrada
Algunos de estos métodos disparan excepciones, como sqrt o
tangente
veremos
log cómo se
de números usan
negativos. Más adelante
las excepciones.
Otra clase que hemos estado usando mucho es la PrintStream,
a la que pertenece el método println. En
System.out.pri
out es un atributo de la clase ntln(...)
System, del
tipo (clase) PrintStream:
public final class System
{extends Object
//
public static
Fields
PrintStream err;
public static
InputStream in;
public static
PrintStream out;
//
Methods
.........
}
....
Veremos otras bibliotecas (para
entrada/salida, gráficos, etc) muy pronto.
Página 29
Descargado de: http://technologycompartida.blogspot.com
Java a través de
la ventana
Para hacer algo un poco más divertido, vamos a empezar a
trabajar
contiene con
todolaun
biblioteca
grupo dejava.awt, que es
objetos para la quecon
trabajar
ventanas y sus contenidos: botones, listas, etc.
Nuestra primera
ventana
En Java, la clase Window (descendiente de Container), en la
biblioteca"peladas",
ventanas java.awt, espermite
decir,implementar
sin bordes ni menús. Son la base para
up, diálogos,
cualquier tipoetc.). El otro descendiente
de ventanas (normales, pop- de Container, Panel, es
más
que unasencillo aún y sirve
aplicación comodentro
incorpore espacio para
suyo otros
La interface(incluyendo
elementos Java dirigeotros
tantopaneles).
a uno como a otro todos los
(en seguida
eventos veremosmouse
de teclado, cómo y foco que los afecten
usarlaestos
De claseeventos).
Window descienden Dialog (para implementar
diálogos) yyaFrame,
completa: que esyuna
tiene borde menú,ventana algo los
así como más
El siguiente
botones ejemplo
de cerrar, crea una ventana
maximizar, etc. que no hace nada pero
contiene varios
directamente elementos;
(desde se puede
la ventana DOS usaro Unix con java Ejemplo7) o
Si
comobienapplet
los elementos
dentro deno disparan
una página ninguna
HTML. acción, se pueden
editar
utilizarelcontexto dentro
toda de los cuadros
su funcionalidad de ejemplo,
(por
texto o presionar el botón).
// grabar como
// compilar con "javac
"Ejemplo7.java"
import
Ejemplo7.java"
java.awt.*;
public class Ejemplo7
extends
boolean Frame {
inAnApplet = true;
public static void
Ejemplo7
main(String window
args[]) { =
new Ejemplo7();
window.inAnApplet
window.setTitle("Eje
= false;
mplo");
window.pac
k();
window.sho
}w();
public
Ejemplo7() Panel{ panelAlto =
new Panel();
panelAlto.add("West", new
Label("Cartel", Label.CENTER));
panelAlto.add("East", new
add("North",
TextArea("Area de texto", 5, 20));
panelAlto);
Panel panelBajo =
panelBajo.add(new
new Panel();
TextField("Campo de Texto"));
panelBajo.add(new
Button("Botón"));
add("South",pa
nelBajo);
}
public boolean
if (ev.id == ev) {
handleEvent(Event
Event.WINDOW_DESTROY)
if
{
(inAnApplet) {
Página 30
Descargado de: http://technologycompartida.blogspot.com
dispose();
}
else {
System.exit(0);
}
} return
super.handleEvent(ev
);
}
Un poco de
detalle
La clase desciende de Frame (o sea que será una ventana con
Vamos a usar el
borde, aunque noflag inAnApplet
le vamos a ponerpara saber si se arrancó como
menú).
applet
cerrarlao en
como aplicación standalone (hay que
manera
diferente en cada caso)
public class Ejemplo7
boolean
extends Frame {
Si se llama como
inAnApplet = true;aplicación standalone, lo primero que se ejecuta
es main(...);
una instanciaendeeste caso la (ejecutando
Ejemplo7 aplicación crea
el constructor
Ejemplo7()
applet, a través
y llama a tresdemétodos
new), define
de que no es un
• setTitle
la "abuela" window:que define cuál va a ser el
• pack
título que que
aparece en la ventana
dimensiona los elementos que
•componen
show quela ventana a su tamaño preferido
muestra la ventana
public static void
main(String
Ejemplo7args[]) { =
window
new Ejemplo7();
window.inAnApplet
window.setTitle("Eje
= false;
mplo");
window.pac
k();
window.sho
}
w();
Ojo! No confundir el objeto (instancia)
Si se carga
window concomo applet,
la clase entonces se ejecuta el constructor
Window!
Ejemplo7() como en el caso anterior:
public
Ejemplo7() Panel panelAlto =
{ new Panel();
panelAlto.add("West", new
panelAlto.add("East", new
Label("Cartel", Label.CENTER));
add("North",
TextArea("Area de texto", 5, 20));
panelAlto);
Panel panelBajo =
panelBajo.add(new
new Panel();
TextField("Campo de Texto"));
panelBajo.add(new
add("South",pa
Button("Botón"));
nelBajo);
}
Este constructor define dos paneles que forman el contenido de la
con un par
ventana de componentes
(panelAlto y los pone
y panelBajo), dentro de la ventana
los llena
(recordar
Para verloquemásEjemplo7
claro, se es una
crea el ventana!).
panel (o
espacio para contener objetos) con:
Panel panelAlto =
new Panel();
Se agregan componentes al
panel con el método add:
Descargado de: http://technologycompartida.blogspot.com
Página 31
Descargado de: http://technologycompartida.blogspot.com
panelAlto.add("West", new
panelAlto.add("East", new
Label("Cartel", Label.CENTER));
TextArea("Area de texto", 5, 20));
Página 32
Descargado de: http://technologycompartida.blogspot.com
Página 33
Descargado de: http://technologycompartida.blogspot.com
Una ventana
con
(aunque vida
Antes que nada, vamos a crear una página HTML para cargar
también
nuestra clase la podremos
Ejemplo8, ejecutar
que será en forma standalone
un applet
con "java Ejemplo8"), por ejemplo:
<!-- Archivo Ejemplo8.htm -
<HTM
HTML de ejemplo -->
L>
<HEA
<TITLE>Ejemplo 8 - Ventana
D>
</HEA
de datos</TITLE>
D>
<BOD
Y>
Aquí se tiene que abrir una
<applet
ventana code="Ejemplo8.class"
de entrada de datos
width=170 height=150>
</appl
</BOD
et>
</HT
Y>
ML>
Nuestro applet será muy sencillo, ya que utilizará clases que
sólo creará
iremos una ventana
definiendo que
en este capítulo; por empezar
definiremos en la clase Ventana8:
// Archivo:
// Compilar con "javac
Ejemplo8.java
Ejemplo8.java"
import
import
java.awt.*;
java.applet.*;
public class Ejemplo8
extends Applet {
public static void main (String arg[]) { // para
poderVentana8("Ejemplo
new llamarla con "java Ejemplo8"
}Standalone", true);
Página 34
Descargado de: http://technologycompartida.blogspot.com
void
// aquí pondremos un
ActualizaBoto
n() { método que servirá
// para actualizar el botón de
// ya quede
compra elpasajes,
texto del mismo
//
sevez que secada
actualiza selecciona una
} ciudad o se cambia la fecha
void
Activar() // y aquí un método para
{ // dicho se
cuando botón, que se supone
presione
//
queuna
vabase de datos y
a consultar
abrir una ventana
Descargado de: http://technologycompartida.blogspot.com
Página 35
Descargado de: http://technologycompartida.blogspot.com
// para
}vendernos el
}pasaje
// y la mostramos!
Preparando
listas
Ahora vamos a empezar a crear otros objetos para ir
completando
listas de nuestra aplicación. Comencemos con las
Para eso, vamos a crear un objeto descendiente de Panel que
ciudades.
simplemente ycontenga
predefinidas un títulouna
quelista
digade ciudades ciudad de",
"Seleccione
También
y a continuación "salida" o "llegada".
agregaremos un
import
método
java.awt.*;
class SelecPueblo
private
extends Panel {
ListlistaPueblos
;SelecPueblo (String
setLayout (new {
salidaOllegada)
BorderLayout (20,20));
// armamos el título, que
StringBuffer titulo = new
va a ser un Label:
StringBuffer();
titulo.append("Seleccion
e ciudad de ");
titulo.append(salid
titulo.appen
aOllegada);
d(": ");
add("North", new
Label(titulo.toString()));
// armamos la lista de ciudades,
que va a ser un
listaPueblos List:
= new
List (4, false);
Descargado de: http://technologycompartida.blogspot.com
Página 36
Descargado de: http://technologycompartida.blogspot.com
listaPueblos.addItem("B
uenos Aires");
listaPueblos.addItem
listaPueblos.addIte
("La Plata");
m("Azul");
listaPueblos.addIte
listaPueblos.addItem
m("Rosario");
listaPueblos.addItem("
("Cordoba");
Bahía Blanca");
add("South",
listaPueblos);
}
public String
return
getDescription() {
}listaPueblos.getSelecte
}dItem();
Página 37
Descargado de: http://technologycompartida.blogspot.com
Agregando
fechas
Otro panel más nos servirá para
seleccionar o entrar la fecha:
import
java.util.*;
import
java.awt.*;
class DiaPartida
extends Panel {
private
TextFieldelDia;
private Buttonhoy;
private Buttondiasiguiente;
DiaPartid
setLayout
a() { (new
GridLayout
elDia = new (4,1));
TextField();
elDia.setText(G
hoy = new
etHoy());
Button ("Hoy");
diasiguiente = new
add
Button (new Label
("Mañana");
add
("Día salida: "));
(elDia);
add
(hoy);
add
}(diasiguient
e);
private String
Date d = new
GetHoy() {
Date();
int dia =
d.getDate();
int mes =
int ano =
d.getMonth();
d.getYear();
return
}dia+"/"+mes+"/"+
ano;
private String
GetManana()
Date d = new {
int dia =
Date();
d.getDate();
int mes =
int ano =
d.getMonth();
dia =
d.getYear();
dia++;
switch
(mes) {
case
(1): case
(3):
case
case
(5):
case
(7):
(8):
case (10): if
(dia>31) { dia =
1; mes++
} ;
brea
case (12): if k;
(dia>31) { dia =
mes = 1;
1; ano++;
}
Página 38
Descargado de: http://technologycompartida.blogspot.com
break;
case
(4): case
(6):
case
case (11): if
(9):
(dia>30) { dia =
mes+ 1;
+; }
break;
default: if (dia>28) { // ojo, hay que
corregir para bisiestos! dia =
mes+ 1;
+; }
}
return
dia+"/"+mes+"/"+
}
ano;
public String
getDescription() {
return
}elDia.getText(
);
public boolean
if (e.target (Event e) {
handleEvent
elDia.setText(G
== hoy)
etHoy());
if (e.target ==
diasiguiente)
elDia.setText(Get
return
Manana());
}super.handleEven
t(e);
}
Página 39
Descargado de: http://technologycompartida.blogspot.com
Otra manera sería armar un array con los días de cada mes,
corregir los
bisiestos, días de febrero
y comparar contrapara
estelos años
array en lugar de usar un switch.
La ideacon
String siempre
la fechaes la
delmisma: devolver un
Notar algo interesante: como estas clases se cargan y ejecutan en
día siguiente.
la del clientecliente,
máquina y no laladel servidor
fecha (que puede
que aparece es ser diferente
depende la hora y el lugar del mundo en que estén
ambas
El método getDescription es público y se usa para acceder a la
máquinas).
fecha
clases;que se ha ingresado
simplemente desde
devuelve el las demás del
contenido
campo elDia, de clase TextField.
Aquí hemos desarrollado también el
método handleEvent:
public boolean
if (e.target (Event e) {
handleEvent
== hoy)
elDia.setText(G
etHoy());
if (e.target ==
elDia.setText(Get
diasiguiente)
Manana());
return
}super.handleEven
t(e);
En caso de alguna acción sobre uno de los botones, el método
setTextde
campo (detexto
la clase
elDiaTextField) pone en el
el valor del
día actual
Notar que osólo
el siguiente.
hemos considerado que haya algún evento y no un
método va a actuar
tipo de evento por ejemplo
en particular; tanto al presionar
en realidad el el mouse sobre
moles
el botón como al soltarlo. Pero esto no nos
super.handleEvent se encarga de otros eventos dirigidos al panel,
ta.
como ladeentrada
campo texto de datos por teclado al
por ejemplo.
Juntando todo
hasta aquívamos a reunir las piezas que tenemos hasta ahora
Bueno, ahora
Ventana8
agregandopara estosver cómo queda
métodos a nuestra clase
la ventana completa:
class Ventana8 extends Frame
{
SelecPueblocs;
// hija de Frame
SelecPueblocl;
DiaPartidadp;
// ciudad de salida
// ciudad de llegada
buttonok;
// día de salida
booleanenApplet; // para indicar si
es un applet
// botón o no de pasajes
de compra
Ventana8 (String titulo, boolean
super(titulo);
enApplet)
this.enApplet
{ =
enApplet;
// llama
dp = newal de Frame
add
DiaPartida();
// un constructor
// guardamos
("West",
cs esto
= new SelecPueblo("SALIDA"); //
dp);
// DIA DEDE
CIUDAD
add SALIDA
SALIDA
cl = new
("Center",
add
SelecPueblo("LLEGADA");
cs);
("East",
ok = new Button("Viaje:
cl);
add("Sout
// CIUDAD
de ? a ? el ?/?/?");
DE LLEGADA
h",ok);
pack();
show();
}// dimensionamos la ventana
// y la mostramos!
Página 40
Descargado de: http://technologycompartida.blogspot.com
Completando la
ventana
Vamos a empezar por completar nuestro método
medida que seleccionemos
ActualizaBoton, las el texto del botón ok a
que modificará
ciudades y la fecha:
void
ActualizaBoto
StringBuffer b = new
n()if{(cs.getDescription()
StringBuffer("Viaje: != null)
de ");
b.append(cs.getDescription());
else
b.append("?")
if (cl.getDescription() != null)
;b.append("
b.append(cl.getDescription());
a "); else
b.append("?")
;b.append("
if (dp.getDescription() != null)
b.append(dp.getDescription());
el ");
else
b.append("?/?/?
}
ok.setLabel(b.toS
");
tring());
Nuestro método comienza por crear un StringBuffer con las
palabras• "Viaje:
la ciudaddede ", partida, llamandoel al
y va agregando método
resto:
• el texto de cs (ciudad de salida)
getDescription
•constante " a "de llegada, llamando al método
la ciudad
•getDescription
el texto de cl (ciudad de llegada)
•constante " elseleccionada,
la fecha " llamando al método
Si engetDescription
cualquier casode dp (día
recibe un de partida)
string nulo, pone un
signo
El método de pregunta
setLabel,(o sobre
?/?/? para la fecha).
el objeto ok de tipo Label,
modifica la nos
Realmente "etiqueta"
devuelven del botón.
null los métodos que
Veam
llamamos si no hay selección hecha?
os:
class SelecPueblo
extends Panel {
private
ListlistaPueblos
..................
;
public
.......... String
getDescription() {
return
}listaPueblos.getSelecte
}dItem();
Página 41
Descargado de: http://technologycompartida.blogspot.com
Página 42
Descargado de: http://technologycompartida.blogspot.com
e.target=
this;
}
if (e.target ==
diasiguiente) {
elDia.setText(Get
e.target=
Manana());
}
this;
if (e.target ==
elDia)
e.target= {
}
this;
return
}super.handleEven
t(e);
Esto no anda como esperaríamos! El campo de
texto es
Esto noporque
se comporta muydependiente
el código bien... de la plataforma
procesa los eventos
handleEvent, de mouse
pero procesa los antes de llamar a
de teclado
Lo que significa
después de llamarque, en el caso del campo de texto, handleEvent
a handleEvent.
antes
(y porde lo tanto ActualizaBotón) se llama
modificar
Para el esto, deberíamos procesar nosotros las teclas
corregir
texto! que(lo
verificar
presionadas se que
presiona
podríamos aprovechar para
una tecla válida).
Cuidado! En futuras versiones de Java podría implementarse el
mismo
lo tantocomportamiento
tendríamos que para el mouse, y por
Para colmo,
repensar sólo los eventos que la plataforma envía llegan a
la estrategia.
movimiento de mouse
Java; por ejemplo, Motifdentro de uneventos
no envía campo dede texto... lo que
significa
de eventos. queSólo
nunca podríamos capturar ese tipo
el componente
Para
Canvas simplificar,
pasa todos sólo
losactualizaremos
eventos. el texto del botón
cuando se presiona Enter (Event.key=10):
if ((e.target ==
elDia)&&(e.id==Event.KEY_PRE
if (e.key==10)
}SS)) { e.target=this;
Página 43
Descargado de: http://technologycompartida.blogspot.com
public boolean
if ((e.id ==
handleEvent(Event e) {
Event.WINDOW_DESTROY)||(e.tar
get==r_ok))
Descargado de: http://technologycompartida.blogspot.com
Página 44
Descargado de: http://technologycompartida.blogspot.com
Página 45
Descargado de: http://technologycompartida.blogspot.com
Un paréntesis de
Entrada/Salida
En Java hay muchas clases para leer y escribir archivos (u otros
biblioteca
dispositivos de E/S). Están reunidos en la
java.io.
Vamos a empezar como siempre con un pequeño ejemplo
necesario
funcional ycamino de lasnos meteremos en el
en seguida
excepciones...
Primera
Lectura
// archivo: Ejemplo9.java - compilar con
"javac Ejemplo9.java", etc. etc.
import
java.io.*;
public class
Ejemplo9
public { void main(String args[]) throws
static
FileInputStreamfptr;
FileNotFoundException,IOException {
DataInputStrea
mf;
Stringlinea = null;
fptr = new
FileInputStream("Ejemplo9.
f = new
java");
do
DataInputStream(f
{linea
ptr); =
f.readLine();
if (linea!=null)
}System.out.println(linea)
while (linea
fptr.clo
!=
; null);
se();
}
}
Página 46
Descargado de: http://technologycompartida.blogspot.com
fptr = new
FileInputStream("Ejemplo9.
do
{njava");
=
fptr.read(
if (n!=-1)
); while
}System.out.print((char
)n);
fptr.clo
(n!=-1);
}
se();
}
Página 47
Descargado de: http://technologycompartida.blogspot.com
try
{fptr = new
fFileInputStream(args[0]
= new
DataInputStream(f
);
do
ptr); =
{linea
if (linea!=null)
f.readLine();
System.out.println(linea)
} while (linea
; null);
fptr.clo
!=
}
se();
catch
System.out.println("Hey,
(FileNotFoundExcepti ese
on e) { no existe!\n");
}archivo
catch
System.out.println("Error
(IOException
}de
e) {E/S!\n");
}
}
Página 48
Descargado de: http://technologycompartida.blogspot.com
/*
// -------- Esta clase es la que en
*/
realidad hace el trabajo
class Ventana12
extends Frame {
TextAreacont
enido;
Buttoncerrar;
Ventana1
2() {
super("Ejemplo
contenido
de E/S"); = new
TextArea();
cerrar = new
Button("Cerrar");
CargarArc
add("North",co
hivo();
add("South",
ntenido);
cerrar);
pack
show
();
();
}
public boolean
if
handleEvent(Event e) {
((e.id==Event.WINDOW_DESTRO
dispos
Y)||(e.target==cerrar))
return
e();
super.handleEven
}
t(e);
void
FileInputStreamfptr;
CargarArchivo
DataInputStrea
() {
mf;
Stringlinea = null;
try
{
Página 49
Descargado de: http://technologycompartida.blogspot.com
fptr = new
fFileInputStream("Ejemplo12
= new
.java");
do
DataInputStream(f
{linea
ptr); =
if
f.readLine();
contenido.appendTex
(linea!=n
t(linea+"\n");
}ull)while (linea
!= null);
fptr.clo
}
se();
catch
contenido.appendText("Hey,
(FileNotFoundExcept ese
}archivo
ion e) { no existe!\n");
catch
(IOException
contenido.appendText("E
e) { de E/S!\n");
}rror
}
}
Página 50
Descargado de: http://technologycompartida.blogspot.com
/*
// -------- Esta clase es la que en
*/
realidad hace el trabajo
class Ventana13
extends Frame {
TextAreacont
enido;
Botones13pieV
entana;
Ventana1
3()contenido
{
super("Ejemplo = new
de pieVentana
E/S");
TextArea(); = new
Botones13();
add("North",con
add("South",pieV
tenido);
pack()
entana);
;show()
}
;
public boolean
if
handleEvent(Event e) {
((e.id==Event.WINDOW_DESTR
dispose()
OY)||(e.id==2003))
if (e.id==2001)
; if (e.id==2002)
CargarArchivo(pieVentana.toStrin
g());
GrabarArchivo(pieVentana.toStrin
g());
Descargado de: http://technologycompartida.blogspot.com
Página 51
Descargado de: http://technologycompartida.blogspot.com
return
super.handleEvent(
}
e);
void
CargarArchivo(String
FileInputStreamf
nombre) {
DataInputStrea
ptr;Stringlinea = null;
mf;
try
contenido.setTe
{xt("");
fptr = new
f = new
FileInputStream(nombre)
DataInputStream(fptr
;
do { linea =
);
f.readLine();
if (linea!=null)
} while
contenido.appendText(linea+"\n")
(linea
; != null);
fptr.close(
} catch
);
(FileNotFoundExceptio
new Error13("El
n e) { archivo no existe!");
} catch
(IOException e) Error13("Error
new
{ leyendo archivo!");
}}
void
GrabarArchivo(String
FileOutputStream
nombre) {
fptr;try
DataOutputStre
{amf;fptr = new
FileOutputStream(nombre
f = new
);
DataOutputStream(fpt
r);
f.writeBytes(contenido.
fptr.close(
getText());
);
} catch
(IOException new
e) Error13("Error
{ grabando archivo!");
}}
}
/*
// -------- Esta es para los botones y
el nombre del archivo
*/
class Botones13
extends Panel {
TextFieldfn
Buttoncarga
ame;
r;
Buttongraba
r;
Buttoncerra
r;
setLayout(new
Botones1
3()fname = new
GridLayout(1,4));
{
TextField();
Página 52
Descargado de: http://technologycompartida.blogspot.com
cargar = new
Button("Cargar");
grabar = new
cerrar = new
Button("Grabar");
Button("Cerrar");
add(new
Label("Archivo:"));
add(fnam
add(carg
e);
ar);
add(grab
ar);
}
add(cerra
r);
public boolean
if
handleEvent(Event e) {
((e.id==Event.ACTION_EVENT)&
e.id=20
&(e.target==cargar))
if 01;
e.id=20
((e.id==Event.ACTION_EVENT)&&
02;
(e.target==grabar))
if
e.id=20
((e.id==Event.ACTION_EVENT)&
return 03;
&(e.target==cerrar))
super.handleEvent(
}
e);
public String
toString()
return {
}
fname.getText()
};
/*
// ------- Para mostrar
los errores...
*/
class Error13
extends Frame {
add("Center",new
Error13(String
error) { Label(error));
add("South", new
pack(
Button("Ok"));
show(
);
} );
public boolean
handleEvent(Event e) {
return
dispose(
);}
super.handleEvent(
}e);
Página 53
Descargado de: http://technologycompartida.blogspot.com
Volviendo
al
para
vamos AWT
Para aprender un poquito más sobre la biblioteca gráfica (AWT),
usar
a modificar nuestro último programa
menús.
Vamos a volver a poner todo el código (que ampliamos para usar
las
como diferencias
applet o aplicación local) marcando
más notables:
/*
// ----- Archivo:
*/
Ejemplo14.java
import
java.io.*;
import
import
java.awt.*;
java.applet.*;
public class Ejemplo14
extends Applet {
public void
init() { new Ventana14(true); //
} con "true" avisamos que es applet
/*
// -------- Esta clase es la que en
*/
realidad hace el trabajo
class Ventana14
extends Frame {
booleanenApplet;
TextAreacont // para
StringnombreArchivo;
indicar
enido; si lo llamamos como applet // para
guardar el nombre del archivo abierto
MenuItemmArchivoAbrir; // ACA
ESTAN LOS ITEMS DE LOS MENUS
MenuItemmArchivoGrabar;
MenuItemmArchivoSalir;
//
MenuItemmEditCortar;
//
MenuItemmEditCopiar;
.
MenuItemmEditPegar;
//
.
//
MenuItemmEditTodo;
//
Stringclipboard;
. booleaneditado = false; // acá
.
//
indicamos si modificamos el archivo
. buffer para cortar y pegar
//
v
Ventana14(boolean
enApp) {
enApplet =
super("Ejemplo
enApp;
de E/S");
Menu menuArchivo = new
// recordamos si es=applet
mArchivoAbrir
Menu("&Archivo"); new o no
mArchivoGrabar = new
MenuItem("&Abrir...");
MenuItem("&Grabar...");
// CREAMOS LOS MENUS!!!
Descargado de: http://technologycompartida.blogspot.com
Página 54
Descargado de: http://technologycompartida.blogspot.com
mArchivoSalir = new
MenuItem("&Salir");
menuArchivo.add(mArc
hivoAbrir);
menuArchivo.add(mArchi
menuArchivo.add(new
voGrabar);
MenuItem("-"));
menuArchivo.add(mArc
hivoSalir);
Menu menuEdit = new
mEditCortar = new
Menu("&Edit");
MenuItem("Cor&tar");
mEditCopiar = new
MenuItem("&Copiar");
mEditPegar = new
mEditTodo = new
MenuItem("&Pegar");
MenuItem("&Seleccionar todo");
menuEdit.add(mEdit
Cortar);
menuEdit.add(mEdit
menuEdit.add(mEdit
Copiar);
menuEdit.add(new
Pegar);
MenuItem("-"));
menuEdit.add(mEdi
MenuBar barraMenu =
tTodo);
new MenuBar();
barraMenu.add(menu
barraMenu.add(men
Archivo);
uEdit);
setMenuBar(barra
Menu);
contenido = new
TextArea();
add("Center",con
tenido);
// solo pongo una ventana de texto
pack()
;show()
; clipboard = new
String("");
mEditPegar.disable();
mArchivoGrabar.disable();
//}clipboard vacío,
// nada para pegar,
//public
nada para grabar
boolean
handleEvent(Event
if e) {
if (editado) System.out.println("Pedir
((e.id==Event.WINDOW_DESTROY)||(e.tar
confirmación!\n");
get==mArchivoSalir)) { // si se
ir sin quiere
grabar! // debería
if confirmar
(enApplet)
else
dispose();
System.exit(
} if (e.target==mArchivoAbrir)
0);
if (e.target==mArchivoGrabar)
CargarArchivo();
GrabarArchivo();
if
// acá proceso clipboard
(e.target==mEditCo =
selecciones
// de {menú mEditPegar.en
rtar) contenido.getSelectedText
();
able();
contenido.replaceText("",contenido.getSelectionStart(),
editado=t
contenido.getSelectionEnd());
rue;
} if
clipboard =
(e.target==mEditCo
contenido.getSelectedText
piar) {
mEditPegar.en
();
able();
} if
contenido.replaceText("",contenido.getSelectionStart(),
(e.target==mEditPe
gar) { contenido.getSelectionEnd());
Página 55
Descargado de: http://technologycompartida.blogspot.com
contenido.insertText(clipboard,contenid
editado=t
o.getSelectionStart());
rue;
} if (e.target==mEditTodo)
if
contenido.selectAll();
((e.id==Event.KEY_PRESS)&&(e.target==con
mArchivoGrabar.enable
tenido))
return editado=true;
(editado);
super.handleEvent(
}
e);
void
CargarArchivo(
FileInputStreamf
){
DataInputStrea
ptr; Stringlinea = null;
mf;if (editado)
System.out.println("Pedir
FileDialog fd = new
confirmación!\n");
FileDialog(this,"Abrir...",FileDialog.LOAD);
siste
fd.show();
nombreArchivo
// elijo
ma! archivo =
fd.getFile();
try
// usando el diálogo estándar del
{ fptr = new
f = new
FileInputStream(nombreArchi
DataInputStream(fptr
vo);contenido.setText(""); // vacío la
);
ventana antes de cargar nuevo archivo
do { linea =
f.readLine();
if (linea!=null)
contenido.appendText(linea+"\n")
} while
;
(linea != null);
fptr.close(
editado=false;
);
catch nuevo -> no editado
}// archivo
(FileNotFoundExceptio
new Error14("El
n e) { archivo no existe!");
} catch
(IOException e) Error14("Error
new
{ leyendo archivo!");
} catch
(NullPointerExceptio
;
n e) {
}}
void
GrabarArchivo(
FileOutputStream
){
fptr;
FileDialog fd = new
DataOutputStre
FileDialog(this,"Grabar...",FileDialog.SAVE);
amf;fd.setFile(nombreArchivo); //
usando el diálogo estándar del sistema!
// grabo archivo =
nombreArchivo
fd.show(
try
fd.getFile();
);
{ fptr = new
FileOutputStream(nombreArch
f = new
ivo);
DataOutputStream(fpt
f.writeBytes(contenido.
r);
getText());
fptr.close(
editado=false;
);
}
// recién grabado -> no editado
Descargado de: http://technologycompartida.blogspot.com
Página 56
Descargado de: http://technologycompartida.blogspot.com
catch
(IOException e) Error14("Error
new
{ grabando archivo!");
} catch
;
(NullPointerExceptio
n e) {
}}
}
/*
// ------- Para mostrar
*/
los errores...
class Error14
extends Frame {
add("Center",new
Error14(String
error) { add("South", new
Label(error));
Button("Ok"));
pack(
);
show(
} );
public boolean
handleEvent(Event e) {
dispose(
return
);}
super.handleEvent(
}e);
Menú a la
Javalo primero que vamos a
Bueno,
La
ver barra de menús.
son los menú está compuesta por menúes, que a su vez están
compuestos
ser menúes).dePorítems (que la
ejemplo pueden también
barra de
menú la declaramos con:
MenuBar barraMenu =
new MenuBar();
y le agregamos los menúes Archivo y Edit (que
habremos creado previamente) con:
barraMenu.add(me
nuArchivo);
barraMenu.add(
menuEdit);
Finalmente la declaramos como EL
menú de la ventana (Frame):
setMenuBar(bar
raMenu);
Cada uno de los menús los
declaramos previamente:
Menu menuArchivo = new
...
Menu("&Archivo");
Menu menuEdit = new
Menu("&Edit");
Noten que el "&" no se visualiza, sino que la letra que le sigue
aparece
que subrayada:
se pueda Archivo,
seleccionar Edit.tanto
el menú Esto permite
con el mouse como
subray
con la tecla alt- o meta-, seguida de la tecla
ada.
Descargado de: http://technologycompartida.blogspot.com
Página 57
Descargado de: http://technologycompartida.blogspot.com
Página 58
Descargado de: http://technologycompartida.blogspot.com
Página 59
Descargado de: http://technologycompartida.blogspot.com
DibuJ
ava
Además de los componentes estándar (botones, listas, etc.), hay
permite implementar
un componente cualquier
para dibujo otroque
"libre" tiponos
de control: la clase
Canvas. Típicamente
corresponde a una zona se rectangular
usa para dibujar, y
La clasedeenuna
dentro sí no hace prácticamente nada; el programador debe
ventana.
AWT
definirleuna
envía todos de
subclase losCanvas
eventosade la mouse
que el y teclado.
Redefiniendo
keyDown, los métodos
keyUp, gotFocus,
mouseEnter, lostFocus,
mouseExit, mouseMove,
mouseDrag, mouseDown
programador puede hacer ylomouseUp, el
que se le ocurra dentro de ese
generar un applet
rectángulo. Vamosdonde
a hacerhabrá
uso una
de unzona rectangular
Canvas para dentro
de la que, haciendo
moviéndolo click
sin soltar con el dibujaremos
el botón, mouse y
Esto nos permitirá
un rectángulo ver cómo usar un Canvas para dibujar,
dinámicamente.
capturar
redibujar,eventos,
pero ya etc. El borde tiembla un poco al
veremos
cómo evitar eso.
Canvas en
acción
Primero vamos a poner, como ya se está haciendo costumbre,
el códigodesde
cargarse del applet (Recordar
una página htmlque
paradebe
verlo! Aquí no creamos
aplicación standalone)
ninguna ventana y luego verlo como
y no podremos
intentaremos explicar cómo funciona.
import
import
java.awt.*;
java.applet.Appl
et;
public class Ejemplo15
publicApplet {
extends
void init() { Label label = new Label("Pique y
arrastre conzonaDib
miCanvas el mouse!");
=
zonaDib.resize(new
new miCanvas();
Dimension
add("North", (200,200));
label);
add("Center",
resize(300,
zonaDib);
250);
}
class miCanvas
extends Canvas {
Rectangle
rectActual;
public boolean
mouseDown(Event e, int
rectActual x, int
= new
y) { repaint
Rectangle(x, y, 0, 0);
();
return
false;
}
public boolean
mouseDrag(Event e, int x, int y)
rectActual.resize(x-
{ repaint
rectActual.x, y-rectActual.y);
();
return
false;
}
public boolean
mouseUp(Event e, int x, int y)
rectActual.resize(x-
{ repaint
rectActual.x, y-rectActual.y);
();
return
false;
Página 60
Descargado de: http://technologycompartida.blogspot.com
}
public void
paint(Graphics g) {
Dimension d
g.setColor(Co
= size();
g.drawRect(0, 0,
lor.red);
d.width-1, d.height-1);
g.setColor(Col
or.blue);
if (rectActual
!= null) { Rectangle box =
cortarRect(rectActual,
g.drawRect(box.x, d);
box.y,
} box.width-1, box.height-1);
}
Rectangle cortarRect(Rectangle
int xDimension
miRect, = areaDib) {
miRect.x;
int y =
int ancho =
miRect.y;
int alto =
miRect.width;
miRect.height;
if
(ancho < ancho
0) { =
-ancho;x = x -
ancho +if1;(x
< 0) {
ancho += x;
x = 0;
}
} if (alto
< 0) { alto
= -alto; y = y -
alto + 1;if (y
< 0) {
alto += y;
y = 0;
}
}
if ((x + ancho) >
areaDib.width)
ancho = {
areaDib.width - x;
} if ((y + alto) >
alto = {
areaDib.height)
areaDib.height - y;
}
return new
Rectangle(x, y, ancho,
}
alto);
El applet-
container
En primer lugar hemos tenido en cuenta que un Applet es un
Panel,
que en ylugar
por lo
detanto
creartambién un Container,
una ventana así
aparte simplemente le
agregamos dos componentes: un Label y un Canvas.
zonaDib.resize(new
Dimension (200,200));
Página 61
Descargado de: http://technologycompartida.blogspot.com
add("North",
label);
add("Center",
resize(300,
zonaDib);
250);
El método rezise, sobre la clase miCanvas, nos permite
redimensionar
Igualmente, el mismo
usamos al sobre
resize tamañoel deseado.
applet para darle un tamaño
ventana
adecuado.enSi
el se
appletviewer
modifica else observará
tamaño de laun comportamiento
algo extraño
relativo en cuanto yalelposicionamiento
del rectángulo cartel, pero
para simplificar esto bastará.
Nuestro Canvas
a medida
Como no vamos a tomar ninguna acción especial al crear el
canvas,elno
utiliza hemos definido
constructor el constructor (se
por defecto
Simplemente hemos redefinido algunos métodos para actuar al
de la clase Canvas).
presionar,elarrastrar
redibujar área de ydibujo
soltar(canvas)
el mouse,y para recortar el rectángulo
del espacio
dibujado que vamos con el mouse fuera
si nos
La variable
ocupa global rectActual, de la clase Rectangle, contendrá las
el canvas.
coordenadasEldel
dibujando. rectángulo
método Paint que estamos
se llama automáticamente cada vez
llamamos explícitamente
que es necesario redibujaralel componente, o si
método repaint():
public void
paint(GraphicsDimension
g) { d
g.setColor(Co
= size();
lor.red);
g.drawRect(0, 0,
d.width-1, d.height-1);
g.setColor(Col
if (rectActual
or.blue);
!= null) { Rectangle box =
g.drawRect(box.x, box.y,
cortarRect(rectActual, d);
} box.width-1, box.height-1);
}
En primer lugar le asignamos a una variable d el tamaño del
canvas
un colorusando
(rojo) el
paramétodo
dibujarsize(), luegoy elegimos
un borde dibujamos un
rectángulo del tamaño del componente:
Dimension d
= size();
g.setColor(Co
lor.red);
g.drawRect(0, 0,
d.width-1, d.height-1);
Dos atributos de la clase Dimension, width y height, se han
cargado
usamos paracon el dartamaño
el del canvas y son los que
Luego,
tamaño si delserectángulo.
está dibujando un rectángulo (rectActual != null)
simplemente
hayamos lo recortamos
arrastrado el mouse (enfuera
casodel
de que
canvas)
El método y loque
dibujamos.
lo recorta a los límites del canvas, cortarRect,
rectángulo
asigna a cuatro(quevariables
se le pasaron como
las coordenadas del
parámetro miRect al llamarlo):
int x =
int y =
miRect.x;
miRect.y;
int ancho =
miRect.width;
int alto =
miRect.height;
Si el ancho (o el alto) es negativo, simplemente lo cambia de
signo
el otroyvértice
toma como coordenadaque
del rectángulo, x (y) de origen al x que se pasó
corresponderá
origen
menos de coordenadas
el ancho empieza
y más uno en cero
(recordar queyelno en uno). Si este
vértice
cero y leestá fuera
resta del canvas
al ancho (x<0),
la parte lo pone
recortada en que ancho+=x,
(notar
como x es negativo, es en realidad una resta).
Página 62
Descargado de: http://technologycompartida.blogspot.com
if (ancho
< 0) { ancho =
-ancho;x = x -
ancho +if1;(x
< 0) {
ancho += x;
x = 0;
}
}
Si nos vamos del área de dibujo por la derecha (o por abajo),
exceso de modo
simplemente que llegue al
le recortamos hasta el borde
ancho (alto) del
el área de dibujo
(que también hemos pasado al método como
paráme
tro):
if ((x + ancho) >
ancho = {
areaDib.width)
}areaDib.width - x;
Sólo nos quedan por ver los métodos
que responden
Cuando al mouse.
presionamos el mouse dentro del canvas, comenzamos la
creación
alto cero de
queuncomienza
nuevo rectángulo deen
en el punto ancho y
que hemos
presionado el mouse, y redibujamos el canvas:
public boolean
rectActual
mouseDown(Event = new
e, int x, int
y) { Rectangle(x, y, 0, 0);
repaint
();
return
false;
}
Al mover el mouse, redimensionamos el rectángulo con ancho x
menos de
origen el origen
dibujo),deydibujo (y alto y menos el
repintamos:
public boolean
rectActual.resize(x-
mouseDrag(Event e, int x, int y)
{ rectActual.x, y-rectActual.y);
repaint
return
();
false;
}
Finalmente, al soltar el mouse,
redimensionamos como antes y redibujamos:
public boolean
mouseUp(Event e, int x, int y)
rectActual.resize(x-
{ repaint
rectActual.x, y-rectActual.y);
();
return
false;
}
Como no se toma ninguna medida para guardar el rectángulo
dibujado,
rectActualala crear uno nuevo
un nuevo (reasignando
rectángulo),
el anterior se pierde.
Página 63
Descargado de: http://technologycompartida.blogspot.com
DibuJa
va
borren II
Vamos a retocar un poquito nuestro ejemplo15 para que no se
dibujar unorectángulos
los nuevo. Aprenderemos algo sobre la clase
cuando queremos
Vector, perteneciente al paquete java.util.
Vectores en
acción
Los vectores nos permiten hacer arreglos de cualquier tipo de
elemento del vector,individualmente
objeto, y referirnos aunque para utilizarlos (debido a que para
a cualquier
tendremos
java el vector quecontiene
decirle qué clasegenéricos)
objetos de objeto es mediante un "cast".
Vamos a ver(ex
Ejemplo16 cómo quedan nuestras clases
Ejemplo15) y miCanvas:
import
import
java.awt.*;
java.util.*;
import
java.applet.Appl
public class Ejemplo16
et;
extends
publicApplet {
................
void init() (esta{ parte no
cambia)................
}
class miCanvas
VectorCanvas
extends v = new
{ Vector(); //
inicializamos con tamaño indeterminado // Java se encarga de manejar la
memoria necesaria!
public boolean
v.addElement(
mouseDown(Event e, int x,new
int Rectangle(x, y, 0, 0)
y) { );
repaint
();
return
// nuevo elemento!
false;
}
public boolean
Rectangle
mouseDrag(Event e, intr =x, int y)
{ (Rectangle)v.lastElement();
r.resize( x - r.x, y - r.y
);
repaint
// cast: v son rectángulos
return
();
// (creé r sólo por claridad)
false;
}
public boolean
Rectangle
mouseUp(Event r =int y)
e, int x,
{ (Rectangle)v.lastElement();
r.resize( x - r.x, y - r.y
);
repaint
// cast: v son rectángulos
return
();
// (creé r sólo por claridad)
false;
}
public void
int g) {
paint(Graphics
i;
Dimension d
g.setColor(Co
= size();
// contador de rectángulos
lor.red);
g.drawRect(0, 0,
g.setColor(Col
d.width-1, d.height-1);
if (v.size()
or.blue);
> 0)
Página 64
Descargado de: http://technologycompartida.blogspot.com
for (i=0;
i<v.size(); i++) { Rectangle box = cortarRect(
(Rectangle)v.elementAt(
g.drawRect(box.x, box.y,i ), d);
box.width-1, box.height-1);
}
}........................ (el resto no
cambia)
} ........................
Página 65
Descargado de: http://technologycompartida.blogspot.com
Página 66
Descargado de: http://technologycompartida.blogspot.com
Threadanima
dor;
ImageimgBu
ff; double
Graphicsgraf
ang
Buff;= 0.0;
public
void init() { resize(new
Dimension
} (200,200));
public void
start() { if (animador == null) animador
= new Thread(this);
animador.s
tart();
}
Página 67
Descargado de: http://technologycompartida.blogspot.com
public
void run() { while
(Thread.currentThread()
repaint ==
animador) {();
try
{ Thread.sleep
} (100);
catch
break
(InterruptedExceptio
}n e) { ;
}
}
public void
int g) {
update(Graphics
i;
int dx,
dy;
Dimension d
= size();
if (grafBuff
== null) { imgBuff =
createImage(d.width,
grafBuff =
} d.height);
imgBuff.getGraphics(
grafBuff.setColor(get );
Background());
grafBuff.fillRect(0, 0,
d.width, d.height);
grafBuff.setColor(
grafBuff.drawRect(0, 0,
Color.red);
d.width-1, d.height-1);
grafBuff.setColor(
dx = (int)(50 *
Color.blue);
Math.abs(Math.cos(ang)))
dy = (int)(50 *
;ang = ang
Math.abs(Math.sin(ang)))
; 0.1;
if
+
(ang>2*Math.PI)
grafBuff.drawRect(100-dx,
ang = 0.0;
100-dy, 2*dx, 2*dy);
g.drawImage(imgBuf
f, 0, 0, this);
}
Página 68
Descargado de: http://technologycompartida.blogspot.com
Java en
hebras
La clase anterior usamos, en el último ejemplo, un concepto al
los
que vamos a dedicar ahora nuestra atención:
threads.
La traducción literal de thread es hilo o hebra, y se utiliza
concepto
también parade threads
referirse enallos ambientes
hilo y sistemas
de un discurso. El operativos es un
poco complejo
entender: de explicar perodel
independientemente sencillo
sistemadeelegido, puede pensarse
que un thread
ejecución de unes algo así como el lugar de
En la mayoría de los programas que hemos visto, hemos usado
programa.
comienza y su ejecución
un solo thread; es decir que sigue
un un camino
programa
único:escomo
Java un monólogo.
multithreading. Esto significa algo así como que tiene
ejecutar
capacidad muchos threads
de diálogo, en paralelo,
y más como si tratáramos de
aún: puede
una conversación
No confundir aquímúltiple y simultánea.
multithreading con la capacidad de
ejecutar varios
posibilidad, programas
pero también un a lamismo
vez. Esta es una puede utilizar
programa
simultánea
varios threads ("caminos de ejecución"?)
Esto, por supuesto, depende fundamentalmente de la
mente.
capacidad del sistema
multithreading, y por estooperativo
Java nopara soportar
puede ejecutarse (al menos
soport
en forma completa) en sistemas que no lo
en.
El uso de threads nos permite, por ejemplo, ejecutar
simultáneamente
ellos; o, también, varios
que unprogramas
programa,que interactúen
mientras entre
por ejemplo
serie de cálculos
actualiza sin tener
la pantalla, que
simultáneamente realice una
Una
hacerforma
esperarsencilla de verlo es imaginar que tenemos un grupo
el usuario.
de microprocesadores
cada uno, un solo thread; queypueden
nosotrosejecutar,
asignamos programas (o
Además,
partes de podemos
programas) imaginar que esos
a cada uno microprocesadores
de ellos.
comparten
de una memoria
lo que surgirá una serie común y recursos
de problemas comunes, a
importantes
tener en cuenta cuando se usan threads.
Los pasos
básicos
Hay tres cosas a tener en cuenta para
usar •threads en unque
La clase programa:
queremos asignar a un thread debe
• Debemos crear
implementar la interface Runnable.
una variable (instancia) del tipo Thread,
que nos permitirán acceder
thread. En los applets, en y manejar
el métodoel start() simplemente
crearemos
pondremos a el thread (y, posiblemente, lo
• Y por último tenemos que crear un método run() que
ejecutar)
es elpropiamente
que ejecuta el código del programa
dicho.
La interface Runnable,
simplemente definida como:
public interface
java.lang.Runnable
{
//
public abstract
Methods
}void run();
le asegura al compilador que nuestra clase (la que utilizará el
Vamos a verejecutarse)
thread para un par de ejemplos,
dispone deprimero
métodounarun().
aplicación standalone y luego un applet.
Reunión de
amigos
El siguiente ejemplo (Ejemplo19.java) usa threads para activar
simultáneamente tres los
clase, que comparten objetos de ladel
recursos misma
procesador
peleándose para escribir a la pantalla.
class
Ejemplo19
{ public static void
main(String argv[])
Página 69
Descargado de: http://technologycompartida.blogspot.com
throws
InterruptedExcepti
Thread Juan = new Thread
on { Thread Luis = new Thread
(new Amigo("Juan"));
(new Amigo("Luis"));
Thread Nora = new Thread
Juan.star
(new Amigo("Nora"));
Luis.star
t();
t();
Nora.sta
rt();
Juan.joi
Luis.joi
n();
n();
Nora.joi
} n();
class Amigo
implements Runnable
{ String
mensaje;
public
Amigo(String
mensaje = "Hola, soy "+nombre+" y
}nombre) { este es mi mensaje ";
public void
run() { for (int i=1;
i<6; i++) { String msg =
mensaje+i;
System.out.print
} ln(msg);
}
Página 70
Descargado de: http://technologycompartida.blogspot.com
Página 71
Descargado de: http://technologycompartida.blogspot.com
public void
start() { Thread A = new Thread
Thread B = new Thread
(new Counter(tfa));
(new Counter(tfb));
Thread C = new Thread
A.start
(new Counter(tfc));
();
B.start
();
Página 72
Descargado de: http://technologycompartida.blogspot.com
C.start
} ();
class Counter
implements Runnable
{ TextField
String
texto;
s;
public
texto =
Counter(TextField
}txtf) { txtf;
public void
run() { for (int i=0;
i<1000; i++)texto.setText(s.va
{
} lueOf(i));
}
Página 73
Descargado de: http://technologycompartida.blogspot.com
La liebre y la tortuga (y
el guepardo)
Java dispone de un mecanismo de prioridades para los threads, de
amodo
un thread que asignar
de poder a otro. Típicamente se CPU
más tiempo de asigna una prioridad de 1
asetPriority,
10 (10 es la mayor
como prioridad) mediante
en el
ejemplo que sigue:
public class
Ejemplo21 {
static
static
Animaltortuga;
static
Animalliebre;
Animalguepardo;
public static void
throws argv[])
main(String
InterruptedException
{ tortuga = new
liebre
Animal(2, = new
"T");
Animal(3,="L");
guepardo new
Animal(4, "G");
tortuga.st
liebre.sta
art();
rt();
guepardo.s
tortuga.jo
tart();
liebre.joi
in();
n();
guepardo.j
oin();
}
class Animal
String
extends Thread {
nombre;
public Animal(int prioridad,
this.nombre
String nombre) { =
nombre;
setPriority(pri
} oridad);
public void
run() { for (int x = 0; x <
30; x++) { System.out.print(
nombre );
yield(
} );
System.out.println("\nLle
} ga "+nombre );
}
Página 74
Descargado de: http://technologycompartida.blogspot.com
Página 75
Descargado de: http://technologycompartida.blogspot.com
System.out.pri
} ntln(e);
}
}
class Contador
extends Thread {
Sumado
r s;
Contador (Sumador
sumador) { s = sumador; // le
} asigno un sumador a usar
public void
run() { s.sumar(); //
} ejecuto la suma
}
class
Sumador int a =
{ 0;
public void
sumar() { for (int i=0;
i<10000; i++if )( {(i % 5000) == 0 ) { // "%"
da el resto de la división:
System.out.println(a); //
} imprimo cada 5000
a +=
} 1;
System.out.println(a);
}
} // imprimo el final
Página 76
Descargado de: http://technologycompartida.blogspot.com
Con esto, sólo a uno de los dos threads se les permite ejecutar
s.sumar() por
supuesto, vez,thread
el otro y se evita
queda elesperando,
problema. Por
por lo que más vale no
el programa
utilizar se puede
esto con métodosponer muy largos ya que
lento
La o aún bloquearse.
salida
ahora será:
C:\java\curso>java
Ejemplo22
0
5000
<
10000
< primer thread
10000
<
15000
20000
(
( segundo thread
(Lo mismo logramos (y en forma más correcta) declarando
como synchronized al método sumar():
public synchronized void
Esto es mejor porque{ la
sumar() clase que llama a sumar() no necesita
.............
saber
de que al
llamar tiene que sincronizar
método, el objeto
y si otros objetos (enantes
otros threads) lo
llaman, no necesitamos preocuparnos.
Más
sincronizaci
Otra manera de sincronizar el acceso de los threads a los
métodos, es lograr que
entre sí, esperando uno éstos
hasta se pongan
que de acuerdo
otro realizó alguna tarea
ón ParaCuando
notify().
dada. esto seun thread
usan llama a wait()
los métodos wait()en
y un método de un
objeto llame
thread dado, aqueda detenido
notify() hasta que otro
en algún
método
Por del mismo
ejemplo, vamosobjeto.
a suponer cuatro empleados que se
de que éste con
encuentran los su jefe y lo saludan, pero sólo luego
salude primero.
public class
Ejemplo23 {
public static void
main(String Saludo
argv[]) hola
{ = new
Personal pablo = new
Saludo();
Personal luis = "Pablo",
Personal(hola, new false);
Personal(hola,
Personal andrea"Luis",
= new false);
Personal(hola,
Personal pedro "Andrea",
= new false);
Personal jefe ="Pedro",
Personal(hola, new false);
Personal(hola, "JEFE", true);
pablo.sta
luis.star
rt();
andrea.sta
t();
rt();
pedro.sta
rt();
jefe.star
try
t();
{ pablo.joi
luis.join
n();
andrea.joi
();
n();
pedro.joi
n();
jefe.join
} ();
catch
(Exception e) System.out.pri
}{ ntln(e);
}
}
Página 77
Descargado de: http://technologycompartida.blogspot.com
class
Saludo { synchronized void
try
esperarJefe(String empleado) {
{ wait(
);
System.out.println(empleado+">
} Buenos dias jefe!");
catch
(InterruptedExceptio
System.out.println(e.
n e) { toString());
}
}
synchronized void
saludoJefe()System.out.println("JEFE>
{
notifyAl
Buenos dias!");
} l();
}
class Personal
String
extends Thread {
Saludo
nombre;
saludo;
boolean
esJefe;
Personal (Saludo s, String
n, boolean j)nombre
{
saludo
= n; =
esJefe
s;
} = j;
public void
run() { System.out.println("("+no
if
mbre+" llega)");
(esJefe) saludo.saludo
else Jefe();
saludo.esperarJefe
} (nombre);
}
Página 78
Descargado de: http://technologycompartida.blogspot.com
Pedro> Buenos
dias jefe! Buenos
Andrea>
Pablo> Buenos
dias jefe!
dias jefe!
Aquí hice trampa: a veces, el jefe llega y saluda antes que alguno
se
de queda esperandopor
los empleados, indefinidamente. Prueben de modificar las
lo que ese empleado
clases para que
estén todos los el jefe no salude hasta que no
empleados presentes...
Página 79
Descargado de: http://technologycompartida.blogspot.com
Capítulo XV -
propu
Solución al problema
esto
En forma muy sencilla, modificando sólo la clase Personal,
llegue
podemosantes que un el problema de que el jefe
solucionar
empleado:
class Personal
...........
extends Thread {
static int
.....
llegaron = 0;
...........
.....
public void
run() { System.out.println("("+no
if
mbre+" llega)");
(esJefe) while (llegaron
{ < 4) { System.out.println("(Espe
} rando...)");
saludo.saludo
} Jefe();
else
{ synchronized(
this) { llegaron+
} +;
saludo.esperarJefe
} (nombre);
}
}
Página 80
Descargado de: http://technologycompartida.blogspot.com
andrea.joi
n();
jefe.join
} ();
catch
System.out.pri
(Exception e)
}{ ntln(e);
}
}
class
Saludo { synchronized void
esperarJefe(String
try empleado) {
{ wait(
System.out.println(empleado+">
);
} Buenos dias jefe!");
catch
System.out.println(e.
(InterruptedExceptio
n e) { toString());
}
}
synchronized void
saludoJefe()System.out.println("JEFE>
{
Buenos dias!");
notifyAl
} l();
}
class Personal
extends Thread {
String
nombre;
Saludo
boolean
saludo;
esJefe;
static int
int
llegaron = 0;
numEmp
;Personal (Saludo s,
String n) { esJefe =
nombre
false;
= n; =
saludo
} s;
Personal (Saludo s,
String n, int esJefe
x) { =
nombre
true;
= n; =
saludo
numEmp
s;
} = x;
public void
run() { System.out.println("("+no
mbre+" llega)");
if
(esJefe) while (llegaron < numEmp) {
{ saludo.saludo
System.out.println("(Esperando...)"); }
Jefe();
Página 81
Descargado de: http://technologycompartida.blogspot.com
}
else
{ synchronized(this) {
llegaron++; }
saludo.esperarJefe
} (nombre);
}
}
Página 82
Descargado de: http://technologycompartida.blogspot.com
Multim
edia!
Java permite cargar y visualizar archivos GIF o JPEG de imagen y
8000Hz de (solamente en mono, 8 bits,
AU de audio
muestreo).
Para el caso del sonido, un archivo de audio se carga mediante un
método
objeto degetAudioClip(URL,
la clase AudioClip,archivo),
medianteseelejecuta con los
métodos
Noten play()
esto! o loop()
Si bien y seque
dijimos detiene con stop().
un applet no puede acceder al
disco de la
archivos delmáquina cliente,
server desde SI puede
donde leer Por lo tanto, pasándole
se cargó.
el applet,
URL depodemosla máquina leerdesde
cualquier
donde tipo
se de
cargó
La
archivoformaa través
más segura
de la de
red.indicar dicho URL es mediante el método
getDocumentBase(),
adecua que nos da el URL
Por ejemplo, puedo cargar y reproducir
do.
audio con sólo dos líneas:
......
AudioClip sonido = getAudioClip(
..
sonido.pl
getDocumentBase(), "sonido.au" );
ay();
.......
..
Por otra parte, una foto puede cargarse mediante un
getImage(URL,
objeto de clase Image archivo). Luegoellamétodo
mediante mostramos en un objeto
dibujo)
Graphicsmediante drawImage(imagen,
correspondiente al applet (o alx, área
y, observador).
de
Observador
interface es un objeto que
ImageObserver; los implementa
applets, por ladescender de
Component
la implementan. (queTípicamente,
implementa dicha interface)
la imagen también
se visualiza
en el método paint(...) del applet:
.........
....
algunMetod
.......
o(...) {
Image imagen =
...
getImage(getDocumentBase(),
.......
}"imagen.gif");
...
........
... public void
paint(Graphics g.drawImage(imagen,
g) { xOffset, yOffset,
} this);
..........
..... // "this" representa al applet
El problema con las imágenes es asegurarse que fue cargada
antes de mostrarla.
MediaTracker Para debería
(también eso se utiliza
servir un
para los archivos de
implemen
audio, pero en esta versión aún no está
Mediante addImage( imagen, grupo) se agrega una imagen a la
tado).
lista del
para MediaTracker,
esperar y hay(como
que sea cargada métodos waitForAll() o
waitForID(grupo)),
correctamente (comopara verificar que se haya cargado
checkAll(),
checkID(grupo),
El siguiente applet isErrorAny()...), etcétera.para cargar una
utiliza estos conceptos
imagen y un archivo de audio y mostrarlos:
//
import Ejem
import
java.awt.*;
plo24.java
java.applet.*;
public class Ejemplo24
extends Applet {
MediaTrackersupervis
StringarchImagen, archAudio;
or;
Imageimagen;
Página 83
Descargado de: http://technologycompartida.blogspot.com
AudioClipa
udio;
Labeltitulo;
Panelcuadro;
public void
init() { supervisor = new
MediaTracker(this);
archImagen =
"javacero.gif";
archAudio =
"tada.au";
// carga
imagen =
supervisor.addImage
getImage(getDocumentBase(),
(imagen,0);
archImagen);
try
{ supervisor.waitForID(0);
se
cargue } // espero que
catch
System.out.println("Error
(InterruptedExceptio
}n e) { cargando imagen!");
showStatus("Imagen
cargada");
// carga
audio =
sonido
getAudioClip(getDocumentBase(),
// arma
archAudio);
layout
setLayout(new
titulo = new
BorderLayout());
Label(archImagen);
setFont(new Font("helvetica",
add("South",
Font.BOLD, 18));
} titulo);
public void
start() { repaint
();
audio.pla
} y();
public void
paint(Graphics
if g) {
g.setColor(Colo
(supervisor.isError
Any()) { r.black);
g.fillRect(0, 0,
return
size().width, size().height);
} ;
g.drawImage(imagen
} , 0, 0, this);
}
Página 84
Descargado de: http://technologycompartida.blogspot.com
<applet code="Ejemplo24.class"
width=150 height=200>
</appl
</BOD
et>
Y>
</HT
ML>
Parametrizando
un applet
Vamos a aprovechar este ejemplo, modificándolo un poco para
cargar,
indicarlemediante
desde elparámetros.
HTML qué Nuestro
archivos debe
HTML modificado será:
<HTM
L>
<HEA
<TITLE>Ejemplo 24 -
D>
</HEA
Multimedia</TITLE>
D>
<BOD
Y>
<applet code="Ejemplo24.class"
width=150
<param height=200>
name="imagen"
<param name="sonido"
value="javacero.gif">
</appl
value="tada.au">
et>
</BOD
Y>
</HT
ML>
Para leer estos parámetros desde el applet, usamos el método
getParameter(nombreParámetro),
podemos modificar nuestro appletasí que
simplemente
modificando un par de líneas:
archImagen =
getParameter("imagen");
archAudio =
getParameter("sonido");
Voilá! Pueden probar de cargar este applet en
De esta manera podemos pasar cualquier valor como parámetro
http://www.amarillas.com/rock/java/Ejemplo24.htm.
Y esto
para unesapplet,
todo haciéndolo más flexible.
por hoy!
Con esto hemos visto una gran parte de lo que es Java. No
hemos
pero profundizado
hemos demasiado
hecho ejemplos que en cada punto,
Sin embargo,
funcionan parahemos dejado
ilustrar cada un punto importante y muy fuerte de
cosa.
Java, que es el
aplicaciones y, de las comunicaciones
especialmente, entre
el uso de sockets y la
programación de aplicaciones cliente-servidor.
Página 85
Descargado de: http://technologycompartida.blogspot.com
Paseando por
la Red
Es muy sencillo acceder a archivos en la red utilizando Java. El
interfases
paquete a
java.net dispone de varias clases e
tal
En efecto.
primer lugar, la clase URL nos permite definir un recurso
en la red de varias maneras, por ejemplo:
URL url1 = new URL
URL url2 = new URL ("http",
("http://www.rockar.com.ar/index.html
"www.rockar.com.ar",
"); "sbits.htm");
Página 86
Descargado de: http://technologycompartida.blogspot.com
System.out.println("El host no
} existe o no responde");
catch
(Exception e)
e.printStack
{} Trace();
}
}
Los
Sockets
Los sockets (zócalos, referido a los enchufes de conexión de
cables) sonamecanismos
programas través de una dered
comunicación
TCP/IP. De entre
hecho, al establecer
sockets: los sockets
una conexión realizan
via Internet la interfase
estamos entre la
utilizando
Dichos mecanismos
aplicación pueden
y el protocolo tener lugar dentro de la misma
TCP/IP.
máquina o a través
cliente-servidor: de unaunred.
cuando Se usan
cliente y unen forma establecen una
servidor
conexión, lo para
proporciona hacenesto
a través de un socket. Java
las clases
ServerSocket
Los y Socket.
sockets tienen asociado un port (puerto). En general, las
puerto particular
conexiones (por ejemplo,
via internet pueden en establecer un
se especifica porque ya hay definidos puertos
http://www.rockar.com.ar:80/index.html por defecto
el puerto para
es el 80). Esto
distintos
casi 79
ftp, nunca protocolos:
para 20Algunos
finger, etc. para ftp-data, 21pueden
servers para definir otros
disponibles para establecer
puertos, e inclusive pueden utilizarse puertos
conexiones especiales.
Justamente, una de las formas de crear un objeto de la clase
URL permite especificar también el puerto:
URL url3 = new URL ("http",
"www.rockar.com.ar", 80,"sbits.htm");
Página 87
Descargado de: http://technologycompartida.blogspot.com
cliente =
numClient
System.out.println("Llega el
servidor.accept();
e++;
cliente "+numCliente);
PrintStream ps = new
ps.println("Usted es mi
PrintStream(cliente.getOutputStream())
cliente
; "+numCliente);
}cliente.clos
while
} e();
(true);
catch
(Exception e)
e.printStack
{} Trace();
}
}
Página 88
Descargado de: http://technologycompartida.blogspot.com
public class
Ejemplo26b {
public static void
main(String argv[]) {
InetAddressdireccion
intnumCliente = 0;
;Socketservid
or;
try
{ direccion =
servidor = new
InetAddress.getLocalHost();
Socket(direccion, 5000);
DataInputStrea
// direccion
m new
datos = local
System.out.println(
DataInputStream(servidor.getIn
datos.readLine()
servidor.cl );
putStream());
} ose();
catch
(Exception e)
e.printStack
{} Trace();
}
}
Página 89
Descargado de: http://technologycompartida.blogspot.com
Página 90