Manual Curso de Java Desde Cero
Manual Curso de Java Desde Cero
Indice:
01 Qué es Java
. Lenguaje de Objetos
. Qué es un objeto?
. Independiente de la plataforma
. Algunas características…
. El Java Development Kit
. Empecemos de una vez!
. Javascript
. Al fin… Java!
03 Estructura de clases
. Declaración de la clase . Public, final o abstract . Extends .
Implements . Interface . El cuerpo de la clase . Declaración de
atributos . Private, protected o public . Static y final . Transient y
volatile . Los tipos de Java . Y los métodos… . El resto de la
declaración
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/index.htm (1 of 3)08/11/2003
12:40:21
. if…[else] . Switch…case…brake…default . While . Do…while
. For . Break y continue . Otras...
06 Hagamos algo...
. La clase Complejo
. Algo sobre los
métodos
09 Completando la ventana
. Un poquito de
actividad . Y para
terminar...
10 Un paréntesis de Entrada/Salida
. Primera Lectura .
Capturando
excepciones . Los
applets y los archivos
. Nuestro modesto
"Editor"
11 Volviendo al AWT
. Menú a la
Java .
Diálogos
12 DibuJava
. Canvas en
acción . El
applet-
container
13 DibuJava II
. Vectores en acción . Flicker molesto! .
Animate!
14 Java en hebras
. Los pasos básicos . Reunión de amigos .
Creando Threads . Y los applets...?
16 Multimedia!
. Parametrizando un applet
FIN
Java desde Cero
Con ésta comienzo una serie de notas sobre Java,
especialmente para aquellos que quieren comenzar a
conocerlo y usarlo. Esto se originó en un interés que surgió en
algunos de los suscriptores del mailing list de desarrolladores
de web, y que pongo a disposición también del de
webmasters.
Qué es Java
Java es un lenguaje originalmente desarrollado por un grupo de
ingenieros de Sun, utilizado por Netscape posteriormente como
base para Javascript. Si bien su uso se destaca en el Web, sirve
para crear todo tipo de aplicaciones (locales, intranet o internet).
Java es un lenguaje:
de objetos
independiente de la plataforma
robusto
gestiona la memoria automáticamente
no permite el uso de técnicas de programación inadecuadas
multithreading
cliente-servidor
mecanismos de seguridad incorporados
herramientas de documentación incorporadas
Lenguaje de Objetos
Por qué puse "de" objetos y no "orientado a" objetos? Para
destacar que, al contrario de otros lenguajes como C++, no es
un lenguaje modificado para poder trabajar con objetos sino
que es un lenguaje creado para trabajar con objetos desde cero.
De hecho, TODO lo que hay en Java son objetos.
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA1.HTM (1 of
8)08/11/2003 12:40:23
Qué es un objeto?
encapsulamiento
herencia
Un ejemplo simple
n
o
n
e
w
B
u
t
t
o
n
(
"
N
o
"
)
;
a
d
d
(
"
N
o
r
t
h
"
,
c
o
m
e
n
t
a
r
i
o
)
;
a
d
d
(
"
E
a
s
t
"
,
s
i
)
;
a
d
d
(
"
W
e
s
t
"
,
n
o
)
;
Esta clase no está muy completa así, pero da una idea… Es una
clase heredera de la clase Frame (un tipo de ventana) que tiene
un par de botones y un texto. Contiene dos atributos ("si" y
"no"), que son dos objetos del tipo Button, y un único método
llamado Muestra (igual que la clase, por lo que es lo que se
llama un constructor).
Independiente de la plataforma
Esto es casi del todo cierto…
Algunas características…
Entre las características que nombramos nos referimos a la
robustez. Justamente por la forma en que está
● http://java.sun.com/aboutJava/index.html
http://java.sun.com/java.sun.com/products/JDK/1.0.2/index.
html
Una cosa muy importante: para que todo ande bien aceitado,
agreguen:
Javascript
No vamos a detenernos mucho en Javascript, por las
limitaciones antedichas; si les interesa podemos dedicarnos un
poco a este lenguaje en el futuro. Por ahora, sólo un ejemplo
sencillo:
Calculadora en Javascript:
<
H
T
M
L
>
<
H
E
A
D
>
<
S
C
R
I
P
T
L
A
N
G
U
A
J
E
=
"
J
a
v
a
s
c
r
i
p
t
"
>
f
u
n
c
t
i
o
n
c
a
l
c
u
l
a
(
f
o
r
m
)
{
i
f
(
c
o
n
f
i
r
m
(
"
¿
E
s
t
á
s
e
g
u
r
o
?
"
)
)
f
o
r
m
.
r
e
s
u
l
t
a
d
o
.
v
a
l
u
e
e
v
a
l
(
f
o
r
m
.
e
x
p
r
.
v
a
l
u
e
)
e
l
s
e
a
l
e
r
t
(
"
V
u
e
l
v
a
a
i
n
t
e
n
t
a
r
l
o
.
.
.
"
)
<
/
S
C
R
I
P
T
>
<
/
H
E
A
D
>
<
B
O
D
Y
>
<FORM>
<BR>
Resultado:
<
B
R
>
<
/
F
O
R
M
>
<
/
B
O
D
Y
>
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA1.HTM (6 of
8)08/11/2003 12:40:23
</HTML>
● http://www.c2.net/~andreww/javascript/ incluyendo
Al fin… Java!
Bueno, no del todo… Les dejo un ejemplo para ir probando, y en
browser
Para que se den una idea, los números enteros, por ejemplo, son
"instancias" de una clase no redefinible, Integer, que desciende
de la clase Number e implementa los siguientes atributos y
métodos:
// Atributos
public final static int MAX_VALUE;
public final static int MIN_VALUE;
Mucho, no?
[
l
i
s
t
a
_
d
e
_
m
é
t
o
d
o
s
]
} // cierre de }
Veamos un ejemplo:
// Atributos
int cnt; // Un
entero para
guardar
el valor actual
// Constructor // Un método
constructor… public Contador()
{ // …lleva el mismo nombre
que la clase cnt = 0; //
Simplemente, inicializa (1) }
// Métodos
public int incCuenta() { // Un método para
new Contador()
// igual al
nombre del archivo!
// entero para asignarle el valor del contador e imprimirlo
// aunque en realidad no me hace falta.
static int n;
// y una variable tipo Contador para instanciar el objeto…
static Contador laCuenta;
Ejemplo1"
// NOTA: main debe ser public & static.
public static void main ( String args[] ) {
System.out.println ("Cuenta…
"); // Imprimo el título laCuenta
= new Contador(); // Creo una
instancia del Contador
System.out.println
(laCuenta.getCuenta()); // 0 -
Imprimo el valor
actual (cero!)
n = laCuenta.incCuenta(); // 1 - Asignación e
incremento
System.out.println (n); // Ahora imprimo n
laCuenta.incCuenta(); // 2 - Lo incremento (no
uso el valor…
System.out.println (laCuenta.getCuenta()); // …de retorno) y lo imprimo
System.out.println (laCuenta.incCuenta()); // 3 - Ahora todo en un
paso!
}
// Constructor…
public Ejemplo2 () {
laCuenta = new Contador();
}
}
}
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA2.HTM (5 of 8)08/11/2003
12:40:24
Ahora es necesario crear una página HTML para poder
visualizarlo. Para esto, crear y luego cargar el archivo
ejemplo2.htm con un browser que soporte Java (o bien
ejecutar en la ventana DOS: "appletviewer ejemplo2.htm"):
<HTML>
<HEAD>
<TITLE>Ejemplo 2 -
Applet Contador</TITLE>
</HEAD>
<BODY>
<applet
code="Ejemplo2.class"
width=170 height=150>
</applet>
</BODY>
</HTML>
Además:
//
Archivo
:
Ejemplo
3.java
//
Compil
ar con:
javac
Ejemplo
3.java
import
java.ap
plet.*;
import
java.aw
t.*;
import
java.io.
*;
public
class
Ejemplo
3
extends
Applet
{
static
int n;
static
Contad
or
laCuent
a;
public Ejemplo3 () {
laCuenta = new Contador();
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA2.HTM (6 of
8)08/11/2003 12:40:24
}
<applet
code="Ejemplo3.class"
width=170 height=150>
</applet>
Notar que conviene probar el applet con el appletviewer
("appletviewer ejemplo3.htm"), ya que éste indica en la
ventana DOS si hay algún error durante la ejecución. Los
browsers dejan pasar muchos errores, simplemente
suprimiendo la salida a pantalla del código erróneo.
Estructura de clases
//
Implementació
n de un
contador
sencillo
public class
Contador {
// Atributos
int cnt;
// Constructor
public
Contador() {
cnt = 0;
}
// Métodos
public int
incCuenta() {
cnt++;
return cnt;
}
public int
getCuenta() {
return cnt;
}
}
Declaración de la clase
La clase se declara mediante la línea public class Contador. En
el caso más general, la declaración de una clase puede contener
los siguientes elementos:
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA3.HTM (1 of
9)08/11/2003 12:40:27
Como se ve, lo único obligatorio es class y el nombre de la
clase. Las interfases son un caso de clase particular que
veremos más adelante.
Public, final o abstract
Extends
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA3.HTM (2 of
9)08/11/2003 12:40:27
métodos (con las mismas listas de parámetros) de dichas
interfases.
Interface
El cuerpo de la clase
El cuerpo de la clase, encerrado entre { y }, es la lista de
atributos (variables) y métodos (funciones) que constituyen la
clase.
Declaración de atributos
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA3.HTM (3 of
9)08/11/2003 12:40:27
Finalmente, los atributos miembros de la clase pueden ser
atributos de clase o atributos de instancia; se dice que son
atributos de clase si se usa la palabra clave static: en ese caso la
variable es única para todas las instancias (objetos) de la clase
(ocupa un único lugar en memoria). Si no se usa static, el
sistema crea un lugar nuevo para esa variable con cada instancia
(o sea que es independiente para cada objeto).
N: no puede acceder
Static y final
Como ya se vio, static sirve para definir un atributo como de
clase, o sea único para todos los objetos de
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA3.HTM (4 of
9)08/11/2003 12:40:27
la clase.
Transient y volatile
byte 8-bit
complemento a 2
Entero de un byte
short 16-bit
complemento a 2 Entero
corto
int 32-bit
complemento a 2 Entero
long 64-bit
complemento a 2 Entero
largo
float 32-bit
IEEE 754 Punto flotante,
precisión simple
double 64-bit
IEEE 754 Punto flotante,
precisión doble
char 16-bit
caracter Unicode Un
caracter
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA3.HTM (5 of 9)08/11/2003
12:40:27
int días[ ] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
char letras[ ] = { 'E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D' };
Y los métodos…
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA3.HTM (6 of
9)08/11/2003 12:40:27
Los métodos, como las clases, tienen una declaración y un
cuerpo.
public int
AumentarCue
nta(int
cantidad) {
cnt = cnt +
cantidad;
return cnt;
}
Lo siguiente no sirve:
void
Get
Mou
sePo
s(int
x, int
y) {
x=
….;
//
esto
no
sirve
!
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA3.HTM (7 of
9)08/11/2003 12:40:27
y = ….; // esto tampoco!
m.x = ……;
m.y
=…
…;
}
El resto de la declaración
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA3.HTM (8 of
9)08/11/2003 12:40:27
threads.
//
Implementaci
ón de un
contador
sencillo
public class
Contador {
………………..
public int
incCuenta() {
cnt++;
return cnt;
}
…………………
}
dentro de la clase
de instancia, de otras clases
de clase, de cualquier clase
Estructuras de control
Excepciones (try, catch, que veremos más adelante)
float precio;
Contador laCuenta;
Sólo que aquí no se declaran private, public, etc., sino que las
variables definidas dentro del método sólo
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA4.HTM (1 of
7)08/11/2003 12:40:28 Java desde Cero
Asignaciones a variables
Se asigna un valor a una variable mediante el signo =: Variable =
Constante | Expresión ; Ej: suma = suma + 1; precio = 1.05 *
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA4.HTM (2 of
7)08/11/2003 12:40:28 Java desde Cero
c
i
o
m
Operaciones matemáticas
Hay varios tipos de operadores:
expresión.
estructuras de control
Binarios: + - * / % …..etc.
= 17
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA4.HTM (3 of
7)08/11/2003 12:40:28
Precedencia de operadores en Java
Multiplicativos * / %
Aditivos + -
Igualdad == !=
Condicional ? :
Algunos ejemplos:
convertir(valor, base);
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA4.HTM (4 of
7)08/11/2003 12:40:28
new permite crear una instancia de un objeto: new Contador();
Llamadas a métodos
Se llama a un método de la misma clase simplemente con el
nombre del método y los parámetros entre paréntesis, como se
ve, entre otros, en el ejemplo en negrita:
f
l
o
a
t
x
;
p
r
i
v
a
t
e
f
l
o
a
t
y
;
/
/
c
o
n
s
t
r
u
c
t
o
r
:
public
Co
mp
lej
o(fl
oat
rx,
flo
at
iy)
{
x
=
rx;
y
=
iy;
/
/
m
é
t
o
d
o
s
:
p
u
b
l
i
c
f
l
o
a
t
N
o
r
m
a
(
)
return
(float)Math.sqrt(x*
x+y*y);
}
// obligatorios
(son abstractos en
Number):
r
eturn
(dou
ble)N
orma
( );
}
publi
c
float
float
Value
() {
r
e
t
u
r
n
N
o
r
m
a
(
)
;
}
p
u
b
l
i
c
i
n
t
i
n
t
V
a
l
u
e
(
)
r
e
t
u
r
n
(
i
n
t
)
N
o
r
m
a
(
)
;
}
p
u
b
l
i
c
l
o
n
g
l
o
n
g
V
a
l
u
e
(
)
{
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA4.HTM (5 of
7)08/11/2003 12:40:28
r
e
t
u
r
n
(
l
o
n
g
)
N
o
r
m
a
(
)
;
}
p
u
b
l
i
c
S
t
r
i
n
g
t
o
S
t
r
i
n
g
(
)
r
e
t
u
r
n
"
(
"
+
x
+
"
)
+
i
(
"
+
y
+
"
)
"
;
Nombre_del_Objeto<punto>Nombre_del_Método(pará
metros)
/
/
A
r
c
h
i
v
o
:
E
j
e
m
p
l
o
4
.
j
a
v
a
/
/
C
o
m
p
i
l
a
r
c
o
n
:
j
a
v
a
c
E
j
e
m
p
l
o
4
.
j
a
v
a
/
/
E
j
e
c
u
t
a
r
c
o
n
:
j
a
v
a
E
j
e
m
p
l
o
4
i
m
p
o
r
t
j
a
v
a
.
i
o
.
*
;
return (float)Math.sqrt(x*x+y*y);
Nombre_de_la_Clase<punto>Nombre_del_Método(parámetros)
if…[else]
La más común de todas, permite ejecutar una instrucción (o
secuencia de instrucciones) si se da una condición dada (o,
mediante la cláusula else, ejecutar otra secuencia en caso
contrario).
if
(expresión_boolea
na)
instrucción_si_true
;
[else
instrucción_si_fals
e;]
o bien:
if (expresión_booleana) {
instrucciones_si_true;
else {
instrucciones_si_false;
Por ejemplo:
public
f
i
n
a
l
S
t
r
i
n
g
t
o
S
t
r
i
n
g
(
)
i
f
(
y
<
0
)
r
e
t
u
r
n
x
+
"
-
i
"
+
(
-
y
)
;
e
l
s
e
r
e
t
u
r
n
+
x
+
"
+
i
"
+
y
;
Switch…case…brake…default
Permite ejecutar una serie de operaciones para el caso de que
una variable tenga un valor entero dado. La ejecución saltea
todos los case hasta que encuentra uno con el valor de la
variable, y ejecuta desde allí hasta el final del case o hasta que
encuentre un break, en cuyo caso salta al final del case. El
default permite poner una serie de instrucciones que se ejecutan
en caso de que la igualdad no se de para ninguno de los case.
switch (expresión_entera) {
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA5.HTM (1 of
5)08/11/2003 12:40:29
case (valor1): instrucciones_1;
[break;]
case (valor2):
instrucciones_2;
[break;]
…..
case (valorN): instrucciones_N;
[break;]
default: instrucciones_por_defecto;
}
Por ejemplo:
switch (mes) {
case (2): if (bisiesto()) dias=29;
else dias=31;
break;
case (4):
case (6):
case (9):
case (11): dias = 30;
break;
While
Permite ejecutar un grupo de instrucciones mientras se cumpla
una condición dada:
while (expresión_booleana) {
instrucciones…
}
Por ejemplo:
while ( linea != null) {
linea = archivo.LeerLinea();
System.out.println(linea);
}
Do…while
Similar al anterior, sólo que la condición se evalúa al final del
ciclo y no al principio:
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA5.HTM (2 of 5)08/11/2003
12:40:29
do {
i
n
s
t
r
u
c
c
i
o
n
e
s
…
w
h
i
l
e
(
e
x
p
r
e
s
i
ó
n
_
b
o
o
l
e
a
n
a
)
;
Por ejemplo:
do {
linea =
archivo.LeerLinea()
;
if (linea != null)
System.out.println(
linea);
} while (linea !=
null);
For
También para ejecutar en forma repetida una serie de
instrucciones; es un poco más complejo:
f
or
(i
ns
tr
uc
ci
on
es
_i
ni
ci
al
es
;
co
nd
ici
ón
_b
oo
le
an
a;
in
str
uc
ci
on
_r
ep
eti
tiv
a_
x)
{
in
str
uc
ci
on
es
…
}
+){
instrucciones…
}
Por ejemplo:
for ( i=0;
i
<
1
0
;
i
+
+
S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(
)
;
for
(
i
=
1
0
;
I
>
0
;
I
-
-
S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(
)
;
}
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA5.HTM (3 of
5)08/11/2003 12:40:29
Break y continue
Estas instrucciones permiten saltar al final de una ejecución
repetitiva (break) o al principio de la misma (continue).
i
m
p
o
r
t
j
a
v
a
.
i
o
.
*
;
c
l
a
s
s
B
u
c
l
e
s
p
u
b
l
i
c
s
t
a
t
i
c
v
o
i
d
m
a
i
n
(
S
t
r
i
n
g
a
r
g
v
[
]
)
i
n
t
i
=
0
;
La salida es:
antes 1
después 1
antes 2
antes 3
Otras...
Hay otras instrucciones que controlan el flujo del programa:
La clase Complejo
// grabar como
Complejo.java
// compilar con "javac
Complejo.java"
public final class Complejo
extends Number {
// atributos:
private float x;
private float y;
// constructores:
public Complejo() {
x = 0;
y = 0;
// métodos:
// Norma
public final float Norma() {
return (float)Math.sqrt(x*x+y*y);
}
public final float Norma(Complejo c) {
return
(float)Math.sqrt(c.x*c.x+c.y*c.y);
}
// Conjugado
public final Complejo
Conjugado() {
return r;
}
public final Complejo
Conjugado(Complejo c) {
Comp
lejo r
= new
Compl
ejo(c.x
,-c.y);
return
r;
}
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA6.HTM (1 of
8)08/11/2003 12:40:30
// obligatorios (son abstractos en Number):
return (double)Norma();
p
u
b
li
c
fi
n
a
l
i
n
t
i
n
t
V
a
l
u
e
(
)
{
r
e
t
u
r
n
(
i
n
t
)
N
o
r
m
a
(
)
;
return (long)Norma();
if (y<0)
return x+"-i"+(-y);
else
return x+"+i"+y;
// Operaciones matemáticas
floa
t x
=
c1.x
*c2.
x+c
1.y*
c2.y
;
flo
at
y =
-c1
.
x*c
2.y
+c
1.y
*c2
.x;
floa
t n
=
c2.x
*c2.
x+c
2.y*
c2.y
;
Co
mp
lejo
r =
ne
w
Co
mp
lejo
(x,
y);
return DivEscalar(r,n);
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA6.HTM (2 of
8)08/11/2003 12:40:30
Podemos hacer algunos comentarios...
// atributos:
private float x;
private float y;
// métodos:
public final float Norma()
public final float Norma(Complejo c)
public final Complejo Conjugado()
public final Complejo Conjugado(Complejo c)
v = miComplejo.Norma(); //
por
ejemplo
otroCompl
ejo =
miComplej
o.Conjugad
o();
v=
unComplejo.Norma(mi
Complejo);
otroComplejo =
unComplejo.Conjugado
(miComplejo);
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA6.HTM (3 of
8)08/11/2003 12:40:30
otroComplejo = Complejo.Norma(miComplejo); // NO SE
PUEDE!
Como todos los métodos de esta clase son final, o sea que no
puede ser redefinido. No es importante en realidad puesto que
la clase no puede tener descendientes...
miComplejo = unComplejo.Suma(comp1,comp2); //
valemiComplejo = Complejo.Suma(comp1,comp2);
// TAMBIEN VALE!
//
Archivo:
Ejemplo
5.java
//
Compila
r con:
javac
Ejemplo
5.java
//
Ejecutar
con:
java
Ejemplo
5
import
java.io.*;
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA6.HTM (4 of
8)08/11/2003 12:40:30
public class Ejemplo5 {
System.out.println("("+c1+")/4
:"+Complejo.DivEscalar(c1,4));
System.out.println("Suma :
"+Complejo.Suma(c1,c2));
System.out.println("Resta :
"+Complejo.Resta(c1,c2).toString());
System.out.println("Multip:
"+Complejo.Producto(c1,c2).toString());
System.out.println("Divis :
"+Complejo.Cociente(c1,c2).toString());
Hay varias cosas para notar: por ejemplo, que podemos declarar
c1 y c2 son dos
objetos (instancias)
de la clase
Complejo. Notar
también que no
System.out.println(c1.toString().......);
System.out.println("Suma : "+Complejo.Suma(c1,c2));
public
f
i
n
a
l
i
n
t
i
n
t
V
a
l
u
e
(
)
{
r
e
t
u
r
n
(
i
n
t
)
N
o
r
m
a
(
)
;
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA6.HTM (5 of
8)08/11/2003 12:40:30
Ya que no podemos convertir así nomás un complejo en un
entero, para implementar estos métodos hemos elegido usar
como valor de retorno la norma del complejo. En este caso, y
dado que el método Norma() devuelve un float, usamos
typecasting, es decir, lo convertimos en entero precediéndolo
con (int).
public
f
i
n
a
l
S
t
r
i
n
g
t
o
S
t
r
i
n
g
(
)
i
f
(
y
<
0
)
r
e
t
u
r
n
x
+
"
-
i
"
+
(
-
y
)
;
e
l
s
e
r
e
t
u
r
n
x
+
"
+
i
"
+
y
;
float x = c1.x*c2.x+c1.y*c2.y;
float y = -c1.x*c2.y+c1.y*c2.x;
float n = c2.x*c2.x+c2.y*c2.y;
return DivEscalar(r,n);
}
Aquí tengan en cuenta que las variables x e y, definidas
como float, no tienen nada que ver con las variables
(atributos) de la clase que están definidas al principio de la
misma, sino que son variables locales al método.
return (float)Math.sqrt(c.x*c.x+c.y*c.y);
abs(x)
valor
absolutoac
os(x) arco
coseno
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA6.HTM (6 of
8)08/11/2003 12:40:30
asin(x) arco seno
atan(x) arco tangente
atan2(x,y) componente angular de la representación polar de x,y
ceil(x) menor entero mayor que x
cos(x) coseno
exp(x) ex
floor(x) mayor entero menor que x
IEEEremainder(x,y) resto de la división x/y según el estándar IEEE 754
log(x) logaritmo natural
max(x,y) el mayor de x e y
min(x,y) el menor de x e y
pow(x,y) xy
random() número aleatorio entre 0 y 1
rint(x) entero más cercano a x (devuelve un doble)
round(x) entero más cercano a x (devuelve un entero o un
long)
sin(x) seno
sqrt(x) raíz cuadrada
tan(x) tangente
System.out.println(...)
// Fields
public static PrintStream err;
public static InputStream in;
public static PrintStream out;
// Methods
.............
}
// grabar
como
"Ejemplo
7.java"
//
compilar
con
"javac
Ejemplo7.
java"
import
java.awt.
*;
public
class
Ejem
plo7
exte
nds
Fram
e{
bool
ean
inAn
Appl
et =
true;
public Ejemplo7() {
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA7.HTM (1 of
6)08/11/2003 12:40:31
Panel panelAlto = new Panel();
panelAlto.add("West", new
Label("Cartel", Label.CENTER));
panelAlto.add("East", new
TextArea("Area de texto", 5, 20));
add("North", panelAlto);
pub
l
i
c
b
o
o
l
e
a
n
h
a
n
d
l
e
E
v
e
n
t
(
E
v
e
n
t
e
v
)
i
f
(
e
v
.
i
d
=
=
E
v
e
n
t
.
W
I
N
D
O
W
_
D
E
S
T
R
O
Y
)
i
f
(
i
n
A
n
A
p
p
l
e
t
)
{
d
i
s
p
o
s
e
(
)
;
e
l
s
e
S
y
s
t
e
m
.
e
x
i
t
(
0
)
;
}
}
return super.handleEvent(ev);
}
Un poco de detalle
public
class
Ejem
plo7
exte
nds
Fram
e{
bool
ean
inAn
Appl
et =
true;
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA7.HTM (2 of
6)08/11/2003 12:40:31
Ejemplo7 window = new Ejemplo7();
window.inAnApplet = false;
window.setTitle("Ejemplo");
window.pack();
window.show();
public Ejemplo7() {
Panel panelAlto = new Panel();
panelAlto.add("West", new
Label("Cartel", Label.CENTER));
panelAlto.add("East", new
TextArea("Area de texto", 5, 20));
add("North", panelAlto);
panelAlto.add("West", new
Label("Cartel", Label.CENTER));
panelAlto.add("East", new
TextArea("Area de texto", 5, 20));
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA7.HTM (3 of
6)08/11/2003 12:40:31
Se agregan el panel dentro de nuestro objeto con:
add("North", panelAlto);
que equivale a:
this.add("North", panelAlto);
Ejemplo7.add("North", panelAlto);
+--
Window ---
Frame ---
Ejemplo7
panelAlto.add("West", new
Label("Cartel", Label.CENTER));
..........
panelBajo.add(new
Button("Botón"));
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA7.HTM (4 of
6)08/11/2003 12:40:31
Noten que no hace falta llamar, en el caso del applet, a Pack() y
Show().
Y los eventos...
etc.
if (ev.id == Event.WINDOW_DESTROY) {
if (inAnApplet) {
dispose();
} else {
System.exit(0);
return super.handleEvent(event);
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA7.HTM (5 of
6)08/11/2003 12:40:31
Noten que cualquier otro tipo de evento deja seguir hasta return
super.handleEvent(event), que llama al método handleEvent
de la clase madre: así como el prefijo this. se refiere a un
método de la propia clase, el prefijo super. llama al método de
la clase madre (aunque esté redefinido). En este caso, la llamada
se remonta hasta Component.handleEvent, que determina el
tipo de evento y llama a uno de los métodos action, gotFocus,
lostFocus, keyDown, keyUp, mouseEnter, mouseExit,
mouseMove, mouseDrag, mouseDown o mouseUp según
sea apropiado (y devuelve true). Si ningún método es aplicable,
devuelve false.
Antes que nada, vamos a crear una página HTML para cargar
nuestra clase Ejemplo8, que será un applet (aunque también la
podremos ejecutar en forma standalone con "java Ejemplo8"),
por ejemplo:
//
Archivo:
Ejemplo8.
java
//
Compilar
con
"javac
Ejemplo8.
java"
i
m
p
o
r
t
j
a
v
a
.
a
w
t
.
*
;
i
m
p
o
r
t
j
a
v
a
.
a
p
p
l
e
t
.
*
;
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA8.HTM (1 of
10)08/11/2003 12:40:32
Con los parámetros que le pasamos a la clase Ventana8 le
indicamos el título de la ventana y si se carga como applet o no
(ya que el método de cierre varía).
import java.awt.*;
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA8.HTM (2 of
10)08/11/2003 12:40:32
Java desde Cero
pack(); show(); }
void ActualizaBoton() {
// aquí pondremos un método que servirá
// para actualizar el botón de compra de pasajes,
// ya que el texto del mismo se actualiza cada
// vez que se selecciona una ciudad o se cambia la
fecha
void Activar() {
// y aquí un método para cuando se presione
// dicho botón, que se supone que va a consultar
// una base de datos y abrir una ventana
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA8.HTM (3 of 10)08/11/2003
12:40:32
this.enApplet = enApplet; // guardamos esto
ok = new
Button("Viaje:
de ? a ? el ?/?/?");
add("South",ok);
pack(); // dimensionamos
la ventanashow(); // y la
mostramos!
Preparando listas
Ahora vamos a empezar a crear otros objetos para ir
completando nuestra aplicación. Comencemos con las listas de
ciudades.
import java.awt.*;
class
Selec
Puebl
o
exten
ds
Panel
{
priva
te
List
listaP
ueblo
s;
SelecPueb
lo (String
salidaOlle
gada) {
setLayout
(new
BorderLay
out
(20,20));
// armamos el
título, que va a
ser un Label:
StringBuffer titulo
= new
StringBuffer();
titulo.append("Sel
eccione ciudad de
");
titulo.append(salid
aOllegada);
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA8.HTM (4 of
10)08/11/2003 12:40:32
titulo.append(": ");
add("North", new
Label(titulo.toStrin
g()));
public String
getDescripti
on() {
return
listaPueblos.
getSelectedIt
em();
}
}
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA8.HTM (5 of
10)08/11/2003 12:40:32
class Ventana8 extends Frame { // hija de Frame
ok = new Button("Viaje: de ? a ? el ?
/?/?");add("South",ok);pack(); // dimensionamos la
ventanashow(); // y la mostramos!}
...........................
Agregando fechas
import java.util.*;
import java.awt.*;
DiaPartida() {
setLayout (new GridLayout (4,1));
elDia = new TextField();
elDia.setText(GetHoy());
hoy = new Button ("Hoy");
diasiguiente = new Button ("Mañana");
add (new Label ("Día salida: "));
add (elDia);
add (hoy);
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA8.HTM (6 of 10)08/11/2003
12:40:32
add (diasiguiente);
}
case (3):
case (5):
case (7):
case (8):
case (10): if (dia>31) {
dia = 1;
mes++;
}
break;
case
(12): if
(dia>31)
{
dia = 1;
mes =
1;
ano++;
}
break;
case (4):
case (6):
case (9):
case (11): if (dia>30) {
dia = 1;
mes++;
}
break;
default: if (dia>28) { // ojo, hay que corregir para bisiestos!
dia = 1;
mes++;
}
}
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA8.HTM (7 of 10)08/11/2003
12:40:32
r
e
t
u
r
n
d
i
a
+
"
/
"
+
m
e
s
+
"
/
"
+
a
n
o
;
p
ubli
c
Stri
ng
get
Des
crip
tion
() {
ret
urn
elDi
a.g
etT
ext(
);
}
public
boolean
handleEve
nt (Event
e) {
if (e.target
== hoy)
elDia.setTe
xt(GetHoy(
));
if (e.target
==
diasiguient
e)
elDia.setTe
xt(GetMan
ana());
return
super.hand
leEvent(e);
}
DiaPartid
a() {
setLayout
(new
GridLayo
ut (4,1));
elDia =
new
TextField(
);
elDia.setT
ext(GetH
oy());
hoy =
new
Button
("Hoy");
diasiguie
nte =
new
Button
("Mañana
");
add (new
Label
("Día
salida:
"));
add
(elDia);
add
(hoy);
add
(diasiguie
nte);
}
Otra manera sería armar un array con los días de cada mes,
corregir los días de febrero para los años
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA8.HTM (8 of
10)08/11/2003 12:40:32
bisiestos, y comparar contra este array en lugar de usar un
switch. La idea siempre es la misma: devolver un String con la
fecha del día siguiente.
Bueno, ahora vamos a reunir las piezas que tenemos hasta ahora
agregando estos métodos a nuestra clase Ventana8 para ver
cómo queda la ventana completa:
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA8.HTM (9 of 10)08/11/2003
12:40:32
Java desde Cero
constructor
super(titulo); // llama al de Frame
this.enApplet = enApplet; // guardamos esto
dp = new DiaPartida(); // DIA DE SALIDA
...........................
void ActualizaBoton() {
StringBuffer b = new StringBuffer("Viaje:
de ");
if (cs.getDescription() != null)
b.append(cs.getDescription());
else b.append("?");
b.append(" a ");
if (cl.getDescription() != null)
b.append(cl.getDescription());
else b.append("?");
b.append(" el ");
if (dp.getDescription() != null)
b.append(dp.getDescription());
else b.append("?/?/?");
ok.setLabel(b.toString());
Veamos:
class
Selec
Puebl
o
exten
ds
Panel
{
privat
e List
listaP
ueblo
s;
.........
.........
.........
.
public
String
getDe
scripti
on() {
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA9.HTM (1 of
7)08/11/2003 12:40:33
return listaPueblos.getSelectedItem();
}
}
ok = new Button("cualquiera");
ActualizaBoton();
add("South",ok);
p
a
c
k
(
)
;
s
h
o
w
(
)
;
Un poquito de actividad
if (e.id == Event.WINDOW_DESTROY) {
if (enApplet) dispose();
else System.exit(0);
}
if ( (e.target==dp)||
(e.target==cs)||
(e.target==cl) )
ActualizaBoton();
if (e.target==ok)
Activar();
}
r
e
t
u
r
n
s
u
p
e
r
.
h
a
n
d
l
e
E
v
e
n
t
(
e
)
;
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA9.HTM (2 of
7)08/11/2003 12:40:33
Simplemente, si detectamos un evento sobre alguno de nuestros
paneles actualizamos el texto del botón; y si se presiona dicho
botón llamamos al método Activar que se supone que va a
tomar los datos de la base de datos, indicarnos servicios
disponibles, etc.
Algo importante a notar es que el simple hecho de mover el
mouse sobre uno de los paneles ya llama a ActualizaBoton (se
nota porque titila el texto, sobre todo en una máquina lenta).
Además, si hacen click sobre el botón Hoy o Mañana sin mover
el mouse, el texto del botón ok no se actualiza ya que el evento
va dirigido al botón presionado y no al panel.
Una forma de filtrar sólo los eventos que nos interesan sería
usar, por ejemplo:
if ((e.target=cs.listaPueblos) &&
(e.id==Event.LIST_SELECT)) ActualizaBoton
();
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA9.HTM (3 of
7)08/11/2003 12:40:33
Lo mismo podemos hacer con handleEvent para la clase
DiaPartida:
public
boolean
handleEve
nt (Event
e) {
if (e.target
== hoy) {
elDia.setTe
xt(GetHoy(
));
e.target=t
his;
}
if (e.target
==
diasiguient
e) {
elDia.setTe
xt(GetMan
ana());
e.target=t
his;
}
if (e.target
== elDia)
{
e.target=t
his;
}
return
super.hand
leEvent(e);
}
if ((e.target
==
elDi
a)&
&(e
.id=
=Ev
ent.
KEY
_PR
ESS
)) {
if
(e.k
ey=
=1
0)
e.ta
rget
=th
is;
}
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA9.HTM (4 of
7)08/11/2003 12:40:33
Ahora debemos modificar el método handleEvent en nuestra
clase Ventana8 para que soporte todos estos eventos:
if (e.id == Event.WINDOW_DESTROY) {
if (enApplet) dispose();
else System.exit(0);
if
( ((e.target==dp)&&((e.id==Event.ACTION_EVENT)
||(e.id==Event.
KEY_PRESS)))
||((e.target==cs)&&(e.id==Event.LIST_SELECT))
||((e.target==cl)&&(e.id==Event.LIST_SELECT)) )
A
c
t
u
a
l
i
z
a
B
o
t
o
n
(
)
;
i
f
(
e
.
t
a
r
g
e
t
=
=
o
k
)
A
c
t
i
v
a
r
(
)
;
r
e
t
u
r
n
s
u
p
e
r
.
h
a
n
d
l
e
E
v
e
n
t
(
e
)
;
}
if ((e.target == elDia)&&(e.id==Event.KEY_PRESS)) { //
1- leer el contenido del campo con:
elDia.getText() // 2- modificarlo de acuerdo a
la tecla presionada: e.key // 3- poner el
resultado en el campo con:
elDia.setText(texto) // 4- modificar el objeto
del evento al panel con: e.target=this; // 5-
enviar el evento al objeto padre (no la clase
padre), // en este caso Ventana8, mediante:
getParent().deliverEvent(e) // 6- evitar
proceso posterior del evento mediante:
result(true)
}
Y para terminar...
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA9.HTM (5 of
7)08/11/2003 12:40:33
consultar un archivo o base de datos con lo que vamos a mostrar
al usuario de nuestro programa.
String
Actuali
zaBoto
n() {
String
Buffer
b=
new
String
Buffer(
"Viaje:
de ");
..........
..........
..........
..........
......
ok.set
Label(
b.toStr
ing());
}
void Activar() {
if ( (cs.getDescription() != null) &&
(cl.getDescription() != null) )
// también podríamos verificar que la fecha sea
válida aquí
Result8 resultado = new
Result8("Resultado",ActualizaBoton());
else ok.setLabel("Especificación incompleta!");
Sólo nos falta definir una sencilla clase Result8 para nuestra
ventanita resultado:
// archivo Result8.java, compilar
con javac Result8.java
import java.awt.*;
Button r_ok;
add("Ce
n
t
e
r
"
,
r
_
l
b
l
)
;
a
d
d
(
"
S
o
u
t
h
"
,
r
_
o
k
)
;
p
a
c
k
(
)
;
s
h
o
w
(
)
;
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA9.HTM (6 of
7)08/11/2003 12:40:33
}
return
super.ha
ndleEven
t(e);
}
}
http://www.amarillas.com/rock/java/Ejemplo8.htm
Indice
TodoLinux.com
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA9.HTM (7 of 7)08/11/2003
12:40:33
Un paréntesis de
Entrada/Salida
Primera Lectura
// archivo: Ejemplo9.java - compilar con "javac
Ejemplo9.java", etc. etc.
import java.io.*;
IOException {
FileInputStream fptr;
DataInputStream f;
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA10.HTM (1 of
12)08/11/2003 12:40:34
La clase FileInputStream (descendiente de InputStream) nos
sirve para referirnos a archivos o conexiones (sockets) de una
máquina. Podemos accederlos pasando un String como aquí, un
objeto de tipo File o uno de tipo FileDescriptor, pero en esencia
es lo mismo. Al crear un objeto de este tipo estamos "abriendo"
un archivo, clásicamente hablando.
C:\java\curso>java Ejemplo9
java.io.FileNotFoundException: noexiste.txt
at
java.io.FileInputStream.<init>(FileInputStrea
m.java:51)
at Ejemplo9.main(Ejemplo9.java:9)
do {
linea = f.readLine();
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA10.HTM (2 of
12)08/11/2003 12:40:34
Syste
m.out
.printl
n(line
a);
}
while
(linea
!=
null);
fptr.close();
Tanto readLine como close pueden lanzar la excepción
IOException, en caso de error de lectura o cierre de archivo.
import java.io.*;
fptr = new
FileInputStream("Ej
emplo9.java");
do {
n = fptr.read();
if (n!=-1)
System.out.print((c
har)n);
} while (n!=-1);
fptr.close();
}
}
Capturando excepciones
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA10.HTM (3 of
12)08/11/2003 12:40:34
Ahora sí, vamos a ver cómo nos las arreglamos con las
excepciones para que no se nos pare el programa con un mensaje
tan poco estético...
import java.io.*;
try {
fptr = new FileInputStream(args[0]);
f = new DataInputStream(fptr);
do {
linea = f.readLine();
if (linea!=null) System.out.println(linea);
} while (linea != null);
fptr.close();
}
catch (FileNotFoundException e) {
System.out.println("Hey, ese archivo no existe!\n");
}
catch (IOException e) {
System.out.println("Error de E/S!\n");
}
}
}
C:\java\curso>jav
a Ejemplo11
java.lang.ArrayIn
dexOutOfBounds
Exception: 0
at Ejemplo11.main(Ejemplo11.java:10)
Por ejemplo, para evitar este último error bastaría con agregar:
catch
(ArrayIndexOutOfBoundsException
e) {
System.out.println("Debe ingresar
un nombre de archivo!");
System.out.println("Ej.: java
Ejemplo11 pepe.txt");
}
/*
// -----
Archivo:
Ejemplo12.j
ava
*/
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA10.HTM (5 of
12)08/11/2003 12:40:34
import
java.io.*;
import
java.awt.
*;
import
java.appl
et.*;
ne
w Ventana12();
}
}
/*
// -------- Esta clase es la que en realidad hace el trabajo
*/
Ventana12() {
super("Ejemplo de
E/S");
contenido = new
TextArea();
cerrar = new
Button("Cerrar");
CargarArchivo();
add("North",conteni
do);
add("South",cerrar);
pack();
show();
}
void CargarArchivo()
{FileInputStream
fptr;DataInputStream f;String linea =
null;try {fptr = new
FileInputStream("Ejemplo12.java");f
= new DataInputStream(fptr);do
{linea = f.readLine();if (linea!=null)
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA10.HTM (6 of
12)08/11/2003 12:40:34
contenido.appendText(linea+"
\n");
} while (linea != null);
fptr.close();
}
catch (FileNotFoundException
e) {
contenido.appendText("Hey,
ese archivo no existe!\n");
}
catch (IOException e) {
contenido.appendText("Error
de E/S!\n");
}
}
}
<HTML>
<HEAD>
<TITLE>Ejemplo 12 -
Ejemplo con
archivo</TITLE>
</HEAD>
<BODY>
<applet
code="Ejemplo12.class"
width=170 height=150>
</applet>
</BODY>
</HTML>
http://www.amarillas.com/rock/java/Ejemplo12.htm
exception:
com.ms.applet.AppletSecurityException:
security.file.read:
Ejemplo12.java
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA10.HTM (7 of
12)08/11/2003 12:40:34
El applet se corre en el cliente, e intenta acceder a un archivo
local. Eso es lo que provoca la excepción (que, por supuesto,
puede detectarse con un catch y tratarse...)
Reproducir sonidos
Pueden establecer conexiones con el servidor del que provienen
Pueden llamar fácilmente páginas HTML desde el browser
Pueden invocar métodos públicos de otros applets de la misma
página
Si se cargan desde la propia máquina (localmente) no tienen
ninguna de las restricciones anteriores
Pueden seguir corriendo aunque se cambie de página en el
browser
/*
// -----
Archivo:
Ejemplo13.j
ava
*/
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA10.HTM (8 of
12)08/11/2003 12:40:34
import
java.io.*;
import
java.awt.
*;
import
java.appl
et.*;
public
v
o
i
d
i
n
i
t
(
)
n
e
w
V
e
n
t
a
n
a
1
3
(
)
;
/*
// -------- Esta clase es la que en realidad hace el trabajo
*/
Ventana13() {
super("Ejemplo de E/S");
contenido = new TextArea();
pieVentana = new Botones13();
add("North",contenido);
add("South",pieVentana);
pack();
show();
dispose();
if (e.id==2001)
CargarArchivo(pieVentana.toString());
if (e.id==2002)
GrabarArchivo(pieVentana.toString());
return super.handleEvent(e);
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA10.HTM (9 of
12)08/11/2003 12:40:34
linea = f.readLine();
if (linea!=null) contenido.appendText(linea+"\n");
} while (linea != null);
fptr.close();
}
catch (FileNotFoundException e) {
new Error13("Error
leyendo archivo!");
}
}
FileOutputStream fptr;
DataOutputStream f;
try {
/*
// -------- Esta es para los botones y el nombre del archivo
*/
Botones13() {
setLayout(new GridLayout(1,4));
fname = new TextField();
cargar = new Button("Cargar");
grabar = new Button("Grabar");
cerrar = new Button("Cerrar");
add(new Label("Archivo:"));
add(fname);
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA10.HTM (10 of
12)08/11/2003 12:40:34
add(cargar);
add(grabar);
add(cerrar);
public boolean
handleEvent(Event e) {
if
((e.id==Event.ACTION_E
VENT)&&(e.target==car
gar))
e.id=2001;
if
((e.id==Event.ACTION_E
VENT)&&(e.target==gra
bar))
e.id=2002;
if
((e.id==Event.ACTION_E
VENT)&&(e.target==cer
rar))
e.id=2003;
return
super.handleEvent(e);
}
public
String
toString(
){
return
fname.g
etText();
}
}
/*
// ------- Para mostrar los errores...
*/
Error13(String error) {
add("Center",new Label(error));
add("South", new Button("Ok"));
pack();
show();
}
Un poco largo... pero vale la pena, ¿no?!
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA10.HTM (11 of
12)08/11/2003 12:40:34
Indice
TodoLinux.com
mail
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA10.HTM (12 of
12)08/11/2003 12:40:34
Volviendo al AWT
/*
// ----- Archivo: Ejemplo14.java
*/
import java.io.*;
import java.awt.*;
import java.applet.*;
public void
init()
{ ne
w
Vent
ana1
4(tru
e); //
con
"true
"
avisa
mos
que
es
apple
t}
/*
// -------- Esta clase es la que en realidad hace el trabajo
*/
TextArea contenido;
boolean enApplet; // para indicar si lo llamamos como
applet
String nombreArchivo; // para guardar el nombre del
archivo abierto
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA11.HTM (1 of 9)08/11/2003
12:40:36
MenuItem mEditCortar; // .
MenuItem mEditCopiar; // .
MenuItem mEditPegar; // .
MenuItem mEditTodo; // v
String clipboard; // buffer para cortar y
pegar
boolean editado = false; // acá indicamos si modificamos el
archivo
Ventana14(boolean enApp) {
super("Ejemplo de E/S");
menuArchivo.add(mArchivoAbrir);
menuArchivo.add(mArchivoGrabar);
menuArchivo.add(new MenuItem("-"));
menuArchivo.add(mArchivoSalir);
menuEdit.add(mEditCortar);
menuEdit.add(mEditCopiar);
menuEdit.add(mEditPegar);
menuEdit.add(new MenuItem("-"));
menuEdit.add(mEditTodo);
barraMenu.add(menuArchivo);
barraMenu.add(menuEdit);
setMenuBar(barraMenu);
pack();
show();
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA11.HTM (2 of 9)08/11/2003
12:40:36
Untitled
pub
li
c
b
o
o
l
e
a
n
h
a
n
d
l
e
E
v
e
n
t(
E
v
e
n
t
e
)
{
if
((
e
.i
d
=
=
E
v
e
n
t.
W
I
N
D
O
W
_
D
E
S
T
R
O
Y
)|
|
(
e
.
t
a
r
g
e
t
=
=
m
A
r
c
h
i
v
o
S
a
l
i
r
)
)
{
i
f
(
e
d
i
t
a
d
o
)
S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(
"
P
e
d
i
r
c
o
n
f
i
r
m
a
c
i
ó
n
!
\
n
"
)
;
//
d
e
b
e
r
í
a
c
o
n
fi
r
m
a
r
//
s
i
s
e
quiere ir sin grabar!
if (enApplet) dispose();
else System.exit(0);
} if (e.target==mArchivoAbrir) CargarArchivo(); //
acá
proceso selecciones if (e.target==mArchivoGrabar)
GrabarArchivo(); // de menú if
(e.target==mEditCortar) {
clipboard = contenido.getSelectedText();
mEditPegar.enable();
contenido.replaceText("",contenido.getSelectionStar
t(),contenido.
getSelectionEnd());
editado=true;
}
if (e.target==mEditCopiar) {
clipboard = contenido.getSelectedText();
mEditPegar.enable();
}
if (e.target==mEditPegar) {
contenido.replaceText("",contenido.getSelectionStar
t(),contenido.
getSelectionEnd());
contenido.insertText(clipboard,contenido.g
etSelectionStart());
editado=true;
}
if (e.target==mEditTodo) contenido.selectAll();
if
((e.id==Event.KEY_PRESS)&&(e.target==contenido))
editado=true;
mArchivoGrabar.enable(editado);
return super.handleEvent(e);
}
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA11.HTM (3 of 9)08/11/2003
12:40:36
estándar del sistema!
nombreArchivo = fd.getFile();
do {
linea = f.readLine();
if (linea!=null)
contenido.appendText(linea+"\n");
c
a
t
c
h
(
I
O
E
x
c
e
p
t
i
o
n
e
)
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA11.HTM (4 of
9)08/11/2003 12:40:36
}
/*
// ------- Para
mostrar los
errores...
*/
Error14(String error) {
add("Center",new Label(error));
add("South", new Button("Ok"));
pack();
show();
Menú a la Java
Bueno, lo primero que vamos a ver son los menús.
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA11.HTM (5 of
9)08/11/2003 12:40:36
setMenuBar(barraMenu);
Menu
menuArchivo
= new
Menu("&Archi
vo");
...
Menu
menuEdit =
new
Menu("&Edit")
;
mArchivoAbrir =
new
MenuItem("&Abrir..
.");
mArchivoGrabar =
new
MenuItem("&Graba
r...");
mArchivoSalir =
new
MenuItem("&Salir")
;
menuArchivo.add(
mArchivoAbrir);
menuArchivo.add(
mArchivoGrabar);
menuArchivo.add(n
ew MenuItem("-"));
menuArchivo.add(
mArchivoSalir);
menuArchivo.add(new MenuItem("-"));
no agrega un ítem al menú sino una línea de separación,
y no necesitamos crearlo como objeto permanente.
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA11.HTM (6 of
9)08/11/2003 12:40:36
Finalmente, en nuestro manejador de eventos simplemente
necesitamos verificar si se eligió un ítem probando si el
evento ocurrió sobre el ítem determinado:
if ((e.id==Event.WINDOW_DESTROY)||
(e.target==mArchivoSalir)) { if
(editado)
System.out.println("Pedir
confirmación!\n"); if (enApplet)
dispose(); else System.exit(0);
}
if
(e.target==mArchiv
oAbrir)
CargarArchivo();
................
if
(e.target==mEditTo
do)
contenido.selectAll(
);
if ((e.id==Event.KEY_PRESS)&&(e.target==contenido))
editado=true;
Un par de aclaraciones:
Diálogos
En Java disponemos de la clase Dialog para crear diálogos,
es decir, ventanitas temporarias para entradas de usuario, que
dependen de otra (de hecho la clase Dialog es heredera de la
clase Window).
if (editado) {
sino = new
ConfirmarDlg(this,"Archivo
modificado!");
if
(sino.getResponse()==true
) ....;
else ....;
}
FileDialog fd = new
FileDialog(this,"Abrir...",FileDialog.LOAD);
fd.show();
nombreArchivo = fd.getFile();
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA11.HTM (8 of
9)08/11/2003 12:40:36
Primero declaramos una variable de tipo FileDialog, y creamos
la instancia con new. Como parámetros se pasa el padre (this, o
sea "esta ventana"), el título de la ventanita de diálogo, y una
constante LOAD o SAVE (son static, por lo que se denominan
directamente con el nombre de la clase y no necesariamente de
una instancia) que indica si el diálogo es para cargar o grabar un
archivo (Obviamente la tarea en sí de cargar o grabar el archivo
la tenenmos que hacer nosotros, el diálogo sólo espera que
elijamos un nombre).
Indice
TodoLinux.com
mail
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA11.HTM (9 of 9)08/11/2003
12:40:36
DibuJava
Canvas en acción
Primero vamos a poner, como ya se está haciendo costumbre,
el código del applet (Recordar que debe cargarse desde una
página html para verlo! Aquí no creamos ninguna ventana y
no podremos verlo como aplicación standalone) y luego
intentaremos explicar cómo funciona.
i
m
p
o
r
t
j
a
v
a
.
a
w
t
.
*
;
i
m
p
o
r
t
j
a
v
a
.
a
p
p
l
e
t
.
A
p
p
l
e
t
;
add("North", label);
add("Center", zonaDib);
resize(300,250);
class
mi
Ca
nv
as
ex
te
nd
s
Ca
nv
as
{
R
ec
ta
ng
le
re
ct
Ac
tu
al;
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA12.HTM (1 of
6)08/11/2003 12:40:37
return false;
}
Rectangle box =
cortarRect(rectAct
ual, d);
g.drawRect(box.x,
box.y, box.width-
1, box.height-1);
}
}
if (ancho < 0) {
ancho = -ancho;
x = x - ancho + 1;
if (x < 0) {
ancho += x;
x = 0;
}
}
if (alto < 0) {
alto = -alto;
y = y - alto + 1;
if (y < 0) {
a
l
t
o
+
=
y
;
0
;
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA12.HTM (2 of 6)08/11/2003
12:40:37
}
ancho = areaDib.width - x;
}
if ((y + alto) > areaDib.height) {
alto = areaDib.height - y;
}
r
e
t
u
r
n
n
e
w
R
e
c
t
a
n
g
l
e
(
x
,
y
,
a
n
c
h
o
,
a
l
t
o
)
;
El applet-container
En primer lugar hemos tenido en cuenta que un Applet es un
Panel, y por lo tanto también un Container, así que en lugar de
crear una ventana aparte simplemente le agregamos dos
componentes: un Label y un Canvas.
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA12.HTM (3 of
6)08/11/2003 12:40:37
estamos dibujando. El método Paint se llama
automáticamente cada vez que es necesario redibujar el
componente, o si llamamos explícitamente al método
repaint():
public void
paint(Graphic
s g) {
Dimension d
= size();
g.setColor(C
olor.red);
g.drawRect(
0, 0, d.width-
1, d.height-
1);
g.setColor(C
olor.blue);
if (rectActual
!= null) {
Rectan
gle box
=
cortarRe
ct(rectA
ctual,
d);
g.draw
Rect(bo
x.x,
box.y,
box.widt
h-1,
box.hei
ght-1);
}
}
Dimension d = size();
g.setColor(Color.red);
g.drawRect(0, 0, d.width-1, d.height-1);
int x = miRect.x;
int y = miRect.y;
int ancho = miRect.width;
int alto = miRect.height;
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA12.HTM (4 of
6)08/11/2003 12:40:37
canvas (x<0), lo pone en cero y le resta al ancho la parte
recortada (notar que ancho+=x, como x es negativo, es en
realidad una resta).
ho < 0) {
a
n
c
h
o
=
-
a
n
c
h
o
;
x
=
x
-
a
n
c
h
o
+
1
;
i
f
(
x
<
0
)
{
a
n
c
h
o
+
=
x
;
0
;
ancho) >
areaDib.wi
dth) {
ancho =
areaDib.wi
dth - x;
Sólo nos quedan por ver los métodos que responden al mouse.
public boolean
mouseDown(E
vent e, int x,
int y) {
rectActual =
new
Rectangle(x,
y, 0, 0);
repaint();
return false;
}
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA12.HTM (5 of
6)08/11/2003 12:40:37
Finalmente, al soltar el mouse, redimensionamos como antes y
redibujamos:
rectActual.resize(x-rectActual.x, y-
rectActual.y);
repaint();
return false;
Indice
TodoLinux.com
mail
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA12.HTM (6 of 6)08/11/2003
12:40:37
DibuJava II
Vectores en acción
Los vectores nos permiten hacer arreglos de cualquier tipo de
objeto, y referirnos individualmente a cualquier elemento del
vector, aunque para utilizarlos (debido a que para java el vector
contiene objetos genéricos) tendremos que decirle qué clase de
objeto es mediante un "cast". Vamos a ver cómo quedan nuestras
clases Ejemplo16 (ex Ejemplo15) y miCanvas:
import java.awt.*;
import java.util.*;
import java.applet.Applet;
}
}
necesaria!
Rectangle r =
(Rectangle)v.lastElemen
t(); // cast: v son
rectángulos r.resize( x -
r.x, y - r.y ); // (creé r
sólo por claridad)
repaint();
return false;
}
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA13.HTM (1 of 7)08/11/2003
12:40:38
Rectangle r = (Rectangle)v.lastElement(); // cast:
v son
rectángulos
r.resize( x - r.x, y - r.y ); // (creé r sólo po
claridad)
repaint();
return false;
}
g.setColor(Color.red);
g.setColor(Color.blue);
i
f
(
v
.
s
i
z
e
(
)
>
0
)
f
o
r
(
i
=
0
;
i
<
v
.
s
i
z
e
(
)
;
i
+
+
)
R
e
c
t
a
n
g
l
e
b
o
x
c
o
r
t
a
r
R
e
c
t
(
(
R
e
c
t
a
n
g
l
e
)
v
.
e
l
e
m
e
n
t
A
t
(
)
,
d
)
;
g.drawRect(box.
x, box.y, box.width-
1, box.height-1);
}
}
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA13.HTM (2 of 7)08/11/2003
12:40:38
v.addElement( new Rectangle(x, y, 0, 0) );
(Rectangle)v.lastElement().x
(Rectangle)v.lastElement().resize( x -
(Rectangle)v.lastElement().x, ......
Rectangle r =
(Rectangle)v.lastElement();r.resize( x -r.x, y
-r.y );
if (v.size() > 0)
for (i=0; i<v.size(); i++) {
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA13.HTM (3 of
7)08/11/2003 12:40:38
Rectangle box = cortarRect(
(Rectangle)v.elementAt( i ), d);
g.drawRect(box.x, box.y, box.width-1, box.height-1);
Flicker molesto!
Bueno, el problema que nos queda es el molesto "flicker", o sea
la manera en que titila el dibujo cuando movemos el mouse. Esto
es porque cada vez que se llama a paint(), el fondo se borra y se
redibuja todo el canvas.
class
mi
Ca
nv
as
ext
en
ds
Ca
nv
as
{
Ve
cto
r v
=
ne
w
Ve
cto
r();
I
m
a
g
e
i
m
g
B
u
f
f
;
G
r
a
p
h
i
c
s
g
r
a
f
B
u
f
f
;
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
update(g);
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA13.HTM (4 of
7)08/11/2003 12:40:38
algunos agregados:
int i;
Dimension d = size();
if (grafBuff == null) {
imgBuff = createImage(d.width,
d.height);
graf
Buff =
imgBuff.getGraphics(
);
}
grafBuff.setColor(get
Background());
grafBuff.fillRect(0, 0,
d.width, d.height);
grafBuff.setColor(Color.red);
grafBuff.drawRect(0, 0, d.width-1, d.height-1);
grafBuff.setColor(Color.blue);
if (v.size() > 0) for (i=0; i<v.size(); i++) {
Rectangle box =
cortarRect((Rectangle)v.elementAt(i)
, d);
grafBuff.drawRect(box.x, box.y,
box.width-1, box.height-1);
}
g.drawImage(imgBuff, 0, 0, this);
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA13.HTM (5 of
7)08/11/2003 12:40:38
Animate!
Si bien puede ser un poco más complejo de entender que un
dibujo directo sobre la pantalla, notarán que la implementación
es directa y no trae ningún problema. Esta misma aproximación
puede utilizarse para crear animaciones.
i
m
p
o
r
t
j
a
v
a
.
a
w
t
.
*
;
i
m
p
o
r
t
j
a
v
a
.
u
t
i
l
.
*
;
i
m
p
o
r
t
j
a
v
a
.
a
p
p
l
e
t
.
A
p
p
l
e
t
;
pub
l
i
c
v
o
i
d
i
n
i
t
(
)
r
e
s
i
z
e
(
n
e
w
D
i
m
e
n
s
i
o
n
(
2
0
0
,
2
0
0
)
)
;
Thr
ead
.sle
ep(
10
0);
}
cat
ch
(Int
err
upt
edE
xce
pti
on
e)
{
b
r
e
a
k
;
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA13.HTM (6 of
7)08/11/2003 12:40:38
}
Dimension d = size();
if (grafBuff == null) {
imgBuff = createImage(d.width,
d.height);
grafBuff = imgBuff.getGraphics();
}
grafBuff.setColor(getBackground());
grafBuff.fillRect(0, 0, d.width,
d.height);
grafBuff.setColor(Color.red);
grafBuff.drawRect(0, 0, d.width-1, d.height-
1);
grafBuff.setColor(Color.blue);
dx = (int)(50 * Math.abs(Math.cos(ang)));
dy = (int)(50 * Math.abs(Math.sin(ang)));
ang = ang + 0.1;
if (ang>2*Math.PI) ang = 0.0;
grafBuff.drawRect(100-dx, 100-dy, 2*dx,
2*dy);
g.drawI
mage(imgBu
ff, 0, 0, this);
}
}
Indice
TodoLinux.com
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA13.HTM (7 of 7)08/11/2003
12:40:38
Java en hebras
p
u
b
l
i
c
i
n
t
e
r
f
a
c
e
j
a
v
a
.
l
a
n
g
.
R
u
n
n
a
b
l
e
/
/
M
e
t
h
o
d
s
p
u
b
l
i
c
a
b
s
t
r
a
c
t
v
o
i
d
r
u
n
(
)
;
Reunión de amigos
El siguiente ejemplo (Ejemplo19.java) usa threads para
activar simultáneamente tres objetos de la misma clase,
que comparten los recursos del procesador peleándose para
escribir a la pantalla.
class Ejemplo19 {
throws InterruptedException
{
Thread Juan = new
Thread (new
Amigo("Juan"));
Thread Luis = new
Thread (new
Amigo("Luis"));
Thread Nora = new
Thread (new
Amigo("Nora"));
Juan.start();
Luis.start();
Nora.start();
Juan.join();
Luis.join();
Nora.join();
String mensaje;
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA14.HTM (2 of
7)08/11/2003 12:40:39
public Amigo(String nombre) {
mensaje = "Hola, soy "+nombre+"
y este es mi mensaje ";
S
t
r
i
n
g
m
s
g
m
e
n
s
a
j
e
+
i
;
S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(
m
s
g
)
;
Hola, soy
Juan y
este es
mi
mensaje
1
Hola, soy
Juan y
este es
mi
mensaje
2
Hola, soy
Luis y
este es
mi
mensaje
1
Hola, soy
Luis y
este es
mi
mensaje
2
Hola, soy
Nora y
este es
mi
mensaje
1
Hola, soy
Nora y
este es
mi
mensaje
2
Hola, soy
Nora y
este es
mi
mensaje
3
Hola, soy
Juan y
este es
mi
mensaje
3
...........et
c.
Hola, soy
Juan y
este es
mi
mensaje
1
Hola, soy
Juan y
este es
mi
mensaje
2
Hola, soy
Juan y
este es
mi
mensaje
3
Hola, soy
Juan y
este es
mi
mensaje
4
Hola, soy
Juan y
este es
mi
mensaje
5
Hola, soy
Luis y
este es
mi
mensaje
1
Hola, soy
Luis y
este es
mi
mensaje
2
...........et
c.
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA14.HTM (3 of
7)08/11/2003 12:40:39
Si ustedes están utilizando un sistema operativo no preemptivo,
deben explícitamente indicarle al procesador cúando puede
ejecutar (dar paso) a otra tarea; para eso simplemente
modifiquen el método run():
System.out.println(msg);
Thread.yield();
}
}
Hola, soy
Juan y este
es mi
mensaje 1
Hola, soy
Luis y este
es mi
mensaje 1
Hola, soy
Nora y este
es mi
mensaje 1
Hola, soy
Juan y este
es mi
mensaje 2
Hola, soy
Luis y este
es mi
mensaje 2
Hola, soy
Nora y este
es mi
mensaje 2
Hola, soy
Juan y este
es mi
mensaje 3
Hola, soy
Luis y este
es mi
mensaje 3
...........etc.
Esto es porque en seguida de imprimir estamos liberando al
procesador para que pase a otro thread (si hay alguno
esperando). Noten la diferencia con el primer caso, sin usar
yield(), para sistemas preemptivos: el procesador reparte su
trabajo en forma (aparentemente) impredecible, por eso el orden
de los mensajes no será el mismo en cualquier máquina o
sistema operativo.
Creando Threads
Thread es una clase básica en Java, que implementa la interface
Runnable y dispone de unos cuantos métodos por defecto. Lo
importante a tener en cuenta que, para usar Threads, debemos
crearlas como instancias y ponerlas a "andar":
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA14.HTM (4 of
7)08/11/2003 12:40:39
Thread Juan = new
Thread (new
Amigo("Juan"));
..............
Juan.start();
..............
Juan.join();
Y los applets...?
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA14.HTM (5 of
7)08/11/2003 12:40:39
También podemos usar estos conceptos en los applets.
Veamos un ejemplo para terminar la clase de hoy, muy
similar al anterior, donde tres contadores cuentan (en un
sistema preemptivo) en forma simultánea. Recuerden crear
una página HTML con el tag
http://www.amarillas.com/rock/java/Ejemplo20.htm
// Ejemplo de applet
que usa
multithreading
import java.awt.*;
import java.applet.*;
TextField tfa,tfb,tfc;
}
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA14.HTM (6 of
7)08/11/2003 12:40:39
}
TextField texto;
String s;
public void
ru
n(
)
{
f
or
(i
nt
i=
0;
i<
1
0
0
0;
i+
+
)
{
t
e
xt
o.
se
tT
e
xt
(s
.v
al
u
e
Of
(i)
);
}
}
Indice
TodoLinux.com
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA14.HTM (7 of 7)08/11/2003
12:40:39
La liebre y la tortuga (y el
guepardo)
guepardo;
static Animal
throws InterruptedException {
tortuga.start();
liebre.start();
guepardo.start();
tortuga.join();
liebre.join();
guepardo.join();
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA15.HTM (1 of
12)08/11/2003 12:40:40
Thread {
String
nombre;
this.nombre = nombre;
setPriority(prioridad);
}
public void run() {
System.out.print(
nombre );
yield();
System.out.
println("\nLle
ga
"+nombre );
C:\java\curso>java
Ejemplo21
GGGGGGGGGGGGGGGG
GGGGGGGGGGGGGG
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA15.HTM (2 of
12)08/11/2003 12:40:40
L
le
ga
GL
TL
LL
LL
LL
LL
LL
LL
LL
LL
LL
LL
LL
LL
LL
LL
Lle
ga
LT
TT
TT
TT
TT
TT
TT
TT
TT
TT
TT
TT
TT
TT
TT
Lle
ga
if (valorImportante > 0 ) {
valorImportante =
valorImportante - 1;
..... sigue.....................
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA15.HTM (3 of
12)08/11/2003 12:40:40
¿Cómo nos aseguramos que valorImportante no cambió entre el
if y la línea resaltada? Otros threads pueden haberlo modificado
mientras tanto. Asimismo, puede suceder que dos threads estén
ejecutando la misma porción de código, y se pierda uno de los
decrementos. Imaginen algo así:
valorImportante = 10 (thread 1) 10 -1 = 9
public
e
m
v
o
{
S
r
(
r
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA15.HTM (4 of
12)08/11/2003 12:40:40
usan...
Contador C2 = new
C1.start();
C2.start();
try {
C1.join();
C2.join();
catch (Exception e) {
.
o
}
class
d
{
Contador (Sumador
sumador) {
s=
sumador; //
le asigno
un sumador
a usar
}
public void run() {
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA15.HTM (5 of
12)08/11/2003 12:40:40
s.sumar(); // ejecuto la suma
class Sumador {
int a = 0;
a += 1;
y
s
i
m
}
Ejecutando esto nos da más o menos así (cada corrida es
diferente, dependiendo de cómo se "chocan" los threads y la
carga de la CPU):
C:\java\curso>java Ejemplo22
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA15.HTM (6 of
12)08/11/2003 12:40:40
1
5
synchronized (s) {
s.sumar();
}
Con esto, sólo a uno de los dos threads se les permite ejecutar
s.sumar() por vez, y se evita el problema. Por supuesto, el otro
thread queda esperando, por lo que más vale no utilizar esto con
métodos muy largos ya que el programa se puede poner lento o
aún bloquearse.
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA15.HTM (7 of
12)08/11/2003 12:40:40 Java desde Cero
C:\java\curso>java
primer thread10000
<10000 (15000
( segundo
thread20000 (
Más sincronización
Otra manera de sincronizar el acceso de los threads a los
métodos, es lograr que éstos se pongan de acuerdo entre sí,
esperando uno hasta que otro realizó alguna tarea dada. Para esto
se usan los métodos wait() y notify(). Cuando un thread llama a
wait() en un método de un objeto dado, queda detenido hasta
que otro thread llame a notify() en algún método del mismo
objeto.
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA15.HTM (8 of
12)08/11/2003 12:40:40
"Luis", false);
"JEFE", true);
pablo.start();
luis.start();
andrea.start();
pedro.start();
jefe.start();
try {
;
l
i
n
e
.
e
p
r
i
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA15.HTM (9 of
12)08/11/2003 12:40:40
class Saludo {
synchronized void
esperarJefe(String empleado) {
try {
wait();
System.out.println(empleado+">
t
e
.
o
)
;
System.out.println("JEF
notifyAll();
class
Per
son
al
ext
en
ds
Thr
ea
d{
Str
ing
no
mb
re;
Sa
lud
sal
ud
o;
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA15.HTM (10 of
12)08/11/2003 12:40:40
boolean esJefe;
nombre = n;
saludo = s;
esJefe = j;
System.out.println("("+nombre+"
llega)");
if (esJefe)
o
J
p
e
}
Usé notifyAll() en lugar de notify(), porque en el segundo
caso sólo se notificaría al primer thread (el primer empleado
en llegar) y no a los demás, que se quedarían en el wait().
C:\java\curso>java Ejemplo23
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA15.HTM (11 of
12)08/11/2003 12:40:40
i
s
d
r
E
>
>
s
d
>
a
s
>
j
e
>
e
!
Indice
TodoLinux.com
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA15.HTM (12 of
12)08/11/2003 12:40:40
Solución al problema
propuesto
ass
Per
son
al
ext
end
Thr
ead
.....
......
.....
................
System.out.println("("+nombre+"
llega)");
if (esJefe) {
4
while (llegaron <
)
}
salud
o.sal
udoJ
efe();
else
synchronized(this
}
salud b
o.esp r
erarJ e
efe(n )
incremento para que no pasen los
; problemas que vimos en el capítulo).
}
En el caso del jefe, simplemente espera
que el contador llegue a 4. Podríamos
modificar esto un poco, pasando la
cantidad de empleados como parámetro
para que sea más flexible.
file:///F|
/[Ebooks]/V/Varios/M
anual.Curso.de.java.de
sde.cero.-.
Inclusive, podemos usar dos constructores
Sp/JAVA15S.HTM (1 distintos (uno para los empleados y otro
of 5)08/11/2003
12:40:40 para el jefe, y en este último caso pasamos
Java desde Cero la cantidad de empleados a esperar). Les
dejo el ejemplo para que lo estudien.
public static
void
mai
n(St
Preparamos ring
una variable
static (de argv
clase) para
[]) {
contar todos
los
Sal
empleados
que pasaron udo
por aquí; la
incrementam hola
os justo antes
de ejecutar =
saludo.espe
rarJefe new
(sincronizan
do el thread Salu
en el
do()
; rson
al(h
ola,
P "JEF
e E",
r 3);
s Per
o son
n al
a pabl
l o=
new
j Pers
e onal
f (hol
e a,
"Pab
= lo");
Per
n son
e al
w luis
P new
e Pers
o onal
n andr
a ea
l =
( new
h Pers
o onal
l (hol
a a,
, "An
drea
" ");
L jefe
u .star
i t();
s pab
" lo.st
) art()
; ;
luis
.star
P t();
e and
r rea.
s star
t try
( {
;
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.
Sp/JAVA15S.HTM (2 of 5)08/11/2003 12:40:40
pablo.join();
luis.join();
andrea.join();
jefe.join();
} o
a e
t )
h {
x S
c y
e s
p t
e ludo {
m synchronized
. void
o esperarJefe(Stri
u ng empleado) {
t.
p try {
ri wait();
n System.out.println
tl (empleado+">
n Buenos dias
( jefe!");
);
} c
} a
ass
S (
a I
n .
t o
e u
rr t
u .
p p
t r
e i
d n
E t
x l
c n
e (
p e
ti .
o t
n o
e S
) t
{ r
S i
y n
st g
e (
m )
);
}
}
file:///F|
i
/[Ebooks]/V/Varios/M
anual.Curso.de.java.de
sde.cero.-.
n
Sp/JAVA15S.HTM (3
of 5)08/11/2003
12:40:40
t
synchronized
void l
saludoJefe() {
n
S "
y J
s E
t F
e E
m >
o B
u u
t e
. n
o
i }
"
class Personal
)
extends
;
Thread
String
n
nombre;
o
Saludo
t
saludo;
i
boolean
f
esJefe;
y
static
A
int
l
llegaron
l
= 0;
(
int
)
numEm
;
p Personal (Saludo s, String n)
; {
esJefe = false;
nombre = n;
saludo = s;
ring
n, int
Personal x) {
( esJef
S e=
a true;
l nomb
u re =
d n;
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.
s Sp/JAVA15S.HTM (4 of 5)08/11/2003 12:40:40
S a
t l
u
d public void
o run
() {
= Sy
ste
s m.o
; ut.p
rintl
n n("(
u "+n
m om
E bre
m +"
p lleg
a)")
= ;
if
x (esJ
; efe)
d
("(Esperando.
(
..)"); }
t
i
salud
s
o.sal
)
udoJ
efe();
{
}
else
l
{
l
g
s
a
y
r
n
o
c
n
h
+
r
+
o
;
n
i
}
z
b
s r
a e
l )
u ;
. }
p }
r }
J
Indice
e
f TodoLinux.com
e mail
m
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.
Sp/JAVA15S.HTM (5 of 5)08/11/2003 12:40:40
Multimedia!
Java permite cargar y visualizar archivos GIF o JPEG de
imagen y AU de audio (solamente en mono, 8 bits, 8000Hz de
muestreo).
........
.........
sonido.play()
;
.............
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.
Sp/JAVA16.HTM (1 of 7)08/11/2003 12:40:41 Java desde Cero
......
a
Image imagen =
l
getImage(getDocumen
g
tBase(), "imagen.gif");
u
..........
n
}
M
...........
e
t
public
o
v
d
o
o
i
( d
. p
a
.
i
)
n
t
{
(
. r
. a
p
.
h
.
i
c x
s O
g f
) s
{ t
g y
. O
d f
r f
a s
w e
I t
m ,
g t
e h
( i
i s
m )
a ;
e /
n /
"
t }
i .
s .
" .
r .
e .
p .
r .
e .
s .
e .
n .
t .
a .
a
El problema con las imágenes es asegurarse que
p
fue cargada antes de mostrarla. Para eso se utiliza
p un MediaTracker (también debería servir para
los archivos de audio, pero en esta versión aún no
l está implementado).
e
Mediante addImage( imagen, grupo) se agrega
t una imagen a la lista del MediaTracker, y hay
métodos para esperar que sea cargada (como
waitForAll() o waitForID(grupo)), para verificar
que se haya cargado correctamente (como
checkAll(),
checkID(gr a
upo),
isErrorAny(
)...),
i
etcétera.
m
El siguiente
applet p
utiliza estos
conceptos o
para cargar
una imagen r
y un archivo
t
de audio y
mostrarlos:
j
/
a
/
v
a
E
.
j
a
e
w
m
t
p
.
l
*
o
;
2
4
i
.
m
j
p
a
o
v
r e
t t
j *
a ;
.
public class Ejemplo24 extends Applet {
a
p
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.
p Sp/JAVA16.HTM (2 of 7)08/11/2003 12:40:41
er supervisor; String
i
public void init() {
a
supervisor = new
T
MediaTracker(this);
r
archImagen =
a
"javacero.gif";
c
archAudio = "tada.au";
k
archImagen);
// carga
supervisor.addI
imagen
mage(imagen,0
imagen =
);
getImage(
try {
getDocum
entBase(),
argue
supervisor.waitFo
}
rID(0);
catch//
(Interrupte
dException
se
e) {
c
cargando imagen!");
}
System.o
showStatus("Imagen
ut.println("
cargada");
Error
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.
Sp/JAVA16.HTM (3 of 7)08/11/2003 12:40:41
=
//
getAudioClip(getDoc
carga
umentBase(),
sonido
archAudio);
audio
// Label(archIma
arma gen);
layout setFont(new
setLay Font("helvetica
w 18));
Border add("South",
Layout titulo);
());
}
titulo
= new
start() {
repaint();
{
if
g.setColor(Color.b
(supervi
lack);
sor.isErr
g.fillRect(0, 0,
orAny())
size().width,
size().he
ight);
return;
g.drawI
mage(im
agen, 0,
0, this);
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.
Sp/JAVA16.HTM (4 of 7)08/11/2003 12:40:41
}
}
TML>
<HEAD>
<TITLE>
Para
Ejemplo
visualizarlo,
como 24 -
siempre,
creamos un Ejemplo
HTML:
Multimed
< ia</TITLE
H >
< <applet
/ code="Ejemplo2
H 4.class"
E width=150
A height=200>
D </applet>
> </BODY>
</HTML>
<
Y
Parametrizando un applet
>
Vamos a aprovechar este ejemplo, modificándolo
un poco para indicarle desde el HTML qué
archivos debe cargar, mediante parámetros.
Nuestro HTML modificado será:
<HTML>
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.
Sp/JAVA16.HTM (5 of 7)08/11/2003 12:40:41 Java desde Cero
A
<
D
H
>
E
< m
T e
I d
T i
L a
E <
> /
E T
j I
e T
m L
p E
l >
<
2 /
4 H
- A
M >
l <
t B
i O
D emplo24.class
Y " width=150
> height=200>
<param
name="image
n"
< value="javace
a ro.gif">
p <param
p name="sonido
l "
e value="tada.a
t u">
</applet>
c </BODY>
o </HTML>
a
archIm
g
en = ;
getPara
meter("i
magen"
);
archAu
dio =
getPara
meter("
sonido")
amarillas.com/rock/java/Ejemplo24.htm.
Indice
mail
TodoLinux
.com
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.
Sp/JAVA16.HTM (7 of 7)08/11/2003 12:40:41
Por ejemplo:
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA17.HTM (1 of
10)08/11/2003 12:40:42
getInputStream() del objeto URLConnection nos provee tal
corriente:
.
i
;
public class Ejemplo25 {
String s;
try {
URLConnection conex =
url.openConnection();
System.out.println("Cargando
"+argv[0]);
DataInputStream(conex.
getInputStream());
o
{
;
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA17.HTM (2 of
10)08/11/2003 12:40:42
if (s != null)
System.out.println(s);
} while (s != null);
catch (ArrayIndexOutOfBoundsException
e) {
System.out.println("Sintaxis
catch (UnknownHostException e)
System.out.println("El host
no existe o no responde");
catch (Exception e) {
e
.
}
}
http://www.ncsa.uiuc.edu/demoweb/url-primer.html
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA17.HTM (3 of
10)08/11/2003 12:40:42
Los Sockets
Los sockets (zócalos, referido a los enchufes de conexión de
cables) son mecanismos de comunicación entre programas a
través de una red TCP/IP. De hecho, al establecer una conexión
via Internet estamos utilizando sockets: los sockets realizan la
interfase entre la aplicación y el protocolo TCP/IP.
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA17.HTM (4 of
10)08/11/2003 12:40:42
este caso
Un servidor atento
// servidor
import java.io.*;
import java.net.*;
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA17.HTM (5 of
10)08/11/2003 12:40:42
numCliente = 0; try {
servidor = new
ServerSocket(5000);
do {
numCliente++;
cliente = servidor.accept();
System.out.println("Llega el
cliente "+numCliente);
PrintStream ps = new
PrintStream(cliente.getOutputStre
am
());
ps.println("Usted es
mi cliente
"+numCliente);
cliente.close();
} while (true);
catch (Exception e) {
;
}
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA17.HTM (6 of
10)08/11/2003 12:40:42
Utilizamos un PrintStream para enviar los datos al cliente, ya
que es sencillo de utilizar para mandar Strings. El método
PrintStream.println maneja los datos como
System.out.println, simplemente hay que indicarle el stream a
través del cual mandarlos al crearlo (en este caso, el
OutputStream del cliente, que obtenemos con
cliente.getOutputStream()).
El cliente satisfecho
l
i
;
i
Socket servidor;
int numCliente = 0;
try {
direccion =
InetAddress.getLocalHost(); //
direccion local
5000);
DataInputStream datos =
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA17.HTM (7 of
10)08/11/2003 12:40:42
new
DataInputStream(servidor.getInputS
tream());
System.out.println( datos.readLine()
);
servidor.close();
)
{
;
}
Ventana servidor:
C:\j
av
a\c
urs
o>j
av
Eje
mp
lo2
6a
Lle
ga
el
clie
nte
Lle
ga
el
clie
nte
Lle
ga
el
clie
nte
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA17.HTM (8 of
10)08/11/2003 12:40:42
C:\j
ava\
curs
o>j
ava
Eje
mpl
o26
Ust
ed
es
mi
clie
nte
C:\j
ava\
curs
o>j
ava
Eje
mpl
o26
Ust
ed
es
mi
clie
nte
C:\j
ava\
curs
o>j
ava
Eje
mpl
o26
Ust
ed
es
mi
clie
nte
C:\java\curso>java Ejemplo26b
java.net.SocketException: connect
at
java.net.PlainSocketImpl.doConnect(PlainSock
etImpl.java:223)
at
java.net.PlainSocketImpl.connectToAddress(Pl
ainSocketImpl.
java:128)
at
java.net.PlainSocketImpl.connect(PlainSocketI
mpl.java:115)
at java.net.Socket.<init>(Socket.java:125)
at java.net.Socket.<init>(Socket.java:101)
at Ejemplo26b.main(Ejemplo26b.java:12)
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA17.HTM (9 of
10)08/11/2003 12:40:42
Por ejemplo, una aplicación servidora puede correr
constantemente en un server de Internet (por ejemplo, para
buscar datos en una base de datos) y diferentes clientes en
distintas máquinas, posioblemente applets Java, pueden
conectarse a ella y consultarla.
Indice
TodoLinux.com
mail
file:///F|/[Ebooks]/V/Varios/Manual.Curso.de.java.desde.cero.-.Sp/JAVA17.HTM (10 of
10)08/11/2003 12:40:42