Documente Academic
Documente Profesional
Documente Cultură
Introduccin a Java
En cuanto sali Java fue acogido con gran entusiasmo por la comunidad mundial
de los diseadores de program as y de los proveedores de servicios internet. Esto
porque Java perm ita a los usuarios de Internet utilizar aplicaciones seg uras e
independientes de la plataform a, y que se pueden encontrar en cualquier punto
de la red.
Java naci pues como lenguaje para la red, para sostener el Hyper Text Markup
Language (HTML), que no es un lenguaje de program acin propiam ente dicho, y
para darle la seguridad que el HTML no tiene. Desde que apareci Java en la red
se ha empezado a hablar de nmeros de tarjetas de crdito y de inform aciones
seguras, lo cual ha entusiasm ado a las m ayores sociedades m undiales que han
transform ado la vieja Internet, prerrogativa de las universidades y centros de
investigacin, en el m edio actual de comunicacin abierto a todos.
El lenguaje de program acin Java se cre a m ediados de los noventa, es el m s
reciente entre sus sem ejantes, y por eso se encuentra en fase de evolucin,
hasta el punto que todos los aos sale una nueva versin.
Creado como lenguaje exclusivam ente para la red se ha convertido en un
autntico lenguaje de programacin paragonable, desde el punto de vista de la
funcionalidad, al famoso C++.
Java y la m ayor parte de los otros lenguajes pueden compararse slo desde el
punto de vista funcional; y esto porque son fundam entalmente diferentes, ya
que Java recopila las fuentes de sus programas en un cdigo llam ado Bytecode
distinto del aparato en el que se ha compilado, mientras que lenguajes como
C++ recopilan las fuentes de los program as en un cdigo que es a su vez cdigo
del aparato (como aparato se entiende ordenador + sistem a operativo) en el que
se ha realizado. Por lo tanto, para poner en m archa un program a Java es
necesario contar con un instrum ento llam ado Java Virtual Machine que interpreta
el bytcode generado por el recopilador Java y lo ejecuta en el aparato en el que
se ha instalado. Gracias al Java Virtual, Java es independiente de la plataforma,
es decir, que el program a recopilado Java est unido a la JVM y no al sistem a
operativo, por eso ser posible poner en marcha el mismo program a Java,
recopilado una sola vez en un aparato cualquiera con un recopilador Java versin
X, en una plataforma Windows y en una plataform a Linux, sin embargo para
hacer eso se necesita que Windows y Linux instalen un aparato Java Virtual que
apoye la versin X de Java. Las dos JVM, instaladas en las dos plataformas
distintas, son el mismo program a recopilado una vez por Windows y otra vez por
Linux, como ocurra con los program as escritos en lenguajes como el C/C++.
Un aparato Java Virtual est instalado tambin en los distintos Browser (como
Netscape y Explorer) para poder poner en m archa los program as Java que se
encuentran en la red, los apliques.
Pero esto, debido a que Java sigue evolucionando, provoca obvios problem as de
compatibilidad, siempre ocurre que el Browser m s moderno contiene una
versin precedente de Java con respecto a la ltima versin de la Sun
Microsystem. Adem s, hay que tener en cuenta que no todos los usuarios de
Internet navegan usando la ltima versin de Netscape o de Explorer. Por eso,
cuando queremos crear un aplique e insertarlo en un documento HTML, hay que
tener en cuenta estos problem as e intentar disear un program a que sea
compatible con la m ayor parte de los JVM implem entados en los distintos
browser.
Otro problem a al que hay que enfrentarse es el de la eleccin del recopilador
Java a utilizar, ya que existen varios ambientes integrados para editar, recopilar,
sealado, el Java tiene que ser interpretado, as las instrucciones Java antes de
ser ejecutadas por el aparato tienen que ser interpretadas por la JVM; es decir,
que para ejecutar cada instruccin el ordenador realizar un nm ero de
instrucciones que es el doble de las instrucciones que realizara si la mism a
instruccin estuviera escrita en C. Por lo tanto, necesitaris ordenadores rpidos
para ejecutar cmodam ente los program as Java, y de esto os habris percatad o
seguramente navegando por la red. Tam bin la m emoria es importante, se
compila y se ejecuta tambin slo con 32MB de RAM, pero para hacer las cosas
con rapidez son necesarios al menos 64, tened en cuenta que el ltimo ambiente
integrado de la Borland, el Jbuilder 3, tiene como requisito m nimo de RAM 96
Megabyte.
Para acabar vuelvo al Java Developm ent Kit de la Sun Microsystem, con ste es
posible producir todo el software que se quiera sin tener que pagar los derechos
de uso del producto, como sucede con el Borland Jbuilder, el Sym antec Cafe, y el
Microsoft Visual Java. Os aconsejo que leais la licencia de uso que encontraris al
bajar el JDK antes de empezar a producir el software.
Llegados a este punto podemos empezar.
form a que los lenguajes "norm ales", pero tanto los datos
como las funciones que los trabajan se organizan en
estructuras llam adas clases.
Las clases son prototipos de objetos, es decir, son
estructuras abstractas (no dem asiado, como veremos) que
se pueden instalar y, por eso, crear un objeto (pero tam bin
m s de uno).
La clase define todas las propiedades de los objetos que
pertenecen a aquella clase, llam adas atributos, y las
funciones que se usarn para actuar sobre ellos, llamados
m todos. Por ejemplo es posible definir una clase de las
personas como sigue:
Inicio clase personas
Atributo aodenacimiento
Mtodo calculaedad (aocorriente)
Fin clase personas
La clase de las personas establecida de esta forma tiene un
atributo que es aodenacimiento, que es seguram ente un
nm ero entero, y un mtodo que, basndose en el ao
corriente que le pongamos, calcula la edad de la persona.
Usando el formalismo de Java, para definir la clase personas
tendremos que escribir:
clase personas
{
public ent aodenacimiento;
public ent calcula edad ( ent aocorriente )
{
enva ( aocorriente - aodenacimiento );
}
}
Como acabamos de ver explicamos tanto el mtodo cuanto
el atributo como public. Veremos ahora lo que significa y
veremos tambin la clase em pieza por { y acaba por }, lo
mismo pasa con los m todos. Esto nos recuerda m ucho al C,
y hay que decir que la sintaxis de Java es m uy sim ilar, casi
igual, a la de C, mientras que para los que no conocen el C,
los corchetes representan el empezar y el terminar del
lenguaje pascal. La clase tendr un llam ado constructor (uno
o m s) que es un mtodo peculiar que norm almente se
utiliza para inicializar los atributos cuando se establece la
clase de un objeto. Es una funcin que no tiene ningn tipo
de return y tiene el mismo nombre que la clase. Decimos
que puede haber ms de un constructor, sin embargo, el
nombre del constructor tiene que ser el m ismo que el de la
clase. A los que estn acostumbrados a program ar con
lenguajes no orientados a los objetos, todo esto les puede
resultar algo raro, sin em bargo es posible porque Java
realiza el llam ado overloading de funciones, es decir
funciones con el mismo nombre que tienen parm etros
diferentes (en el lenguaje inform tico se llam an parm etros
form ales) son distintas, y a la hora de establecerlas se elige
la funcin basndose en el parm etro (llam ado parm etro
actual).
Esto vale para todos los m todos, no slo para los
constructores.
clase personas
{
public ent aodenacimiento;
public String Apellidos=new String();
// Constructores
public personas(ent aodenacimiento)
{
this("No s");
this.aodenacimiento=aodenacimiento;
}
public personas(String Apellidos)
{
this(0);
this.Apellidos=Apellidos;
}
public personas(ent aodenacimiento , String Apellidos)
{
aodenacimiento=aodenacimiento;
this.Apellidos=Apellidos;
}
// Funcin que calcula la edad del sujeto;
public int calculaedad ( ent aocorriente )
{
return ( aocorriente - aodenacim iento );
}
}
im port java.lang.System ;
La clase System , a su vez, contendr en su interior una import
java.io (que es el paquete inform tico para la entrada y la
salida) para acceder a las clases de la entrada y de la salida, y
las usar para m andar lo que queramos en la pantalla.
Vimos un ejemplo de paquete inform tico que en su interior
llam a a otro paquete inform tico para que lleve a cabo unas
tareas. En estas bibliotecas Java ocurre eso a m enudo y es
precisam ente este fenmeno que hace de Java un lenguaje
incomprensible para la mayora. Sin embargo, superado este
inconveniente que se refiere a este aspecto del lenguaje, la
program acin se hace fcil e inm ediata.
He introducido el paquete inform tico java.lang. Ahora os digo
tam bin que este es el m s importante de Java, en ste estn
contenidos las clases fundamentales del lenguaje, hasta el
punto de que no hace falta declarara el import, porque Java lo
introduce autom ticam ente.
Adem s me gustara detenerm e en un aspecto fundam ental de
la introduccin de los paquetes inform ticos. Si importo en mi
archivo el paquete inform tico java.lang, ste importar a su
vez el paquete inform tico java.io, y yo desde mi archivo no
podr usar las clases de java.io; para hacerlo tengo que
im portarlo explcitam ente. Esto sucede aunque programe una
aplicacin en m s de un archivo (con m s clases), en cada
archivo tengo que importar los paquetes inform ticos que
necesito para la clase que estoy estableciendo, no basta con
im portarlos en una sola. Veamos pues las clases que contiene
este paquete inform tico java.lang tan importante para el
lenguaje:
Boolean
hem os dicho que los tipos de datos se pueden representar
tam bin con objetos dichos;
contenedores
es una clase que genera los contenedores para los tipos de
datos boolean (verdadero, falso).
Byte
es la clase que genera los contenedores para los tipos de datos
enteros cortos (de un byte).
Character
es una clase que genera los contenedores para los tipos de
datos caracteres.
Character.Subset
es la clase que genera los contenedores para los tipos de datos
caracteres con codificacin unicode.
Character.UnicodeBlock
es la clase que genera los contenedores para los tipos de
caracteres con codificacin unicode 2.0.
Class
representa las clases y las interfaces a runtime (en ejecucin),
en Java es posible, en tiempo de ejecucin, crear, ejecutar y
compilar clases. El compilador y el ejecutor se m ezclan de una
form a rara, sin embargo a nosostros no nos sirven estas clases
"especiales" porque escribiremos unas aplicaciones fciles.
ClassLoader
Package
contiene m todos para extrapolar inform aciones en los paquetes
informticos de Java.
Process
Java es un lenguaje que permite gestionar Thread, es decir
pequeos program as que corren en paralelo. Esta clase se
ocupa de ellos, como las dem s clases de java.lang: Runtim e,
Runtim ePermission, Thread, ThreadGroup, ThreadLocal,
Throwable
SecurityManager
para la seguridad
Short
es la clase que genera los contenedores para los tipos de datos
enteros cortos.
String
es la clase que genera los contenedores para los tipos de datos
cadenas de caracteres.
StringBuffer
es la clase que genera los contenedores para los tipos de datos
cadenas de caracteres modificables.
System
es la clase que interacta con el sistem a y contiene muchos
m todos tiles, y unas referencias a otras clases (llam adas class
field), es la que usaremos, por ejemplo, para crear una salida
sobre la pantalla a caracteres.
Void
es la clase que genera los contenedores para los tipos de datos
void, es decir, sin tipo. ste parece un tipo de dato intil, sin
embargo veremos que no lo es en absoluto, adem s es
utilsimo. En realidad, es til cuando queremos definir un
m todo-procedimiento (un m todo que no tiene valor de
vuelta), en Java existen slo dos funciones que obligan a
devolver un valor del tipo que declaran. Declarando un m todo
como void, se simula el procedimiento, es decir, no se necesita
la vuelta.
("*************************************************")
;
System .out.println (" |||||");
System .out.println ("0/ x x \\0");
System .out.println (" | o |");
System .out.println (" |\\___/|");
System .out.println (" |_____|");
}
}
Llegados a este punto, slo m e queda felicitaros: acabis de
escribir vuestro prim er programa en Java. Si os parece poco, no
os procupis: a partir del capttulo sucesivo veremos las
construcciones y entonces nos desahogaremos escribiendo todos
los program as que queramos.
\f form feed
\\ es el carcter backslash
\' comilla
\" comillas
\ddd es un char que emplea el valor octal (d son cifras octales,
por ejemplo \329, tienen que ser de tres o m enos cifras y
m enores de \377), se puede dar tambin la representacin
exadecim al, siem pre de cuatro cifras. Aqu ponemos en orden
los caracteres citados antes con su nmero exadecimal:
\u000A, \u0009, \u0008, \u000D, \u000C, \u005C, \u0027 y
\u0022.
Las cadenas se escriben entre com illas, como por ejemplo
"Pietro" y todas las secuencias de escape vlidas se pueden
introducir en una larga cadena, creando cosas interesantes
como, por ejemplo:
System .out.println("\tNombre:\tPietro\n\tApellido:\tCastellucci
" );
dar este resultado:
Nom bre: Pietro
Apellido: Castellucci
Variables
Las variables son valores modificables, es decir, son nombres que representan un
valor de cierto tipo y el valor asociado al nombre se puede variar. Por ejemplo, si
digo que X es una variable de tipo entero y despus digo que tiene valor 10,
escribiendo la expresin 5 + X es como si escribiera la expresin 5 + 10. De todas
form as creo que todos vosotros tenis familiaridad con las variables porque son lo
principal de cada lenguaje de program acin. Dicho esto, vamos a ver como Java
trata las variables.
En prim er lugar, antes de utilizarla, una variable se tiene que escribir. En Java la
escritura de una variable est compuesta por tres partes: modificadores, tipo e
indentificadores.
Los modificadores son una opcin y son los que establecen el acceso a las
variables, es decir, a los public particulares y protegidos que vimos en el captulo
anterior. stos se llam an modificadores de acceso y los hay estticos, sincronizados
y finales. No es importante ponerlos en rden, aunque s es importante utilizar
siempre el mismo rden para que sea legible el cdigo. Esttic tambin lo vimos:
nos permite escribir atributos y mtodos constantes que se pueden invocar incluso
antes de que un objeto se escriba. Final, en cambio, quiere decir que, cuando se
utiliza un valor, ste se puede unir slo una vez a un campo porque es tambin una
constante. El modificador sincronizado lo dejaremos de lado: basta con indicar que
sirve para decir que a un mtodo, en el caso de una multiprogram acin (con los
thread), se puede acceder a travs de una exclusin mltiple, es decir, un thread a
la vez.
Los identificadores pueden ser uno o m s, estn separados por una com a y son
nombres que tienen variables. Por ejemplo, la escritura de X en el ejemplo anterior
se convertir en:
ent X;
pero, tambin puedo escribir m s de uno. Por ejem plo, la siguiente escritura se
considera vlida:
ent X,Y,Z;
doble W=3.12;
Como son atributos de las clases tienen que escribirse dentro de los m ismos;
escribirlos fuera de ellos se considera un error.
Como se puede ver en el ejemplo, tambin es posible inicializar una variable en el
momento en el que la creamos: sm plem ente hay que aadir, despus del nombre,
el signo igual y el valor que tom a.
Despus de la escritura de la variable y su inicializacin, el identificador de la
variable, en cualquier lugar que se haya escrito, se entiende como su valor actual,
excepto si le damos un nuevo valor. Por ejemplo, si escribo X = 10 m e refiero a la
variable X y no a su valor, y con el signo igual 10 m e refiero a que el nuevo valor
de la variable es 10.
Si despus escribo:
X = X+1;
con la X a la izquierda del signo igual m e refiero a que la variable se llam a X,
mientras que con la X a la derecha me refiero al valor actual de la variable X. La
expresin X+1, entonces, en este caso ser
10 + 1 y entonces 11, es decir por X = X + 1, he dicho X = 11;
Provad este pequeo program a que hace unos calculos:
class p
{
ent X,Y,Z;
double W = 3.12;
public double A = 15;
static int B = 101;
private final int C = 2;
protected static boolean D = true;
public p()
{
X= 10 ;
Y= X ;
Z= X + Y ;
System .out.println ("Al\'principio tengo: X="+X+", Y="+Y+", Z="+Z);
X= X + 1 ;
Y= Z - X;
System .out.println ("Hago las operaciones: \nX= X + 1 ;\nY= Z - X;\ned
resultado:");
{
int X,Y,Z;
// Main
public static void m ain(String [] a)
{
decl2 Prueba=new decl2();
}
// Constructor
public decl2()
{
X= 10 ;
Y= X ;
Z= X + Y ;
System .out.println ("Al\'inicio tengo: X="+X+", Y="+Y+", Z="+Z);
X= X + 1 ;
Y= Z - X;
System .out.println ("Hago las operaciones: \nX= X + 1 ;\nY= Z - X;\ned
resultado:");
System .out.println ("X="+X+", Y="+Y+", Z="+Z);
}
}
En este segundo ejemplo, editado y redactado en decl2.java, no se entiende bien
cundo vemos decl2 como clase y cundo como objeto. Realm ente el main est en
la clase y en l se crea el objeto. Por tanto se invoca el constructor y dentro de l
razonamos en trminos de objeto creado. De todas form as, es posible y veris que
el program a funciona tam bin en este caso. Algn da, cuando tengis m s
fam iliaridad con el lenguaje, podris hacerlo vosostros tam bin. De momento no os
lo aconsejo porque es fundam ental, llegados a este punto, distinguir bien entre
clases y objeto, y esto se consigue fcilm ente con mucha experiencia.
Los identificadores Java tienen que empezar por una letra (o con _ o $) seguida por
una secuencia larga de caracteres y cifras elegidas a vuestro antojo. Las cifras,
codificadas en Unicode, son mucho m s num erosas que las letras y que las cifras
ASCII utilizadas por otros lenguajes. Lo siento, pero no tengo un m apa completo de
los caracteres unicode que dejaros, pero puedo deciros que estn incluidos los
caracteres griegos, cirlicos, rabes, etc.
Ahora vam os a ver cmo escribir e inicializar un array. La escritura se hace
ponindo un par de corchetes despus del tipo:
ent [] vectorDeEnteros;
Los array en Java son casi objetos, slo que no pueden extenderse para aadirles
nuevos m todos. Lo que acabamos de citar es una referencia a un array que, sin
embargo, rl lenguaje no ha asignado. Si quiero inicializar el array elem ento por
elem ento, como se hace con los dem s lenguajes, tengo que escribir las
dim ensiones:
Nm ero=Nm ero+1;
PersonajeTmp=TRIBILN;
System .out.println("Nm ero:"+Nm ero+"\tNombre:"+personajes[PersonajeTmp][N
OMBRE]+" Apellidos:"+personajes[PersonajeTmp][APELLIDOS]);
Nm ero=Nm ero+1;
PersonajeTmp=GILITO;
System .out.println("Nm ero:"+Nm ero+"\tNombre:"+personajes[PersonajeTmp][N
OMBRE]+" Apellidos:"+personajes[PersonajeTmp][APELLIDOS]);
Nm ero=Nm ero+1;
PersonajeTmp=RATN;
System .out.println("Nm ero:"+Nm ero+"\tNombre:"+personajes[PersonajeTmp][N
OMBRE]+" Apellidos:"+personajes[PersonajeTmp][APELLIDOS]);
System .out.println("HiCe los clculos "+Nm ero+" personajes, y eran muchos
m s");
// ste s es un program a realmente intil. El autor.
}
}
Un pequeo com entario sobre el program a. Os habis dado cuanta de que en el
m ain se establecen unas variables (es posible hacerlo): norm almente se usan sin
redactarlas como static porque las variables del m ain, o de una funcin, por lo
general, no son atributos y, por eso, no estn relacionados con el objeto o con la
clase, sino slam ente con la funcin en la que se escriben. En estas definiciones no
estn incluidos los modificadores porque estos se asocian a las clases.
Llegados a este punto nos queda por ver los tipos compuestos que se pueden
fcilmente identificar ahora con las clases. Por ejemplo, si queris definir el tipo
compuesto Complejos, escribiremos:
clase Complejos
{
private double ParteReal;
private double ParteImaginaria;
Complejos (double Re, double Im)
{
ParteReal=Re;
ParteImaginaria=Im;
}
// ahora estableceremos todos nuestros obvios m todos en el nuevo tipo
double dmeParteReal()
{
return ParteReal;
};
double dmeParteIm aginaria()
{
return ParteIm aginaria;
};
double calculaMdulo()
{
return (java.lang.Math.sqrt((ParteImaginaria*ParteIm aginaria)+
(ParteReal*ParteReal)));
};
}
Para probar, podis escribir los siguiente(pruebaComplejos.java):
clase pruebaComplejos
{
public static void m ain (Cadena[] arg)
{
Complejos N=nuevo Complejos(3.0,1.1);
double Re=N.dm eParteReal();
double Im=N.dm eParteImaginaria();
double mod=N.calculaMdulo();
System .out.println("Nm ero complejo:"+Re+"+i"+Im +" tiene "+mod);
}
}
Operadores
Los operadores del enguaje Java son los mismos que los de
los dem s lenguajes, adem s cada nuevo tipo tendr su
proprio m todo que incluyen nuevos operadores, como
vim os en el ejemplo de la clse Complejos.
Analizamos los operadores de acceso a las clases y a los
objetos, es decir, simplem ente el punto. Si queremos entrar
en el campo X del objeto x, simplem ente tendremos que
escribir x.X, aunque x tenga un mtodo Y(ent valor),
nosostros entramos o, mejor en este caso, lo solicitamos
escribiendo x.Y(39); Tenemos los operadores aritmticos de
siempre: +,-,*,/ y %.
Hay que tener en cuenta tam bin las operaciones son
tipadas, es decir, si sumo dos enteros el resultado es un
valor entero y as para todas las operaciones, de form a que
si tenemos una expresin siempre es posible establecer el
tipo de resultado.
Java ejerce un fuerte control sobre los tipos. De hecho, no es
posible asignar un carcter e un entero, lo que es posible en
el lenguaje C, y adem s es imposible asignar un double a un
float sin un casting explcito. El casting obliga a un valor de
un tipo a tener un tipo distinto. Si escribo 5, m e refiero a un
entero, mientras que si hago un cast a float me refiero a la
versin de 5 real y para hacerlo tendr que escribir(float) 5.
De esta form a puedo asignar los enteros a reales y de reales
double a relaes float. Pensemos, por ejemplo en:
double v1=10.0;
float v2;
ent v3=5;
y pensemos en las siguientes asignaciones equivocadas:
v2=v1;
v1=v3;
Si hacemos unos cast, se convierten en exactas tambin
para Java:
v2=(float) v1;
v1=(double) v3;
Hay que notar la divisin de los enteros que en otros
lenguajes da un entero. Por lo tanto, si queremos el nm ero
real que resulta de la divisin de los dos nm eros enteros x
e y, antes hay que transform arlos en nm eros reales:
float resultado= (float ) x / (float) y;
Para las cadenas hay un operador de encadenamiento:
cadena a="Pietro " ;
Cadena b= a + "Castellu";
Cadena b+="cci"
El resultado ser Pietro Castellucci. El operador es el signo
+. En un momento dado, utilizamos una asignacin
particular, es decir, += que es una abreviacin. Si tengo que
escribir a=a+1; puedo abreviar y escribir a+=1, que es lo
mismo. Lo mismo vale para cada operador binario. El
Por ejemplo:
X=10;
Y=X++;
dar como resultado X=11 e Y=10. Intendad editar y poner
en m archa lo siguiente clase incdec
{
public static void m ain(Cadena [] a)
{
ent X,Y,Z,W,V;
X=10;
System .out.println("X="+X);
Y=X++;
System .out.println("Y=X++: tengo X="+X+",Y="+Y);
Z=++Y;
System .out.println("Z=++Y: tengo Z="+Z+",Y="+Y);
W=Z--;
System .out.println("W=Z--: tengo W="+W+",Z="+Z);
V=--W;
System .out.println("V=--W: tengo V="+V+",W="+W);
}
}
Otros operadores son los de comparacin, es decir:
> m ayor de, x>y nos da verdadero si x es m ayor que y, en
caso contrario, nos da falso
>= m ayor o igual a, x>=y nos da verdadero si x es m ayor o
igual a y, en caso contrario nos da falso
< m enor de, x<y nos da verdadero si x es menor de y, en
caso contrario, nos da falso
<= m enor o igual a, x<=y nos da verdadero si x es menor o
igual a y, en caso contrario, nos da falso
== igual a, x==y nos da verdadero si x es igual a y, en caso
contrario, nos da falso
!= diferente, x!=y nos da verdadero si x es diferente de y,
en caso contrario, nos da falso
Tenemos tambin los operadores lgicos &&, || y !, que
representan la conjuncin y, la disjuntiva o y el no:
Establecidos los valores booleanos x e y , x && y ser
verdadera si x e y lo son tambin; ser falsa si no lo son (si
las dos son falsas o si una es verdadera y la otra falsa).
Instrucciones
subinstruccin2;
..
subinstruccin;
}; // es la instruccin j
instruccin j+1;
.
instruccin n;
}// Este bloque puede ser el cuerpo de un mtodo o un
bloque
Pensad en el m todo:
void tribiln()
{
ent j=0;
{
ent k=0;
k++; // instruccin A
};
j++; // instruccin B
k++; // instruccin C
}
La instruccin A no da problem as porque usa una variable
local que est inicialidada, declarada en su mismo bloque.
Con la instruccin B ocurre lo mismo, mientras la instruccin
C est equivocada porque la variable que utiliza se ha
declarado en un bloque entero y no se puede ver
externam ente. Si en el bloque interno hubiera escrito j++;
no tendra ningn problema porque la variable j se habra
declarado en un bloque externo. (Dentro se ve lo que hay
fuera, pero fuera no se puede ver lo que hay dentro, lo cual
ocurre en todos los lenguajes de program acin por bloques).
Acabamos de ver en el ejem plo que tambin j++ es tanto
Bloque;
{
if (ALGO) break;
}
}
}
En este caso se sale del while interior, mientras:
{
tribiln: while ( COND )
{
while (COND2)
{
if (ALGO) break tribiln;
}
}
}
se sale de los dos while.
Instruccin de continue
En un ciclo se salta todas las instrucciones que le siguen y
evala directam ente la expresin booleana, por ejemplo:
while (Condicin)
{
instrucciones;
if (GolpeDeEfecto) continue;
otras instrucciones;
};
Se entra en el ciclo, se ponen en marcha las instrucciones. Si
GolpeDeEfecto es verdadero, salta otras instrucciones y llega
a evaluar Condicin. Si sta tambin es verdadera, contina
class Fibo
{
public static void m ain (Cadena[] args)
{
ent bajo=1, alto=1;
// ent alto=1;
System .out.println (bajo);
while (alto<500)
{
System .out.println(alto);
alto+=bajo;
bajo = alto - bajo;
};
}
}
Para que os entrengis, podis intentar hacer un program a
que calcula 10 ! , sabiendo que 1! = 1 y que establecido n
entero, n! = n * ((n-1)!). La solucin se encuentra en el
archivo Fatt.java.
Ahora, intentamos escribir nuetra criba de Eratstenes hecho
en casa, es decir, una forma para calcular todos los nmeros
primos hasta un nm ero establecido, digamos 100;
El algoritmo procede as,
1 es un nm ero primo.
2 es un nm ero primo, le quito sus mltiplos
3 es un nm ero primo, le quito sus mltiplos
etctera hasta encontrar mi mximo.
clase Eratstenes
{
static ent MX=1000;
ent [] nmeros = nuevo ent[MX];
boolean [] primos = nuevo boolean[MX];
public Eratstenes()
{
ent e;
for (e=0;i<MAX;e++)
{
nm eros[e]=e+1;
primos[e]=verdaderos;
};
}
void elMul(ent a)
{
for (ent j=2;j*a<=MX;j++)
primos[(j*a)-1]=falso;
}
ent siguiente(ent n)
{
ent tmp=n;
while (!primos[tmp]) {
tmp++;
if (tmp>=MX) break;
}
return tmp+1;
}
void calculaPrimos()
{
ent nm=2;
while (nm <=MX)
{
elMl(nm);
nm =siguiente(nm );
};
}
void escribaPrimos()
{
System .out.println("Los nmeros primos hasta "+MX+"
son:");
for (ent e=0; e < MX ; e++)
if (primos[e]) System .out.print(nmeros[e]+" ");
}
public static void m ain(Cadena[] args)
{
Eratstenes e = nuevo Eratstenes();
e.calculaPrimos();
e.escribaPrimos();
}
}
try
BLOQUE // ste es un bloque peligros porque puede poner
en m archa unas excepciones. catch (Tipo de Excepcin que
hay que coger)
BLOQUE // ste es un bloque de restablecimiento. catch
(Tipo de Excepcin que hay que coger)
BLOQUE // ste es un bloque de restablecimiento.
.
finally
BLOQUE
El corpus de esta instruccin se ejecuta hasta el final o hasta
que aparezca una excepcin. En caso de excepcin, se
analizan las clusulas catch para ver si existe un
adm inistrador para esa excepcin o para una de sus
superclases. Si ninguna clusula catch recoge esa excepcin,
sta vuelve a lanzarse en el m todo que la ha provocado
(que la ha ejecutado).
Si en el try hay una clusula finally, su cdigo se pone en
m archa despus de que se hayan completado todas las
dem s operaciones del try, independientem ente de que sta
haya ejcutado una excepcin o no. Por ejemplo, nuestro
m todo Imprim ir se puede invocar as:
Si X es la cadena que hay que imprimir:
try {Imprim ir(X);}
catch (ErrorCadenaVaca e)
{System .out.println ("Lo siento");}
En este caso, si X es nulo, se pondr en m archa la excepcin
y se recoger; despus se imprimir la cadena Lo siento, si
El paquete java.lang
El Paquete lang
Este paquete lo vimo antes. Ahora, sin embargo,
analizaremos algunas funciones que antes no vimos. En
prim er lugar, hay que decir que ste es uno de los paquetes
m s importantes de la API Java. Abarca muchsim as clases e
interfaces fundam entales para la program acin Java, tanto
que este paquete se incluye atom ticam ente en nuestros
program as. Su contenido es::
Intefaces
Cloneable
Comparable
Runnable
Clases
Boolean
Byte
Character
Character.Subset
Character.UnicodeBlock
Class
ClassLoader
Compiler
Double
Float
InheritableThreadLocal
Integer
Long
Math
Num ber
Object
Package
Process
Runtim e
Runtim ePermission
SecurityManager
Short
String
StringBuffer
System
Thread
ThreadGroup
ThreadLocal
Throwable
Void
Excepciones
Arithm eticException
ArrayIndexOutOfBoundsException
ArrayStoreException
ClassCastException
ClassNotFoundException
CloneNotSupportedException
Exception
IllegalAccessException
IllegalArgumentException
IllegalMonitorStateException
IllegalStateException
IllegalThreadStateException
IndexOutOfBoundsException
InstantiationException
InterruptedException
NegativeArraySizeException
NoSuchFieldException
NoSuchMethodException
NullPointerException
Num berForm atException
Runtim eException
SecurityException
StringIndexOutOfBoundsException
UnsupportedOperationException
Errores
AbstractMethodError
ClassCircularityError
ClassForm atError
Error
ExceptionInInitializerError
IllegalAccessError
IncompatibleClassChangeError
InstantiationError
InternalError
LinkageError
NoClassDefFoundError
NoSuchFieldError
NoSuchMethodError
OutOfMemoryError
StackOverflowError
ThreadDeath
UnknownError
UnsatisfiedLinkError
UnsupportedClassVersionError
VerifyError
VirtualMachineError
En el prim er captulo vimos las clases que incluyen los tipos
primitivos incluidos en este paquete. En este apartado
analizaremos unas clases que hacen cosas m s complejas.
La prim era clase que analizaremos es la clase System , que
relacciona nuestro program a Java con el sistema en el que
se pone en marcha. En prim er lugar, la clase System incluye
tres atributos estticos que son:
static PrintStream err static InputStream in static
PrintStream out
void println(int x)
void println(long x)
void println(Object x)
void println(String x)
los mismos m todos print, y por supuesto, otros.
Lo mismo vale para err, que es tam bin parecido a un out
del tipo PrintStream . ste se usa para evidenciar los errores
de program a. Es bastante fcil encontrar expresiones como
las siguientes en los programas:
try {System .out.println(cadena+" vs "+otracadena+" = "
+cadena.compareTo(otracadena));}
catch (nullPointerException e)
{System .err.println("ERROR: La segunda cadena es
nula");};
En cam bio, el atributo in es del tipo InputStream , y
representa, como dijimos antes, el estndar input.
Los m todos para actuar sobre l sern, entonces, unos
read:
abstract int read()
int read(byte[] b)
int read(byte[] b, int off, int len)
Como es del tipo InputStream , lee unos byte. Si queremos
que lea otras cosas tenemos que especializarlo en esta otra
cosa. En el siguiente ejemplo, que teclearemos en un archivo
que se llam a StandardIO.java, le haremos leer enteras
lneas.
im port java.io.*;
class StandardIO
{
public static void m ain(String[] tem as)
{
System .out.println("Incluye tus input, teclea end [ENVO]
para salir");
InputStreamReader a=new InputStreamReader(System .in);
BufferedReader IN=new BufferedReader(a);
String s=new String();
while(s.compareTo("end")!=0)
{
try {s=IN.readLine();}
catch (IOException e)
{s="ERROR DE LECTURA";};
System .out.println("Ledo: "+s);
}
}
}
Vamos a ver algunos mtodos de la clase System :
static long currentTim eMillis(), este mtodo nos devuelve el
tiempo en milisegundos
static void exit(int status), este m todo determ ina como salir
de Java Virtual Machine, con un
cdigo .
static void gc(), Java coloca tantos objetos, y los descoloca,
cuando ya no se usan y se necesita nueva
m emoria. Para hacerlo, utiliza un Garbage Collector , y este
m todo pone en m archa el garbage collector en cualquier
momento para liberar la m emoria precedentem ente
establecida por el program a que todava no se ha utilizado.
Puede resultar muy til en aplicaciones muy grandes.
static String getenv(String nam e), nos devuelve una cadena
que incluye inform acciones con respecto al
sistem a con el que se pone en m archa el program a. El
m todo declarado es deprecated en las ltim as
Documentaciones on line del Java Development Kit porque el
m todo pronto desaparecer. Es una de las primeras
versiones del lenguaje y todava aparece porque es
compatible con el viejo software.
static Properties getProperties() , es el nuevo m todo para
obtener informaciones sobre la propriedad del
sistem a.
static String getProperty(String key), como antes, lo nico
es que recoge inform aciones
especficas con respeto a key
static String getProperty(String key, String def)
static void load(String filenam e) , carga en la m emoria el
cdigo incluido en filenam e, que es una
biblioteca dinmica.
static void loadLibrary(String libnam e), carga la biblioteca de
sistem a m encionada por libnam e
static String mapLibraryNam e(String libname), hace un
Clave
java.version
java.vendor
Java Runtime
java.vendor.url
java.hom e
Versin de las
java.vm .specification.version especificaciones de Java
Virtual Machine
Distribuidor de las
java.vm .specification.vendor especificaciones de Java
Virtual Machine
java.vm .version
Distribuidor de la
java.vm .vendor
java.vm .name
java.specification.version
java.specification.vendor
java.specification.nam e
java.class.version
java.class.path
os.nam e
os.arch
os.version
file.separator
path.separator
line.separator
user.nam e
user.hom e
user.dir
{
// Cambio el estndar output, uso el archivo Sistem a.txt
File outFile=new File("Sistem a.txt");
FileOutputStream fw;
try {fw=new FileOutputStream (outFile) ;}
catch (IOException e)
{fw=null;};
long min=t3%60;
long t4=t3/60;
System .out.println("Tiempo en horas h"+t4+" m "+m in+"
s"+sec);
System .out.println("\nEs el tiempo pasado del 1/1/1970
hasta ahora.\n");
// Propiedad del sistem a:
System .out.println("\nPropiedad del sistema:\n");
String tmp;
System .out.println("\n\tJAVA\n");
tmp=System .getProperty("java.version ");
System .out.println("Versin del ambiente de Java Runtime:
"+tm p);
tmp=System .getProperty("java.vendor");
System .out.println("Distribuidor del ambiente di Java
Runtim e: "+tmp);
tmp=System .getProperty("java.vendor.url");
System .out.println("URL del distribuidor de Java: "+tm p);
tmp=System .getProperty("java.hom e");
System .out.println("Directorio donde est instalado Java:
"+tm p);
tmp=System .getProperty("java.class.path");
System .out.println("Pathnam e de las clases de Java:
"+tm p);
System .out.println("\n\tSISTEMA OPERATIVO\n");
tmp=System .getProperty("os.arch");
System .out.println("Arquitectura del Sistem a Operativo:
"+tm p);
tmp=System .getProperty("os.version");
System .out.println("Versin del sistema Operativo: "+tmp);
tmp=System .getProperty("file.separator");
System .out.println("Separador del Archivo: "+tmp);
tmp=System .getProperty("path.separator");
System .out.println("Separador del Pathnam e: "+tmp);
tmp=System .getProperty("line.separator");
System .out.println("New Line: "+tmp);
System .out.println("\n\tUSUARIO\n");
tmp=System .getProperty("user.nam e");
System .out.println("Account nam e del usuario: "+tmp);
tmp=System .getProperty("user.home");
System .out.println("Hom e directory del usuario: "+tmp);
tmp=System .getProperty("user.dir");
System .out.println("Working directory del usuario: "+tmp);
}
}
Puesto en marcha en mi sistem a, el output fue
(Sistem a.txt):
Tiempo en milisegundos: 956241233430
Tiempo en segundos: 956241233
Tiempo en horas h265622 m 33 s53
Es el tiempo transcurrido del 1/1/1970 hasta ahora.
CLASSI
SISTEMA OPERATIVO
New Line:
USUARIO
Transformaciones de ngulos
Potencias y races
una raz(1/b)-esim a de a
Nm eros pseudocasuales
Redondeos
Il package java.util
Antes de empezar esta leccin tengo que hacer una pequea advertencia.
Hemos visto como hay que program ar usando Java, pero m e he dado cuenta de
que los teclados italianos no tienen tienen llaves, en cambio en los teclados que
uso yo s que aparecen. Por lo tanto os tengo que decir cmo podis hacer
aparecer estas llaves en vuestras pantallas.
Para que aparezca { hay que pulsar el teclado ALT, y m antenindolo pulsado hay
que teclear en el pequeo teclado numrico que est a la derec ha el nm ero 123
(ALT+123).
Para que aparezca } hay que teclear en cambio ALT+125.
Para los otros smbolos tiles en Java:
ALT Gr + es el de [ y ALT Gr + + de ]. Las teclas estn subrayadas para no
confundirlas con el signo + que indica che indica "pulsar a la vez". ALT Gr es el
ALT que se encuentra a la derecha de la tecla ESPACIO, m ientras que ALT se
encuentra a la izquierda (mirando al teclado).
Este paquete es muy til porque pone a disposicin 34 clases y 13 interfaces que
im plem entan algunas de las estructuras de datos m s comunes. Algunas
operaciones sobre fechas y sobre el calendario, y otras cosas.
Adem s el paquete java.util incluye otros subpaquetes que son: java.util.m ime,
java.util.zip y java.util.jar que sirven respectivam ente para tratar archivos de
tipo MIME, de tipo ZIP y de tipo Java Archive (JAR), que veremos en seguida en
este captulo. Como estructura de datos, en inform atica, se llam a a la estructura
lgica lista para contenerun cierto nmero de datos en la que es posible insertar
un datos, quitarlos, buscarlos, como m ucho ordenarlos. Una simple estructura de
daots que ya hemos visto es la array. Esta contiene un nm ero cero de datos
que pueden ser cualquier cosa, desde byte a objetos complejos, y sobre la
mism a se pueden incluir otros datos, hacer bsquedas o borrar, incluso un array
se puede ordenar.
Para ve si en un array grande N est presente un dato X, yo tengo que visitar
todo el array y hacer comparaciones con cada elemento del array, por lo que
esta es una operacin bastante compleja. Existen estructuras de datos que esta
bsqueda la hacen empleando un solo acceso a la estructura, estas son, por
ejem plo las citadas tablas hash. La eleccin de las estructuras de datos para
usar en un program a es bastante complicada, por ello se elige una estructura en
lugar de otra dependiendo del uso que se vaya hacer en el program a. Por
ejem plo es difcil que en un database m uy grande en el que se hacen muchas
bsquedas se use un array como estructura de datos, porque empleaream os
mucho tiempo para cada bsqueda (el ordenador es rpido, pero tiene sus
lm ites si pensamos que ste emplea tanto tiempo para visitar completam ente
un database de mil millones de elementos), en este caso lo m ejor tal vez sea
emplear una tabla hash de cierta grandeza.
Java, por tanto, pone a disposcin del usuario toda una gam a de estructuras de
datos, las gestiona, y a nosotros no nos queda m s que usarlas. Para la eleccin
de las estructuras de datos ms acorde con nuestras intenciones, usarem os
nuestro buen hacer porque, para elegirla de form a rigurosa son necesarios
conocim ientos especficos, entre otros los detalles que se realizan en las
estructuras, estudiadas en cursos universitarios, como los algoritmos y
Estructuras de Datos, y Fundam entos de Complejidad.
Cuando describa las clases de Java que se ocupan de la implem entacin de estas
estructuras, las indicar y tratar los tiempos de insercin, las bsquedas,
etctera, pero siempre inform alm ente.
Vamos a ver qu incluye el paquete java.util
Interfaces
Collection
Comparator
Enum eration
EventListener
Iterator
List
ListIterator
Map
Map.Entry
Observer
Set
SortedMap
SortedSet
Estas interfaces establecen algunas propiedades de nuestras estructuras de
datos. Se implementan en algunas de las siguientes clases.
Clases
AbstractCollection
AbstractList
AbstractMap
AbstractSequentialList
AbstractSet
ArrayList
Arrays
BitSet
Calendar
Collections
Date
Dictionary
EventObject
GregorianCalendar
HashMap
HashSet
Hashtable
LinkedList
ListResourceBundle
Locale
Observable
Properties
PropertyPermission
PropertyResourceBundle
Random
ResourceBundle
SimpleTim eZone
Stack
StringTokenizer
Tim er
Tim erTask
Tim eZone
TreeMap
TreeSet
Vector
WeakHashMap
Excepciones
ConcurrentModificationException
Em ptyStackException
MissingResourceException
NoSuchElem entException
TooManyListenersException
Em pezamos viendo algunas estructuras: BitSet, o en espaol Conjunto de Bit.
Esta clase ofrece una forma para crear y gestionar conjuntos bit (1,0) o mejor
dicho, valores verdadero, falso.
El conjunto es desde luego un vector de bit pero que crece dinm icam ente. Al
principio los bit tienen un valor falso, y el vector mide 2^32-1 ((dos elevado a la
treinta y dos) m enos uno).
La clase tiene dos constructores: BitSet(), para crear un BitSet de dim ensiones
estndar, y BitSet(int nbits), para crear un BitSet que contiene nbits bit.
Las operaciones que se pueden hacer son:
void and(BitSet set), devuelve el and entre el BitSet y el otro BitSet localizados
por set.
void andNot(BitSet set), borra todos los bit de la BitSet que tienen el
correspondiente bit ajustado en la BitSet set.
void or(BitSet set), devuelve el or exclusivo entre el BitSet y el otro BitSet
localizados por set.
void xor(BitSet set) , devuelve el or exclusivo entre el BitSet y el otro BitSet
localizados por set.
void clear(int bitIndex), ajusta el bit especificado en falso.
void set(int bitIndex), ajusta el bit especificado en verdadero.
Object clone(), BitSet se declara Cloneable. Este m todo crea una copia igual.
boolean equals(Object obj), compara el objeto con otro objeto.
boolean get(int bitIndex), da el valor del bit nm ero bitIndex.
int hashCode(), da un cdigo hash para ste bitset.
int length(), da la grandeza lgica del bitset, es decir el bit ms alto ajustado en
verdadero ms uno.
int size(), da el nm ero de bit en el momento de la bitset. Es el bit m s alto que
se puede asignar a uno sin ampliar el bit set.
String toString(), transforma el bitset en una cadena
Probamos el bit set con el siguiente program a CaracteresUtilizados, que hay que
editar en un archivo llam ado CaracteresUtilizados.java, que coge una cadena en
entrada y lee los caracteres que han sido utilizados.
im port java.util.BitSet;
public class CaracteresUtilizados
{
public static void m ain (String[] a)
{
String tmp;
try {tmp=a[0];}
catch (ArrayIndexOutOfBoundsException e)
{errore();}
elabora(a[0]);
}
public static void error()
{
System .out.println("ERROR, necesito una cadena:");
System .out.println("\tTeclear:");
System .out.println("\t\tjava CaracteresUtilizados CADENA.");
System .exit(0);
}
Analizamos otra clase di java.util, la clase Vector. Esta clase implem enta unos
array de Object. Lo interesante de los array del lenguaje, es que se puede
modificar la largura del vector cuando se realiza la puesta en marcha.
En Vector, adem s de los constructores, tenemos tres tipos de mtodos, los que
sirven para modificar el vector, los que sirven para obtener los valores includos
en el vector, y los que sirven para gestionar el crecimiento del vector.
Hay cuatro constructores:
Vector(), construye un vector de tam ao 10, y que tiene la posibilidad de
aum ento igual a cero.
Vector(Collection c), construye un vector que incluye los elem entos de la
coleccin especificada, en el mismo orden en el que aparecen en la coleccin.
Vector(int initialCapacity), construye un vector tan grande como initialCapacity,
con posibilidad de aumento igual a cero.
Vector(int initialCapacity, int capacityIncrem ent), construye un vector grande
initialCapacity, con la posibilida de aum ento igual a capacityIncrem ent.
Algunos m todos de la clase son:
void add(int index, Object elem ent), aade un elem ento al vector en la posicin
indicada.
boolean add(Object o), aade un elem ento al final del vector.
boolean addAll(Collection c), aade al final del vector los elem entos de la
coleccin especificada, en el mismo rden en el que aparecen en la coleccin.
boolean addAll(int index, Collection c), aade los elementos de la coleccin en el
vector empezando por el cdigo especificado.
Estos tres m todos se convierten en verdaderos si los elem entos han sido
aadididos.Se convierten en falsos si no tienen nada que ver.
void addElement(Object obj), aade el elemento al vector y aum enta la
capacidad de uno. int capacity(), da la capacidad actual del vector.
especificado.
boolean removeAll(Collection c), borra del vector todos los elem entos incluidos
en la coleccin especificada void removeAllElem ents(), borra todos los elem entos
del vector.
boolean removeElement(Object obj), borra el primer dato del objeto especificado
en el vector.
void removeElem entAt(int index), borra el elem ento en la posicin especificada.
boolean retainAll(Collection c), borra todos los elem entos del vector que estn
incluidos en la coleccin especificada.
Object set(int index, Object elem ent), sustituye los elem entos en la posicin
especificada del vector con el elem ento que se le da como parm etro (pone el
elem ent en la direccin index).
void setElem entAt(Object obj, int index), pone el objeto especificado en la
posicin que queremos.
void setSize(int newSize), ajusta el nuevo tam ao del vector.
int size(), da el nm ero de posiciones en el vector.
List subList(int fromIndex, int toIndex), crea un listado con los elementos del
vector que se encuentran en la posicin especificada come inicio o como final.
List es otra estructura de datos muy importante que Java lleva ya implem entada.
Object[] toArray() e Object[] toArray(Object[] a), crean un array del lenguaje
con los elem entos incluidos en el vector.
toString(), da una representacin bajo form a de cadena del vector que incluye
las representaciones como cadena de todos los elem entos incluidos en el vector.
Prcticam ente invoca el toString de todos los objetos.
Los que estn acostumbrados a program ar con otros lenguajes de program acin
podrn apreciar la funcionalidad que a m enudo el program ador tiene que
im plem entar l mismo de forma superficial. Lo que yo aprecio personalm ente,
como program ador, es, adem s de la dinam icidad de la estructura de Vector,
que siempre ha sido por definicn esttica, la posibilidad de crear vectores con
elem entos heterogneos. En realidad, stos son vectores de objetos, y sabemos
que los objetos de java pueden ser cualesquiera incluso program as. Por ejemplo,
x=Z;
nombre=n;
}
public String toString()
{
return "\n"+nombre+"="+x+","+y+","+z+"\n";
}
}
class lnea
{
String nombre;
punto inicio;
punto fin;
public lnea(String n, punto i,punto f)
{
inicio=i;
fin=f;
nombre=n;
}
public String toString()
{
return "\n"+nombre+"=("+inicio.toString()+","+fin.toString()+")\n";
}
}
class cara
{
String nombre;
punto x1;
punto x2;
punto x3;
lnea l1;
lnea l2;
lnea l3;
public cara(String n, punto X1,punto X2,punto X3)
{
x1=X1;
x2=X2;
x3=X3;
l1=new lnea(n+"-lnea1",x1,x2);
l2=new lnea(n+"-lnea2",x3,x2);
l3=new lnea(n+"-lnea3",x1,x3);
nom e=n;
}
public String toString()
{
return "\n"+nombre+"={"
+l1.toString()+
","
+l2.toString()+
","
+l3.toString()+"}\n";
}
}
Las clases incluyen unos m todos toString(), que sobrescriben los m todos
estndar para crear el outpu en el archivo del program a.
Las clases las pondremos en un archivo llam ado Geometra.java, donde
pondremos tam bin los import necesarios al program a y las clases Geometra
que incluye el m ain que definimos a continuacin:
im port java.util.*;
im port java.io.*;
// Definicicn de la clase punto
// Definicicn de la clase lnea
// Definicicn de la clase cara
public class Geom etra
{
public static ent NMERO = 3000;
public static void m ain(String[] arg)
{
Vector espacio=new Vector(1,1);
System .out.println();
ent d1=espscio.capacity();
System .out.println ("Capacidad del vector:"+espacio.capacity());
System .out.println("Redacto los puntos...");
ent e=0;
for ( e = 0 ; e
{
float a=(float ) Math.random ();
ent x=Math.round(a*1000);
ent y=Math.round(b*1000);
ent z=Math.round(c*1000);
ent x1=Math.round(d*1000);
ent y1=Math.round(e*1000);
ent z1=Math.round(f*1000);
String nombre="Lnea"+(i+1);
punto P1=new punto ("Punto 1 del "+nombre,x,y,z);
punto P2=new punto ("Punto 2 del "+nombre,x1,y1,z1);
linea tmpL=new linea(nombre,P1,P2);
espacio.addElem ent(tmpL);
};
ent z=Math.round(c*1000);
ent x1=Math.round(d*1000);
ent y1=Math.round(e*1000);
ent z1=Math.round(d*1000);
ent x2=Math.round(g*1000);
ent y2=Math.round(h*1000);
ent z2=Math.round(j*1000);
String nome="Cara"+(e+1);
punto P1=new punto ("Punto 1 del "+nombre,x,y,z);
punto P2=new punto ("Punto 2 del "+nombre,x1,y1,z1);
punto P3=new punto ("Punto 1 del "+nombre,x2,y2,z2);
cara tmpF=new cara(nombre,P1,P2,P3);
espacio.addElem ent(tmpF);
};
System .out.println ("Capacidad final del vector:"+espacio.capacity());
ent d4=espacio.capacity();
Punto 2 de la Lnea1=69,16,0
)
,
Lnea2=(
Punto 1 de la Lnea2=116,651,0
,
Punto 2 de la Lnea2=371,15,0
)
,
Linea3=(
Punto 1 de la Lnea3=947,335,0
,
Punto 2 de la Lnea3=477,214,0
)
,
Lnea4=(
Punto 1 de la Lnea4=391,671,0
,
Punto 2 de la Lnea4=692,725,0
)
,
Lnea5=(
Punto 1 de la Lnea5=762,283,0
,
Punto 2 de la Lnea5=582,192,0
)
,
Cara1={
Cara1-lnea1=(
Punto 1 de la Cara1=826,235,0
,
Punto 2 de la Cara1=13,378,0
)
,
Cara1-lnea2=(
Punto 1 de la Cara1=12,950,0
,
Punto 2 de la Cara1=13,378,0
)
,
Cara1-lnea3=(
Punto 1 de la Cara1=826,235,0
,
Punto 1 de la Cara1=12,950,0
)
}
,
Cara2={
Cara2-lnea1=(
Punto 1 de la Cara2=382,30,0
,
Punto 2 de la Cara2=224,597,0
)
,
Cara2-lnea2=(
Punto 1 de la Cara2=277,361,0
,
Punto 2 de la Cara2=224,597,0
)
,
Cara2-lnea3=(
Punto 1 de la Cara2=382,30,0
,
Punto 1 de la Cara2=277,361,0
)
}
,
Cara3={
Cara3-lnea1=(
Punto 1 de la Cara3=139,802,0
,
Punto 2 de la Cara3=880,935,0
)
,
Cara3-lnea2=(
Punto 1 de la Cara3=643,921,0
,
Punto 2 de la Cara3=880,935,0
)
,
Cara3-lnea3=(
Punto 1 de la Cara3=139,802,0
,
Punto 1 de la Cara3=643,921,0
)
}
,
Cara4={
Cara4-linea1=(
Punto 1 de la Cara4=516,614,0
,
Punto 2 de la Cara4=429,210,0
)
,
Cara4-lnea2=(
Punto 1 de la Cara4=979,860,0
,
Punto 2 de la Cara4=429,210,0
)
,
Cara4-lnea3=(
Punto 1 de la Cara4=516,614,0
,
Punto 1 de la Cara4=979,860,0
)
}
,
Cara5={
Cara5-lnea1=(
Punto 1 de la Cara5=152,663,0
,
Punto 2 de la Cara5=828,101,0
)
,
Cara5-linea2=(
Punto 1 de la Cara5=651,761,0
,
Punto 2 de la Cara5=828,101,0
)
,
Cara5-lnea3=(
Punto 1 de la Cara5=152,663,0
,
Punto 1 de la Cara5=651,761,0
)
}
]
Pietro Castellucci
Intentad fijar la constante NMERO a 4000 y poned en m archa el program a.
Como habis visto hay m uchas estrucuturas de datos en java.util, y describirlas
todas sera dem asiado trabajo.
Lo que nos interesa es que todas tienen m todos para introducir, quitar,
recuperar y m todos para gestionar la estructura mism a.
Las estructuras de datos implem entadas son tablas hash, listas, pile, code,
rboles etc Segn vuestras exigencias podes utilizar una u otra. Para tener
m s detalles, sin embargo, os aconsejo ojear la docum entacin del Java
Development Kit, donde stn escritas todas estas clases.
Por ahora os sirve con saber que las tablas hash son muy rpidas buscando un
objeto. Por lo general, basta con un solo acceso a las estructuras de datos para
encontrar el objeto que buscis.
Los listados son como los vectores. Los objetos estn relaccionados entre s, y
desde un obbjeto es posible alcanzar el siguiente o el anterior o los dos, segn la
realizacin del listado .
Los Pile son listados particulares, en los que se introducen objetos siempre al
comienzo de la estructura y, de aqu, se pueden tom ar. Por lo tanto en pila el
ltimo objeto que ha entrado es el prim ero que sale. Pensad en los objetos como
si fueran unos documentos que hay despachar desde una oficina. Se ponen en
rden en la m esa del encargado segn sus llegadas, uno encima del otro. El
encargado de despachar los documentos empieza siempre por el que est
encima de la pila. sta puede parecer una estructura de datos tonta, pero os
aseguro que es la m s mportante de todas. Las utilizan todos los lenguajes de
program acin para invocar las funciones y los procedimientos. (Incluso Java la
usa para invocar los mtodos), para transladar los parm etros y recuperar los
resultados. Sin esta estructura sera imposible program ar de form a recursiva,
que es una form a de program ar muy potente.
Las colas funcionan al revs. Se pueden comparar con las colas de los bancos.
Los objetos son las personas que estn en la cola delante de la ventanilla. Llegan
{
String nombre=new String();
ent valor;
public O(String a, ent v)
{
nombre=a;
valor=v;
}
}
}
}
El program a buscar el objeto O_30000. El output del programm a es:
Redacto el vector, introduzco 100000 objetos de tipo O con valores
independientes del ndice.
Inicio: O_128756 Fin: O_28756
Em piezo la bsqueda de O_30000
Objeto O_30000 encontrado en 50 m illisec. ..
Ahora hago lo mismo usando una estructura como la tabla hash:
im port java.util.*;
class O
{
String nombre=new String();
ent valor;
public O(String a, ent v)
{
nombre=a;
valor=v;
}
}
}
}
Otra vez el programa buscar el objeto O_30000. El output del programm a es:
Redacto el vector, introduzco 100000 objetos de tipo O.
Inicio: O_128756 Fin: O_28756
Em piezo la bsqueda de O_30000
Objeto O_30000 encontrado en 0 millisec. ..
El paquete java.util no incluye slo estas utilsim as estructuras de datos, sino
tam bin clases que simplifican la gestin de fechas y horarios, para la
internacionalizacin, y otras clases de utilidad como el string tokenizer. Coge de
una cadena todas las palabras y unos generadores de nm eros casuales.
El paquete java.util
}
public static void controlaZip(File f)
{
}
Adem s podemos ampliar estos archivos. El siguiente
program a recoge todos los .zip del directorio donde se pone
en m archa y los amplia.
im port java.util.*;
im port java.util.zip.*;
im port java.io.*;
}
public static void controlaZip(File f) throws IOException
{
out.close();
in.close();
}
}
}
El paquete java.util.jar se pone a disposicin del
program ador de las clases y de los interfaces para tratar los
archivos de tipo Java Archive (JAR), sobre todo es posible
leerlos y escribirlos. Los archivos JAR se basan en el
estndar ZIP, con un archivo opcional llam ado m anifest .
El contenido del paquete es el siguiente:
Clases
Attributes
Attributes.Nam e
JarEntry
JarFile
JarInputStream
JarOutputStream
Manifest
Excepciones
JarException
Os rem ito a la docum entacin del JDK para m s informacin.
El paquete java.net
El Paquete java.net
Java, como ya dijimos anteriorm ente, naci como lenguaje
para la red y slo sucesivam ente se convirti en un
verdadero lenguaje de programacin.
Su papel de lder para la programacin no se pone en duda
y, por eso, pone a disposicin del programador diferentes
paquetes para llevar a cabo esta program acin.
Como el objetivo final del curso es program ar Applet,
tenemos que verlo aunque sea de modo superficial. El
paquete es muy amplio y su contenido es el siguiente:
Interfaces
ContentHandlerFactory
FileNam eMap
SocketImplFactory
SocketOptions
URLStreamHandlerFactory
Clases
Authenticator
ContentHandler
Datagram Packet
Datagram Socket
Datagram SocketImpl
HttpURLConnection
InetAddress
JarURLConnection
MulticastSocket
NetPermission
PasswordAuthentication
ServerSocket
Socket
SocketImpl
SocketPermission
URL
URLClassLoader
URLConnection
URLDecoder
URLEncoder
URLStreamHandler
Excepciones
BindException
ConnectException
MalformedURLException
NoRouteToHostException
ProtocolException
SocketException
UnknownHostException
UnknownServiceException
De todo esto nosotros veremos slo algo. Para empezar
vamos aver qu pasa en la red.
Los ordenadores en Internet comunican intercambiando
try {
InetAddress loc=InetAddress.getLocalHost();
System .out.println("IP local: "+loc.getHostAddress());
System .out.println("Nombre local"+loc.getHostNam e());
}
catch (UnknownHostException e)
{};
}
}
Como ejercicio, coged como nombre de dominio el prim er
tem a del program a, por ejemplo,java DireccionesIP
HTMLpoint
El paquete dota de clases tiles para tratar los socket
fundam entales basados en TCP y en UDP, que son protocoles
boolean tribiln=false;
try {url= new URL(un);}
catch (Malform edURLException e)
{
System .out.println("URL equivocado, cojo
http://www.htm lpoint.com /index.asp ");
url = null;
tribiln=true;
};
if (tribiln) try {url = new URL
("http://www.htmlpoint.com/index.asp ");}
catch (Malform edURLException e){};
BufferedReader stream ;
try {stream = new BufferedReader (new InputStream Reader
(url.openStream ()));}
catch (IOException e){
System .out.println("Error de apertura del archivo");
stream =null;
System .exit(0);
};
File out=new File(".\\"+url.getFile());
FileWriter Output;
Output.write(l);
};
Output.flush();
Output.close();
}
catch (IOException e){System .out.println("Error de
lectura.");};
}
}
El program a coge una url de los parm etros de entrada; si
ste no es vlido o no hay parm etros, abre por default la
url http://HTMLpoint/index.asp. Entonces recoge la pgina
que ha ledo y la guarda en el disco.
Como se puede ver, esto se parece a un web browser,
utilizando un poco de grfica se podra visualizar incluso la
LDAP.
este paquete se ha convertido en estndar en JDK 1.3
Java Managem ent, para la gestin de redes locales.
JavaSpaces, m s clases para la creaccin de aplicaciones
distribuidas.
JavaComm erce, para el com ercio electrnico.
Personalm ente no veo la hora de que se conviertan en
estndar las API Java 3D, Java Media Fram ework,
JavaSpeech y Java Telephony, porque las funciones que
prometen estas API son realm ente excepcionales. Utilizarlas
ahora es posible, pero con cierto riesgo. Realm ente son
todava versiones beta y, por eso, llenas de errores. Adem s
si se quieren escribir apliques utilizando estas nuevas
funciones, esto es posible, pero para ponerlos en m archa se
necesita el apliqueviewer del JDK, porque seguramente el
Java implem entado en los web browser todava no las tiene.
Hay que pensar que Swing se ha convertido en un paquete
estndar del lenguaje, pero existen todava unos browser
que no lo tienen.
show();
}
setLocation(x,y);
setSize(200,100);
show();
}
im port javax.swing.*;
public class VentanaSwing extends JFram e
{
public VentanaSwing()
{
super("Prim era Ventana");
setLocation(100,100);
setSize(200,100);
show();
}
addMouseMotionListener, addPropertyChangeListener,
addPropertyChangeListener, bounds, checkImage,
checkIm age, coalesceEvents, contains, contains,
createIm age, createIm age, disable, disableEvents,
dispatchEvent, enable, enable, enableEvents,
enableInputMethods, firePropertyChange, getBackground,
getBounds, getBounds, getColorModel,
getComponentOrientation, getCursor, getDropTarget,
getFont, getFontMetrics, getForeground, getGraphics,
getHeight, getInputMethodRequests, getLocation,
getLocation, getLocationOnScreen, getNam e, getParent,
getPeer, getSize, getSize, getTreeLock, getWidth, getX,
getY, gotFocus, handleEvent, hasFocus, hide, im ageUpdate,
inside, isDisplayable, isDoubleBuffered, isEnabled,
isFocusTraversable, isLightweight, isOpaque, isValid,
isVisible, keyDown, keyUp, list, list, list, location, lostFocus,
mouseDown, mouseDrag, mouseEnter, mouseExit,
mouseMove, mouseUp, move, nextFocus, paintAll,
prepareIm age, prepareImage, printAll,
processComponentEvent, processFocusEvent,
processInputMethodEvent, processKeyEvent,
processMouseEvent, processMouseMotionEvent,
rem oveComponentListener, removeFocusListener,
rem oveInputMethodListener, removeKeyListener,
rem oveMouseListener, removeMouseMotionListener,
rem ovePropertyChangeListener,
rem ovePropertyChangeListener, repaint, repaint, repaint,
repaint, requestFocus, reshape, resize, resize,
setBackground, setBounds, setBounds,
setComponentOrientation, setCursor, setDropTarget,
setEnabled, setForeground, setLocale, setLocation,
setLocation, setNam e, setSize, setSize, setVisible, show,
Qu es un aplique?
appletviewer
Por lo tanto el ciclo vital de un aplique es:
{
System .out.println("Invocado el constructor de Etapas");
}
public void init()
{
super.init();
System .out.println("Puesto en m archa public void init()");
}
public void start()
{
super.start();
System .out.println("Puesto en m archa public void start()");
}
public void stop()
{
super.stop();
System .out.println("Puesto en m archa public void stop()");
}
public void destroy()
{
super.destroy();
System .out.println("Puesto en m archa public void
destroy()");
}
}
Lo redactamos con: javac Etapas.java
Para cargarlo vam os a crear el archivo Etapas.html que
incluye:
<htm l>
<head>
<title>Etapas.html carga Etapas.class</title>
</head>
<body>
El siguiente es el aplique Etapas, que nos muestra las etapas
por las que pasa el aplique.
<BR>
<applet code="Etapas.class" width=200 height=100>Tu
browser es viejo, tienes que cambiarlo!</APPLET>
</body>
</htm l>
Pra ponerlo en marcha teclearemos: appleviewer
Etapas.htm l, o abriremos el archivo Etapas.html con nuestro
browser preferido.
Los dems m todos de la clase Applet son:
AppletContext getAppletContext(), da el AppletContext
im port java.applet.*;
im port java.awt.*;
im port java.awt.im age.*;
public class Info extends Applet implements ImageObserver
{
public Info()
{
}
public void init()
{
super.init();
setBackground(Color.yellow);
resize(400,200);
}
<htm l>
<head>
<title>Info.html carga Info.class</title>
</head>
<body>
ste es el aplique Info.
<BR>
<applet code="Info.class" width=400 height=200>
<param nam e=parm etro1 value=" EDAD DEL QUE PONE
EN MARCHA EL PROGRAMA ">
<param nam e=parm etro2 value=" APELLIDOS DEL QUE
PONE EN MARCHA EL PROGRAMA ">
<param nam e=parm etro3 value=" NOMBRE DEL QUE PONE
EN MARCHA EL PROGRAMA ">
Tu browser es viejo, hay que cambiarlo!
</APPLET>
</body>
</htm l>
Cuidado con especificar los parm etros parm etro1,
parm etro2 y parm etro3 porque en el aplique no se hace
ningn control de sus definiciones. Por lo tanto, el aplique
hace una excepcin no capturada, adem s en el directorio
donde ponis el aplique, tiene que haber un archivo llam ado
m e.JPG, que es una im gen 67x88 pixel.
Aplicaciones mixtas
}
Lo ponis en un archivo llam ado Mixta.java, y lo pondris en
m archa creando un archivo Mixta.html que incluye:
<htm l>
<head>
<title>mixta</title>
</head>
<body>
Lo siguiente es un aplique:<BR>
<applet code="Mixta.class" width=200 height=100>Tu
browser es viejo, tienes que cambiarlo!</APPLET>
</body>
</htm l>
Ponedlo en marcha y a ver lo que ocurre. Siem pre el aplique
pasa en segundo plano, es decir, coloca otra ventana
encima, y despes vuelve al primer plano.
primitivas grficas.
BorderLayout, es el primer gestor de ajuste de lnea. Estos
gestores, que analizaremos dentro de muy poco, sirven apra
disponer los elem entos (los componentes) en los
contenedores. ste divide el contenedor en 5 partes: norte,
sur, este, oeste y centro.
Button, clase de los botones.
Canvas, rea en la que se puede dibujar una aplicacin.
CardLayout, otro gestor de layout.
Checkbox, CheckboxGroup, CheckboxMenuItem gestionan
los botones de tipo booleano (apretado o no apretado)
Choice, presenta un m en a cortina para elegir.
Color, colores en RGB o en otros espacios arbitrarios de
colores.
Component, Clase de la que derivan todos los componentes
GUI (pulsadores, etiquetas,)
ComponentOrientation, orientacin de los componentes.
Container, contenedor de los componentes.
Cursor, cursores.
Dialog, ventanas de dilogo en las que se indican errores y
no slo eso.
Dim ension, cajas que gestionan el tam ao de los
componentes, la altura y la anchura.
Event, clase que gestiona los sucesos segn el viejo modelo
de gestin de los sucesos (Java 1.0). Se ha dejado para que
se puedan trabajar las viejas aplicaciones y apliques Java y
se declara deprecated. En efecto, este modelo se ha
cambiado porque, en situaciones complejas, es decir, con
muchos componentes puestos unos encim a de otros, no se
entenda qu componente reciba el suceso.
EventQueue, cola de sucesos.
FileDialog, dialog especial que gestiona el input y el output
los m ens.
MenuItem , Voz de m en.
MenuShortcut, sirve para representar el acelerador para una
voz de m en.
Panel, contenedor.
Point, punto en las coordenadas x,y.
Polygon, polgono.
PopupMenu, m en de tipo invisible.
PrintJob, sirve para inicializar y para imprimir.
Rectangle, rectngulo.
RenderingHints, incluye ayudas para el rendering utilizadas
por Graphics2D.
RenderingHints.Key, define las teclas utilizadas para
controlar los diferentes aspectos del rendering.
Scrollbar, barra de desplazam iento.
ScrollPane, panel con dos barras de desplazamiento.
SystemColor, representa los colores simblicos de un objeto
GUI en un sistem a.
TextComponent, superclase de todos los componentes que
incluyen el texto.
TextArea, rea de testo.
TextField, simple lnea de texto.
TexturePaint, cmo rellenar una figura con una texture.
Toolkit, superclase del Abstract Window Toolkit.
Window, ventana (sin borde y barra de men).
Excepciones
AWTException
IllegalComponentStateException
Errores
AWTError
et.setText(etiqueta);
setTitle("Etiqueta "+etiqueta);
add(et);
pack();
show();
}
public static void m ain (String[] a)
{
try
{new Etiqueta(a[0]);}
catch (ArrayIndexOutOfBoundsException e)
{System .out.println("ERROR: teclear java Etiqueta
CADENA");};
}
}
Como ya hemos dicho, los GUI van tanto en los Fram e como
en Applet, por lo tanto se puede pensar en la versin applet
del programa anterior.
im port java.applet.*;
im port java.awt.*;
public class ApplEtiqueta extends Applet
{
Label et=new Label();
public void init ()
{
et.setText("Hola");
add(et);
}
Se pondr en un archivo llam ado ApplEtiqueta.java y se
invocar desde un archivo html que incluye:
<htm l>
<head>
<title>
</title>
</head>
<body>
<APPLET code="ApplEtiqueta.class" width=200
height=100>
</APPLET>
</body>
</htm l>
En el paquete swing todo es muy parecido, aunque la
gestin de los contenedores es un poco diferente.
Los botones son de tres tipos: los norm ales, les Checkbox y
los radiobutton. Empezamos con los prim eros.
La clase que define los botones es Button java.awt y pone a
disposicin todos los m todos para gestionar el aspecto del
botn. Los constructores de la clase son dos:
Button(), costruye un botn sin etiqueta;
Button(String txt), costruye un botn con etiqueta txt.
Algunos m todos de la clase son:
void addActionListener(ActionListener l), aade el botn a un
objeto invocado.
ActionListener, que escucha los sucesos. Cuando se clique el
botn, el suceso ser gestionado por ActionListener.
AccessibleContext getAccessibleContext(), como para las
Label, los botones son tam bin unos contenedores.
String getActionCommand(), a cada botn se asocia una
rden que devuelve el actual.
String getLabel(), devuelve la etiqueta asociada al botn.
EventListener[] getListeners(Class listenerType), da un array
que incluye a todos los que escuchan sucesos establecidos
por este botn.
addXXXListener(), aade un oyente de sucesos de tipo tipo
XXX. En Java hay varios tipos de sucesos, los analizaremos
dentro de poco. Uno de stos es el suceso de tipo action y,
en este caso, el m todo es addActionListener( )
void removeActionListener(ActionListener l), elimina el
oyente de sucesos 1 precedentemente asociado al botn.
void setActionCommand(String comm and), ajusta la rden
asociada al botn. Al principio la rden es la etiqueta.
void setLabel(String label), ajusta la etiqueta del botn.
// m todos de Fram e
pack();
show();
}
// m ain
public static void m ain (String [] arg)
{
new Botn();
}
// Oyente de suceso Action
int Volte=2;
public class Oyente implements ActionListener
{
public void actionPerform ed (ActionEvent e)
{
String rden=e.getActionCommand();
if (rden.compareTo("CLIC")==0)
{
clicado.setText("Me has clicado");
clcam e.setLabel("Vuelve a clicarme");
clcam e.setActionCommand("RECLIC");
};
if (rden.compareTo("RECLIC")==0)
clicado.setText("Me has clicado "+(Veces++)+" veces.");
}
}// Fin Oyente
grfica).
ste es un principio general de la program acin de
Interfaces Grficas, es decir, de la program acin de los
sucesos. Cada program a que utilizis funciona de esta form a
y cada program a que escribss tam bin.
El tipo de program acin es un poco diferente al que un
program ador sobre plataform a no grficas (tipo Dos, Linux
senza X-Win) est acostumbrado y al principio puede
resultar no muy simple. Sin em bargo hay que
acostumbrarse, despus es todo igual.
El segundo tipo de botones que analizamos son las
Checkbox, es decir, los botones de tipo booleano, que
retienen el estado. Se utilizan para hacer opciones no
exclusivas o exclusivas entre ellas (en este ltimo caso son
unos radiobutton). Por ejemplo, si hay que elegir entre unos
hobbies preferidos, estos botones, una vez clicados, se
quedan as y hay que volver a clicarlos para que vuelvan a la
situacin inicial.
Pra crear una Checkbox hay que crear un objeto que
pertenece a la clase Checkbox de java.awt. Los
constructores son:
Checkbox(), crea una Checkbox sin etiqueta.
Checkbox(String label), crea una Checkbox con etiqueta
label.
Checkbox(String label, boolean state), crea una Checkbox
con etiqueta label, y hay que clicarla o no segn el valor
booleano state.
En cam bio para los radiobutton:
public Check()
{
sale.addActionListener(new Oyente());
p1.add(r);
p1.add(r1);
p1.add(r2);
p1.add(r3);
p1.add(r4);
p1.add(r5);
p1.add(r6);
p1.add(r7);
r1.setCheckboxGroup(renta);
r2.setCheckboxGroup(renta);
r3.setCheckboxGroup(renta);
r4.setCheckboxGroup(renta);
r5.setCheckboxGroup(renta);
r6.setCheckboxGroup(renta);
r7.setCheckboxGroup(renta);
add(p1,BorderLayout.NORTH);
p2.add(i);
p2.add(i1);
p2.add(i2);
p2.add(i3);
p2.add(i4);
p2.add(i5);
p2.add(i6);
p2.add(i7);
p2.add(i8);
p2.add(i9);
add(p2,BorderLayout.CENTER);
add(sale,BorderLayout.SOUTH);
// m todos de Fram e
pack();
show();
}
// m ain
public static void m ain (String [] arg)
{
new Check2();
}
He tenido que usar otra vez los layout y tam bin los Panel.
Lo siento porque todava no los hemos tratado, sin embargo,
es la nica forma para introducir ms GUI en la m isma
ventana. Por ejemplo, intentad quitar los Panel y,
sucesivam ente, aadid todo directam ente a las ventanas, sin
utilizar los Layout. Vis a ver lo que ocurre.
En la aplicacin hay un botn que sirve para cerrar la
ventana porque todava no sabemos gestionar los sucesos de
la ventana, como el close, que en este caso no funciona.
Dentro de poco podremos gestionar incluso stos.
En la aplicacin no he gestionado los sucesos de las
Checkbox porque no lo he necesitado. Hay situaciones en las
que se tienen que gestionar, en las que, adems del estado
del botn cambia algo, por ejemplo, el estado de algn GUI.
Lo vemos en este ejemplo.
im port java.awt.*;
im port java.awt.event.*;
public class Check2 extends Fram e
{
// Constructot clase Botn
public Check2()
{
cierra.addActionListener(new Oyente());
add(p2,BorderLayout.CENTER);
add(cierra,BorderLayout.SOUTH);
// m todos de Fram e
pack();
show();
}
// m ain
public static void m ain (String [] arg)
{
new Check();
ocurrido en el contenedor.
void doLayout(), provoca la disposicin de los componentes
en el contenedor.
Component findComponentAt(int x, int y), devuelve el
componente que se encuentra en la posicin especificada del
contenedor (posicin grfica).
Component findComponentAt(Point p) , devuelve el
componente que se encuentra en la posicin especificada del
contenedor (posicin grfica).
float getAlignmentX(), devuelve el ajuste de lneas a lo largo
del eje X del contenedor.
float getAlignmentY(), devuelve el ajuste de lneas a lo largo
del eje Y del contenedor.
Component getComponent(int n), devuelve el ensimo
componente introducido en el contenedor.
Component getComponentAt(int x, int y), devuelve el
componente que se encuentra en la posicin especificada del
contenedor (posicin grfica).
Component getComponentAt(Point p), devuelve el
componente que se encuentra en la posicin especificada del
contenedor (posicin grfica).
int getComponentCount() , da el nmero de componentes
introducidos en el contenedor.
Component[] getComponents(), da todos los componentes
introducidos en el contenedor.
Insets getInsets(), da un objeto Insets para el contenedor.
Este objeto representa el tam ao (grfico= del contenedor.
LayoutManager getLayout(), devuelve el LayuotManager
asociado al contenedor.
EventListener[] getListeners(Class listenerType), devuelve
todos los oyentes de sucesos al contenedor.
un gestor de layout.
void update(Graphics g), vuelve a dibujar el contenedor.
void validate(), anula el contenedor y sus componentes.
Introduciendo componentes en el contenedor, como en el
ejem plo sucesivo, nos damos cuenta de que slo el ltimo
ser visualizado. Esto ocurre porque no hemos dado gestor
de Layout. En el caso de applet, en cambio, el
LayoutManager de default es el FlowLayout.
im port java.awt.*;
public class Contenedor extends Fram e
{
Label l1=new Label("Etiqueta1");
Label l2=new Label("Etiqueta2");
Label l3=new Label("Etiqueta3");
Label l4=new Label("Etiqueta4");
Label l5=new Label("Etiqueta5");
public Contenedor()
{
// uso add, porque el Fram e es una extensin de Window,
que a su
// vez am pla Container.
add(l1);
add(l2);
add(l3);
add(l4);
add(l5);
doLayout();
pack();
show();
}
public static void m ain(String [] arg)
{
new Contenedor();
}
}
Por lo tanto, vemos cmo introducir un gestor de Layout en
el contenedor. El m todo de la clase container que lo
perm ite es void setLayout(LayoutManager mgr). No nos
queda que ver cmo es el objeto de tipo LayoutManager.
LayoutManager es una interfaz. De las clases que la
im plem entan analizaremos GridLayout, FlowLayout.
Hay otra interfaz llam ada LayoutManager2, que ampla sta
y que tiene otras clases que la implem entan. De stas
veremos: CardLayout, BorderLayout, GridBagLayout,
BoxLayout, OverlayLayout.
Por lo tanto, en el mtodo setLayout () podemos utilizar
como parm etro un objeto de estas clases.
Llegados a este punto, tenemos que comprender qu
diferencia hay entre los layout manager.
El FlowLayout deja colocar los componentes de un
contenedor de la izquierda hacia la derecha en una sla
lnea.
public ContECL()
{
p.add(NPB);
p.add(p1);
Button N=new Button("Prximo");
Button P=new Button("Anterior");
NPB.add(P);
NPB.add(N);
P.addActionListener(new ActionListener()
{
public void actionPerform ed(ActionEvent e)
{
CL.previous(p1);
}
}
);
N.addActionListener(new ActionListener()
{
public void actionPerform ed(ActionEvent e)
{
CL.next(p1);
}
}
);
p1.add("uno",l1);
p1.add("dos",l2);
p1.add("tres",l3);
p1.add("cuatro",l4);
p1.add("cinco",l5);
add(p);
pack();
show();
}
public static void m ain(String [] arg)
{
new ContECL();
}
}
El resultado de los ejemplos son las siguientes ventanas:
l1.setBackground(Color.pink);
l2.setBackground(Color.lightGray);
l3.setBackground(Color.green);
l4.setBackground(Color.yellow);
l5.setBackground(Color.orange);
setLayout(new BorderLayout());
add(l1,BorderLayout.NORTH);
add(l2,BorderLayout.SOUTH);
add(l3,BorderLayout.EAST);
add(l4,BorderLayout.WEST);
add(l5,BorderLayout.CENTER);
pack();
show();
}
public static void m ain(String [] arg)
{
new ContEBL();
}
}
El resultado es:
Mens
file.add(salir);
Llegados e este punto, suponiendo haber creado tambin
Edit y Help, tenemos que aadirle el MenuBar que se crea
utilizando el constructor MenuBar().
En esta barra estan los m todos remove y removeAll como
para los mens, y est la add:
Menu add(Menu m);
Por lo tanto nuestro MenuBar se tendr que crear de la
siguiente form a:
MenuBar barra=new MenuBar();
barra.add(file);
barra.add(edit);
barra. setHelpMenu(help);
Este ltimo mtodo es especial para aadir un m en de
ayuda.
Finalm ente, no nos queda que asociar la barra de m en a
nuestra ventana. Esto es muy simple porque nuestra
ventana ser una extensin de Fram e y en fram e est el
m todo:
setMenuBar(MenuBar mb);
En nuestro caso ser setMenuBar (barra);
CUIDADO: con awt no es posible introducir men en Dialog y
en Applet (los que se ven son falsos mens, es decir, se
program an dibujando unos m ens o no son slo awt),
pack();
show();
addWindowListener(new Ventanam enWindowListener());
}
void setupSucesos()
{
abrir.addActionListener(new OyenteMen());
salvar.addActionListener(new OyenteMen());
cerrar.addActionListener(new OyenteMen());
salir.addActionListener(new OyenteMen());
cortar.addActionListener(new OyenteMen());
copiar.addActionListener(new OyenteMen());
pegar.addActionListener(new OyenteMen());
elim inar.addActionListener(new OyenteMen());
buscar.addActionListener(new OyenteMen());
sustituir.addActionListener(new OyenteMen());
ayuda.addActionListener(new OyenteMen());
}
class OyenteMen implem ents ActionListener
{
public void actionPerform ed (ActionEvent e)
{
resultado.setText(" Clicado "+e.getActionComm and());
if (e.getActionCommand().compareTo("Salir")==0)
System .exit(0);
}
}
class Ventanam enWindowListener implem ents
WindowListener
{
public void windowActivated(WindowEvent e)
{
System .out.println("Escuchado un Window Activated");
}
public void windowClosed(WindowEvent e)
{
System .out.println("Escuchado un Window Closed");
}
public void windowClosing(WindowEvent e)
{
System .out.println("Escuchado un Window Closing");
System .exit(0);
}
public void windowDeactivated(WindowEvent e)
{
System .out.println("Escuchado un Window Deactivaded");
}
public void windowDeiconified(WindowEvent e)
{
System .out.println("Escuchado un Window Deiconified");
}
public void windowIconified(WindowEvent e)
{
System .out.println("Escuchado un Window Iconified");
}
public void windowOpened(WindowEvent e)
{
System .out.println("Escuchado un Window Opened");
}
}
}
Como acabamos de ver en el ejemplo, hay otro oyente de
sucesos. Escucha los sucesos de tipo WindowEvent y sirve
para escuchar sucesos de la ventana.
Para asociarlo a la ventana se utiliza el m todo
addWindowListener(WindowListener l); en el que
Listas y selecciones
indicada.
void remove(int position), void remove(String item), elimina
los elem entos indicados por el ndice o la etiqueta.
void removeAll(), elimina todos los elem entos de la lista.
void removeActionListener(ActionListener l) e void
rem oveItem Listener(Item Listener l), eliminan los oyentes de
sucesos definidos para la lista.
void replaceItem (String newValue, int index), modifica el
elem ento especificado.
void select(int index), selecciona el elem ento indicado en la
lista.
void setMultipleMode(boolean b), dice a la lista si es posible
seleccionar slo un elem ento o m s de uno.
Veam os el ejemplo sobre el uso de las listas.
im port java.awt.*;
im port java.awt.event.*;
public class listas extends Fram e
{
List lista=new List(0,true);
Label text=new Label("Maravillas que se pueden visitar en la
localidad elegida");
public listas()
{
super("Elegir itinerario");
lista.add("Bienvenido");
lista.add("Foiano de Val Fortore");
lista.add("Baselice");
lista.add("San Bartolom eo en Galdo");
lista.add("San Marco de los Cavoti");
lista.add("Montefalcone en Val Fortore");
lista.add("Pesco Sannita");
lista.add("Colle Sannita");
lista.add("Castelvetere en Val Fortore");
lista.add("Castelfranco en Miscano");
lista.add("Ginestra de los Schiavoni");
lista.add("San Giorgio la Molara");
lista.add("Molinara");
lista.add("Pietrelcina");
lista.add("Fragneto Monforte");
lista.add("Circello");
lista.add("Campolattaro");
add(lista,BorderLayout.CENTER);
add(text,BorderLayout.SOUTH);
addWindowListener(new listeWindowListener());
lista.addItemListener(new escuchaLista());
setSize(350,100);
setResizable(false);
show();
}
{
new listas();
}
}
catch (ArrayIndexOutOfBoundsException er)
{System .out.println("Qu lo pases bien...");}
System .exit(0);
}
public void windowDeactivated(WindowEvent e)
{}
public void windowDeiconified(WindowEvent e)
{}
public void windowIconified(WindowEvent e)
{}
public void windowOpened(WindowEvent e)
{}
}
<head>
<title>
Ejem plo de uso de la java.awt.Choice y del cambio de los
parm etros a un aplique
</title>
</head>
<body>
<APPLET code="Selecciones.class" width=350 height=100>
<param nam e=loc1 value="Bienvenido">
<param nam e=loc2 value="Foiano de Val Fortore">
<param nam e=loc3 value="Baselice">
<param nam e=loc4 value="San Bartolom eo en Galdo">
<param nam e=loc5 value="San Marco de los Cavoti">
<param nam e=loc6 value="Montefalcone in Val Fortore">
<param nam e=loc7 value="Pesco Sannita">
<param nam e=loc8 value="Colle Sannita">
<param nam e=loc9 value="Castelvetere en Val Fortore">
<param nam e=loc10 value="Castelfranco en Miscano">
<param nam e=loc11 value="Ginestra de los Schiavoni">
<param nam e=loc12 value="San Giorgio la Molara">
<param nam e=loc13 value="Molinara">
<param nam e=loc14 value="Fragneto Monforte">
<param nam e=loc15 value="Circello">
<param nam e=loc16 value="Campolattaro">
<param nam e=autore value="Pietro Castellucci">
</APPLET>
</body>
</htm l>
Mientras que el cdigo del aplique, editado en el archivo
llam ado Selecciones.java, es:
im port java.awt.*;
im port java.awt.event.*;
im port java.applet.*;
public class Selecciones extends Applet
{
scelte.add(p);
p=getParam eter("loc3");
if (p==null) p="Localidad 3 no definida";
scelte.add(p);
scelte.add(p);
p=getParam eter("loc4");
if (p==null) p="Localidad 4 no definida";
scelte.add(p);
p=getParam eter("loc5");
if (p==null) p="Localidad 5 no definida";
scelte.add(p);
p=getParam eter("loc6");
if (p==null) p="Localidad 6 no definida";
scelte.add(p);
p=getParam eter("loc7");
if (p==null) p="Localidad 7 no definida";
scelte.add(p);
p=getParam eter("loc8");
if (p==null) p="Localidad 8 no definida";
scelte.add(p);
p=getParam eter("loc9");
if (p==null) p="Localidad 9 no definida";
scelte.add(p);
p=getParam eter("loc10");
if (p==null) p="Localidad 10 no definida";
scelte.add(p);
p=getParam eter("loc11");
if (p==null) p="Localidad 11 no definida";
scelte.add(p);
p=getParam eter("loc12");
if (p==null) p="Localidad 12 no definida";
scelte.add(p);
p=getParam eter("loc13");
if (p==null) p="Localidad 13 no definida";
scelte.add(p);
p=getParam eter("loc14");
if (p==null) p="Localidad 14 no definida";
scelte.add(p);
p=getParam eter("loc15");
if (p==null) p="Localidad 15 no definida";
scelte.add(p);
p=getParam eter("loc16");
if (p==null) p="Localidad 16 no definida";
scelte.add(p);
p=getParam eter("loc17");
if (p==null) p="Localidad 17 no definida";
scelte.add(p);
// Visualizzo la Choice
add(selecciones, BorderLayout.CENTER);
add(text, BorderLayout.SOUTH);
}
class escuchaChoice implem ents ItemListener
{
public void item StateChanged(Item Event e)
{
int indice=scelte.getSelectedIndex();
if (indice==0) text.setText("Rocca dei Rettori, arco de
Trajano, anfiteatro Rom ano");
if (indice==1) text.setText("localidad San Giovanni,
Cam panario, via Roma, lago");
if (ndice==2) text.setText("asi de San Leonardo");
if (ndice==3) text.setText("casco histrico");
if (ndice==4) text.setText("casco histrico");
if (ndice==5) text.setText("");
if (ndice==6) text.setText("");
if (ndice==7) text.setText("");
if (ndice==8) text.setText("");
if (ndice==9) text.setText("Bosque");
if (ndice==10) text.setText("");
if (ndice==11) text.setText("Lago de San Giorgio");
if (ndice==12) text.setText("");
if (ndice==13) text.setText("Piana Romana, casco histrico,
casas de Padre Po");
if (ndice==14) text.setText("Encuentro internacional de
globos, palcio Ducale");
if (ndice==15) text.setText("");
if (ndice==16) text.setText("Dique de Cam polattaro");
}
}
}
El ltimo componente GUI que veremos en esta leccin es el
ScrollPane, es decir, un panel en el que es posible introducir
un componente tan grande como queramos, y que tiene que
ser visualizado a trozos.
El ScrollPane usa dos Scrollbar, una horizontal y otra
vertical, para seleccionar la parte del GUI que queremos ver.
Fijaos que la Scrollbar es un objeto tam bin, por lo tanto, se
puede introducir y gestionar en las proprias aplicaciones. En
el ScrollPane se puede elegir si visualizar las Scrollbar
siempre, nunca o slo cuando sea necesario.
Un ScrollPane tpico es el que utilizamos para visualizar un
archivo de texto.
Hay dos tipos de constructores para el objeto:
ScrollPane(int sbp), crea un ScrollPane que pueda visualizar
las Scrollbar definidas por spb.
Los valores posibles son :
ScrollPane.SCROLLBARS_ALWAYS siem pre a la vista
ScrollPane.SCROLLBARS_AS_NEEDED a la vista slo si lo
necesitamos
processHierarchyBoundsEvent, processHierarchyEvent,
processInputMethodEvent, processKeyEvent,
processMouseEvent, processMouseMotionEvent, remove,
rem oveComponentListener, removeFocusListener,
rem oveHierarchyBoundsListener, removeHierarchyListener,
rem oveInputMethodListener, removeKeyListener,
rem oveMouseListener, removeMouseMotionListener,
rem ovePropertyChangeListener,
rem ovePropertyChangeListener, repaint, repaint, repaint,
repaint, requestFocus, reshape, resize, resize, setBounds,
setBounds, setComponentOrientation, setCursor,
setDropTarget, setEnabled, setFont, setForeground,
setLocale, setLocation, setLocation, setNam e, setSize,
setSize, setVisible, show, show, size, toString, transferFocus,
update, validate
Ahora, veam os los TextField. Prcticam ente un TextField es
una nica lnea de texto que se puede editar, con aspecto
grfico. Es uno de los campos que estamos acostumbrados a
ver en las Form que se encuentran en internet para
introducir nombres, apellidos, etc.
Hay cuatro posibles constructores:
TextField(), crea un TextField vaco.
TextField(int c), crea un TextField vaco de c columnas, es
decir, una lnea de c caracteres.
TextField(String t), crea un TextField inicializado con t.
TextField(String t, int c), crea un TextField inicializado con t,
de c caracteres.
De los varios m todos, los m s interesantes para nuestros
fines son:
boolean echoCharIsSet(), dice si el TextField realiza el
"echo" de los caracteres introducidos.
int getColumns(), da el nmero de columnas de los
TextField.
char getEchoChar(), da el carcter utilizado para el "echo".
void setColumns(int columns), verifica el nm ero de las
columnas de los TextField.
void setEchoChar(char c), verifica el carcter de "echo" para
el TextField.
void setText(String t), para verificar el texto introducido.
Para el tam ao:
Dim ension getMinimum Size()
Dim ensin getMinimum Size(int c)
Dim ensin getPreferredSize()
Dim ensin getPreferredSize(int c)
La TextArea, en cam bio, es un verdadero texto, no slo una
lnea, sino muchas. Incluye tambin las dos barras para
navegar en el texto si ste es m s grande de la ventana en
la que est visualizado.
Los constructores son:
TextArea(), construye una nueva TextArea.
TextArea(int r, int c) , construye una nueva TextArea, de r
lneas y c columnas.
TextArea(String text), construye una nueva TextArea
inicializada con el texto pasado.
escuchar.
En prim er lugar hemos escuchado unos sucesos de tipo
ActionEvent, es decir, sucesos que actan sobre las GUI
gracias al usuario como, por ejemplo, pulsar un botn.
Para esto, os recuerdo que hemos implem entado la interfaz
ActionListener, y hemos vuelto a definir el nico suceso
actionPerform ed (ActionEvent e), que se invoca cuando se
pone en m archa una accin sobre el componente GUI (o
sobre los componentes) a los que est asociado.
Para asociar al GUI el oyente de los sucesos que hemos
definido, hemos utilizado el mtodo addActionListener
(ActionListener oyente) del GUI.
Para usarlos hay que incluir en el program a:
im port java.awt.event.ActionListener;
im port java.awt.event.ActionEvent;
o
im pore java.awt.event.*;
Oyentes de sucesos de tipo ActionListener se pueden asociar
a los objetos GUI de awt:
Button
List (cuando seleccionamos o no seleccionamos un
elem ento)
MenuItem
TextField
Hemos visto tam bin cmo implementar un ItemListener,
para escuchar sucesos de la GUI que tienen un estado de
componente:
mouseDragged(MouseEvent e), invocado cuando se aprieta y
se mueve el ratn sobre el componente.
void mouseMoved(MouseEvent e), invocado cuando el ratn
se mueve sobre el componente, con o sin pulsar botones.
La ltim a interfaz para los sucesos del ratn es
MouseInputListener, que implem enta las dos interfaces
anteriores. Por lo tanto escucha todos los sucesos anteriores
del ratn.
En el ejemplo a continuacin se escuchan varios sucesos y
se utiliza tam bin un Dialog.
im port java.awt.event.*;
im port java.awt.*;
class escuchar extends Fram e
{
Button b1=new Button("Botn1");
Button b2=new Button("Visualiza Dialog");
Button b3=new Button("salir");
Button b4=new Button("Cerrar Dialog");
Choice l1=new Choice();
TextField TF1=new TextField(15);
Dialog D;
AscoltaActionListener aal;
AscoltaItemListener ail;
AscoltaWindowListener awl;
AscoltaWindowListenerDialog awld;
AscoltaMouseListener am l;
AscoltaKeyListener akl;
public Ascolta()
{
setTitle("Fram e, ejemplo oyentes suscesos");
setLocation(100,100);
setLayout(new GridLayout(5,1));
add(b1);
add(b2);
add(b3);
add(l1);
add(TF1);
D=new Dialog(this,true);
D.setSize(200,100);
D.setLocation(200,100);
D.add(b4,BorderLayout.SOUTH);
D.setTitle("Dialog - modale");
preparaD(false);
l1.add("Seleccin 1");
l1.add("Seleccin 2");
l1.add("Seleccin 3");
b2.addKeyListener(akl);
b3.addKeyListener(akl);
b4.addKeyListener(akl);
l1.addKeyListener(akl);
TF1.addKeyListener(akl);
D.addKeyListener(akl);
pack();
show();
}
void prepararD(boolean m)
{
D.setModal(m );
}
public static void m ain (String [] s)
{
System .out.println("Escuchar los sucesos.");
new Escuchar();
}
// ActionListener
class EscucharActionListener implem ents ActionListener
{
public void actionPerform ed(ActionEvent e)
{
String c=e.getActionCommand();
if (c.compareTo("Botn1")==0)
System .out.println("ActionListener: Pulsar Botn1");
else
if (c.compareTo("Salir")==0)
{
System .out.println("ActionListener: Pulsar Salir");
System .exit(9); // es un nmero cualquiera, se llam a exit
code.
} else
if (c.compareTo("Visualizar Dialog")==0)
{
System .out.println("ActionListener: Pulsar Visualizar
Dialog");
D.show();
b4.addActionListener(aal);
b2.removeActionListener(aal);
D.addWindowListener(awld);
} else
if (c.compareTo("Cerrar Dialog")==0)
{
System .out.println("ActionListener: Pulsar Visualizar
Dialog");
D.hide();
b4.removeActionListener(aal);
b2.addActionListener(aal);
D.removeWindowListener(awld);
} else
{
System .out.println("ActionListener: Pulsar Enviar en la
TextField, letto:"+TF1.getText());
TF1.setText("");
}
}
}
// ItemListener
class EscucharItem Listener implem ents ItemListener
{
public void item StateChanged(Item Event e)
{
String val=l1.getSelectedItem ();
System .out.println("ItemListener: Seleccionado "+val);
}
}
// WindowListener
public class EscucharWindowListener implem ents
WindowListener
{
public void windowActivated(WindowEvent e)
{
System .out.println("WindowListener: Ventana activada");
}
public void windowClosed(WindowEvent e)
{
System .out.println("WindowListener: Ventana cerrada");
}
public void windowClosing(WindowEvent e)
{
System .out.println("WindowListener: Pulsar cerrar
ventana");
System .exit(0);
}
public void windowDeactivated(WindowEvent e)
{
System .out.println("WindowListener: Ventana no activada");
}
public void windowDeiconified(WindowEvent e)
{
System .out.println("WindowListener: Ventana sin icono");
}
public void windowIconified(WindowEvent e)
{
System .out.println("WindowListener: Ventana reducir a
icono");
}
public void windowOpened(WindowEvent e)
{
System .out.println("WindowListener: Ventana abierta");
}
}
}
public void keyTyped(KeyEvent e)
{
System .out.println("KeyListener: Ests pulsando la tecla
"+e.getKeyChar()+
" codice "+
e.getKeyCode());
}
}
}
Introduccin a swing
ScrollPaneConstants
SingleSelectionModel
SwingConstants
UIDefaults.ActiveValue
UIDefaults.LazyValue
WindowConstants
Clases
AbstractAction
AbstractButton
AbstractCellEditor
AbstractListModel
ActionMap
BorderFactory
Box
Box.Filler
BoxLayout
ButtonGroup
CellRendererPane
ComponentInputMap
DebugGraphics
DefaultBoundedRangeModel
DefaultButtonModel
DefaultCellEditor
DefaultComboBoxModel
DefaultDesktopManager
DefaultFocusManager
DefaultListCellRenderer
DefaultListCellRenderer.UIResource
DefaultListModel
DefaultListSelectionModel
DefaultSingleSelectionModel
FocusManager
GrayFilter
ImageIcon
InputMap
InputVerifier
JApplet
JButton
JCheckBox
JCheckBoxMenuItem
JColorChooser
JComboBox
JComponent
JDesktopPane
JDialog
JEditorPane
JFileChooser
JFram e
JInternalFram e
JInternalFram e.JDesktopIcon
JLabel
JLayeredPane
JList
JMenu
JMenuBar
JMenuItem
JOptionPane
JPanel
JPasswordField
JPopupMenu
JPopupMenu.Separator
JProgressBar
JRadioButton
JRadioButtonMenuItem
JRootPane
JScrollBar
JScrollPane
JSeparator
JSlider
JSplitPane
JTabbedPane
JTable
JTextArea
JTextField
JTextPane
JToggleButton
JToggleButton.ToggleButtonModel
JToolBar
JToolBar.Separator
JToolTip
JTree
JTree.Dynam icUtilTreeNode
JTree.Em ptySelectionModel
JViewport
JWindow
KeyStroke
LookAndFeel
MenuSelectionManager
OverlayLayout
ProgressMonitor
ProgressMonitorInputStream
RepaintManager
ScrollPaneLayout
ScrollPaneLayout.UIResource
SizeRequirem ents
SizeSequence
SwingUtilities
Tim er
ToolTipManager
UIDefaults
UIDefaults.LazyInputMap
UIDefaults.ProxyLazyValue
UIManager
UIManager.LookAndFeelInfo
ViewportLayout
Excepciones
UnsupportedLookAndFeelException
Est claro que hay muchas m s clases de las de swing. Adems
hay m uchas que tienen el mismo nombre de algunas clases de
awt, excepto una J inicial, como, por ejemplo, JFram e, JDialog,
etc. Estas clases funcionan igual que las de awt, pero contienen
muchos m todos ms tiles.
Presentam os algunas de ests cosas que estn en swing m s que
en awt.
En swing estn las Toolbar, es decir, unas pequeas barras sobre
las que hay unos botones. Se pueden mover dentro de las
ventanas que las incluyen.
Los botones de swing, como casi todos los dem s JComponent,
pueden tener tanto una etiqueta como una im agen, imagen que
puede cambiar segn el estado del botn.
Adem s en swing se pueden utilizar los Tooltip, es decir, aquellas
sugerenias que salen autom ticam ente en un componente cuando
el ratn se detiene en l durante un rato.
Vamos a ver ahora el efecto de estos componentes swing en
Orespics.
es otra cosa que una caja con dentro un texto, que cambia
aspecto cuando se aprieta, es decir, cuando escucha su
suceso ActionEvent.
Utilizando las caractersticas de bajo nivel podemos construir
nuestros GUI personalizados o modificar los que ya existen
segn nuestras necesidades. No solam ente podemos
extender un componente particular, un componente lienzo,
en el que podemos dibujar lo que queramos y ponerlo en
nuestras interfaces como cualquier otro GUI.
Si utilizam os los apliques m s que las aplicaciones, podemos
evitar utilizar el lienzo porque el aplique trae implcitam ente
un lienzo. De todas form as, empecemos a ver en concreto
cmo se puede dibujar en un componente cualquiera o en un
aplique. Primero hablaremos de los apliques y luego
pasaremos a los componentes en general.
// Dibujo
}
Cuando el aplique haya dibujado y se quiera visualizar posibles
cambios, es posible invocar el mtodo repaint() o el mtodo
update(Graphics g) que borra el rea en el que el aplique ha
dibujado y vuelve a invocar la paint.
El m todo paint(Graphics g) no se puede invocar directam ente.
El aplique no slo tiene el m todo paint que se puede volver a
definir, sino tambin los objetos de tipo Component, es decir,
todos los GUI. Por lo tanto, para cam biar el aspecto grfico de
cualquier componente grfico, basta con volver a definir el
m todo paint.
Entre todos los componentes est el ya citado lienzo sobre el
que es posible dibujar. Es un objeto de la clase Canvas. Los que
estn acostumbrados a program ar con otros lenguajes esperan
que en la paint haya un inicializador del device en el que se va a
dibujar y, despus, una serie de instrucciones de tipo drawLine,
drawBox etc., sin embargo, os tengo que decir que esto no
siempre es verdad, es decir, que en los componentes y en los
apliques no hay ningn mtodo grfico.
Llegados a este punto, queda claro incluso que el parm etro g
de tipo Graphics de la paint incluye los mtodos grficos que
Java puede utilizar y representar, por decirlo de alguna form a, el
rea en el que se dibujarn las primitivas.
Graphics es una clase que no se puede incluir, sino que es
recibida por la paint como parm etro. Por lo tanto se puede
utilizar slo en ella y sus m todos son:
abstract void clearRect(int x, int y, int width, int height)
abstract void clipRect(int x, int y, int width, int height)
abstract void copyArea(int x, int y, int width, int height, int dx,
int dy)
abstract Graphics create()
Graphics create(int x, int y, int width, int height)
abstract void dispose()
void draw3DRect(int x, int y, int width, int height,boolean
raised)
abstract void drawArc(int x, int y, int width, int height, int
startAngle, int arcAngle)
void drawBytes(byte[] data, int offset, int length, int x, int y)
void drawChars(char[] data, int offset, int length, int x, int y)
abstract boolean drawImage() Ne esistono varie versioni
abstract void drawLine(int x1, int y1, int x2, int y2)
abstract void drawOval(int x, int y, int width, int height)
abstract void drawPolygon(int[] xPoints, int[] yPoints, int
nPoints)
void drawPolygon(Polygon p)
abstract void drawPolyline(int[] xPoints, int[] yPoints, int
nPoints)
void drawRect(int x, int y, int width, int height)
abstract void drawRoundRect(int x, int y, int width, int height,
int arcWidth, int arcHeight)
abstract void drawString(AttributedCharacterIterator iterator, int
x, int y)
abstract void drawString(String str, int x, int y)
void fill3DRect(int x, int y, int width, int height, boolean raised)
abstract void fillArc(int x, int y, int width, int height, int
startAngle, int arcAngle)
abstract void fillOval(int x, int y, int width, int height)
abstract void fillPolygon(int[] xPoints, int[] yPoints, int nPoints)
void fillPolygon(Polygon p)
abstract void fillRect(int x, int y, int width, int height)
abstract void fillRoundRect(int x, int y, int width, int height, int
son:
abstract boolean drawImage(Im age img, int x, int y, Color
bgcolor, Im ageObserver observer) abstract boolean
drawImage(Im age img, int x, int y, Im ageObserver
observer)
abstract boolean drawImage(Im age img, int x, int y, int
width, int height, Color bgcolor, ImageObserver observer)
abstract boolean drawImage(Im age img, int x, int y, int
width, int height, Im ageObserver observer)
abstract boolean drawImage(Im age img, int dx1, int dy1, int
dx2, int dy2, int sx1, int sy1, int sx2, int sy2, Color bgcolor,
ImageObserver observer)
abstract boolean drawImage(Im age img, int dx1, int dy1, int
dx2, int dy2, int sx1, int sy1, int sx2, int sy2,
ImageObserver observer)
Todos los mtodos requieren dos parm etros Image y
ImageObserver.
Image rapresenta la im agen que hay que visualizar. Es una
clase abstracta que perm ite un acceso independiente del
form ato de imgenes grficas. Los objetos de esta clase se
crean utilizando los mtodos de otras clases que crean
im genes, segn el contexto en el que se quieran utilizar.
Por ejemplo, si quiero dibujar una im agen en un componente
Gui, puedo usar el mtodo createImage() de la clase
Component.
En cam bio, si quiero dibujar una im agen en un aplique, es
posible usar el mtodo getIm age() de la clase Applet.
La clase Toolkit tiene tanto createIm age() como getImage().
El otro parm etro que necesitan las drawImage() es un
objeto que implem enta la interfaz Im ageObserver, y en la
Los Apliques
}
}
La ponemos en un archivo llam ado VisualizaImagen.java y la
invocamos usando el docum ento html siguiente
(Im agen.html):
<htm l>
<head>
<title>
Applet VisualizaImagen, visualiza la im agen pietro.jpg
</title>
</head>
<body>
<APPLET code="VisualizaImagen.class" width=385
height=100>
</APPLET>
<BR>
La de arriba es un aplique, sin embargo la de abajo no lo es.
<BR>
<IMG SRC="pietro.jpg">
</body>
</htm l>
Si ponemos en m archa el aplique nos damos cuenta de que
no hay ninguna diferencia entre la im agen cargada en el
aplique y la que hemos cargado usando el tag IMG SRC del
html, sino el mensaje que aparece cuando pasamos por
encima el ratn. Os podra parecer incluso un trabajo intil
para vuestras pginas html.
Esto es absolutam ente falso porque la imagen cargada en el
setLayout(new BorderLayout());
ImagenPietro=getIm age(getDocum entBase(),"pietro.jpg");
p.add(new Label());
p.add(b1);
p.add(b2);
b1.addItemListener(new IL());
b2.addItemListener(new IL());
add(p,BorderLayout.SOUTH);
}
boolean MOVIMIENTO=false;
ent nmero=0;
ent inc=1;
public void paint(Graphics g)
{
if (!MOVIMIENTO)
{
g.drawIm age(ImagenPietro,0,0,this);
getAppletContext().showStatus("Visualizo la imagen
pietro.jpg, Imagen inmvil, Applet creada Pietro
Castellucci");
nm ero=0;
}
else
{
g.setPaintMode();
g.drawIm age(Elabora(ImagenPietro,nm ero),0,0,this);
for (int k=0;k<=99;k++)
getAppletContext().showStatus("Visualizo la imagen
pietro.jpg, Frame "+nm ero+", Applet creada por Pietro
Castellucci");
getAppletContext().showStatus("Visualizo la imagen
pietro.jpg, Frame "+nm ero+", Applet creada por Pietro
Castellucci");
if (nm ero>=10) inc=-1;
if (nm ero<=0) inc=1;
nm ero+=inc;
}
repaint();
}
<BR>
La de arriba es un aplique, sin embargo la de abajo no lo es
<BR>
<IMG SRC="pietro.jpg">
</body>
</htm l>
La nueva clase Graphics2D pone a disposicin otros m todos
drawImage, entre los que hay algunos que tienen un
parm etro de tipo AffineTransform que, como dice el
nombre, es una transform acin parecida a la de la im agen,
una rotacin o una translacin, o una combinacin de todas.
Para tener una versin sin revoloteo basta con aadir la
funcin:
public void update(Graphics g)
{
paint(g);
}
Dibujo
Color.black
Color.blue
Color.cyan
Color.darkGray
Color.gray
Color.green
Color.lightGray
Color.m agenta
Color.orange
Color.pink
Color.red
Color.white
Color.yellow
En el siguiente aplique se dibujan unas lneas de colores.
im port java.awt.Graphics;
im port java.awt.Color;
im port java.awt.Button;
im port java.awt.BorderLayout;
im port java.awt.GridLayout;
im port java.awt.Panel;
im port java.awt.event.ActionEvent;
im port java.awt.event.ActionListener;
im port java.applet.*;
public class lneas extends Applet
{
final ent SI=14;
final ent NO=0;
Button R=new Button("Rojo");
Button G=new Button("Verde");
Button B=new Button("Azul");
ent r_=0;
ent g_=0;
ent b_=0;
ent ir=0;
ent ig=0;
ent ib=0;
public void init()
{
setLayout(new BorderLayout());
G.addActionListener(new ActionListener()
{
public void actionPerform ed(ActionEvent e)
{
ir=NO;
ig=S;
ib=NO;
repaint();
}
}
);
B.addActionListener(new ActionListener()
{
public void actionPerform ed(ActionEvent e)
{
ir=NO;
ig=NO;
ib=S;
repaint();
}
}
);
add(np,BorderLayout.SOUTH);
}
public void paint(Graphics g)
{
RECTNGULOS
Graphics permite dibujar unos rectngulos especificando dos
aristas opuestas usando el mtodo:
drawRect(Iniciox,Inicioy,Finx,Finy);
Este m todo es igual a:
drawLine(Iniciox,Inicioy,Finx,Inicioy);
drawLine(Iniciox,Inicioy,Iniciox,Finy);
drawLine(Finx,Inicioy,Finx,Finy);
drawLine(Iniciox,Finy,Finx,Finy);
Es posible incluso construir rectngulos que den un efecto
TEXTO
Para dibujar una cadena se puede utilizar el m todo
drawString (String TEXTO, ent x, ent y);
Un texto se puede dibujar con distintas Font. Para cam biar
las Font Graphics pone a disposicin el mtodo setFont(Font
font), en el que font es el objeto que define el tipo de
carcter.
Font es la clase que define los caracteres y es posible
invocarla creando un Font especfico, usando Font(String
nam e, ent style, ent size).
Font es una clase bastante complicada, sin embargo es fcil
encontrar y usar los Fonts del sistem a mientras se pone en
m archa programma java: En las viejas versiones de java
basta con escribir:
String []
NOMBRES=Toolkit.getDefaultToolkit().getFontList();
Mientras en las nuevas versiones de Java (de JDK 1.2 )
String [] NOMBRES=GraphicsEnvironm ent.
getLocalGraphicsEnvironment().
getAvailableFontFamilyNam es();
Adem s es fcil escribir objetos sabiendo los nombres.
ARCOS
Puedo dibujar unos arcos usando drawArc(ent x, ent y, ent
anchura, ent altura, ent nguloInicial, ent nguloArco)
Archivo grafDemo.java
im port java.awt.BorderLayout;
im port java.awt.GridLayout;
im port java.awt.FlowLayout;
im port java.awt.Panel;
im port java.awt.Label;
im port java.awt.Choice;
im port java.awt.Font;
im port java.awt.Toolkit;
im port java.awt.Checkbox;
im port java.awt.Scrollbar;
im port java.awt.GraphicsEnvironment;
im port java.awt.event.Item Event;
im port java.awt.event.Item Listener;
im port java.awt.event.Adjustm entListener;
im port java.awt.event.Adjustm entEvent;
im port java.applet.*;
GR.addItem ("Elpses");
GR.addItem ("Polgono genrico");
GR.addItem ("Texto");
GR.addItem ("Arco");
Panel up=new Panel(new GridLayout(1,3));
up.add(GR);
up.add(FN);
up.add(F);
add(up,BorderLayout.NORTH);
R.addAdjustmentListener(new AL());
G.addAdjustm entListener(new AL());
B.addAdjustmentListener(new AL());
GR.addItemListener(new IL());
FN.addItemListener(new IL());
F.addItemListener(new IL());
}
g.draw3DRect(50,100,250,100,true);
return;
}
if (pg==3)
{
g.drawRoundRect(50,100,300,100,20,20);
if (filled) g.fillRoundRect(50,100,300,100,20,20);
return;
}
if (pg==4)
{
g.drawOval(100,100,200,200);
if (filled) g.fillOval(100,100,200,200);
return;
}
if (pg==5)
{
g.drawOval(100,100,200,100);
if (filled) g.fillOval(100,100,200,100);
return;
}
if (pg==6)
{
g.drawPolygon(puntosX,puntosY,puntos);
if (filled) g.fillPolygon(puntosX,puntosY,puntos);
return;
}
if (pg==7)
{
g.drawString("sta es una cadena",1,200);
return;
}
if (pg==8)
{
g.drawArc(1,50,398,200,10,270);
if (filled) g.fillArc(1,50,398,200,10,270);
return;
}
}
public class IL implements ItemListener
{
public void item StateChanged(Item Event e)
{
repaint();
}
}
public class AL implem ents Adjustm entListener
{
public void adjustmentValueChanged(AdjustmentEvent e)
{
repaint();
}
}
con
String [] NOMBRES=GraphicsEnvironm ent.
getLocalGraphicsEnvironment().
getAvailableFontFamilyNam es();
y apreciar la gran cantidad de Font que hay.
En el ejemplo, he utilizado los colores de scrollbar, entre
ellos los GUI que no hemos visto. Para crear el objeto
scrollbar he utilizado el constructor:
Scrollbar R=new Scrollbar(Scrollbar.VERTICAL, 0, 1, 0, 255);
que crea una barra (scrollbar) vertical con valores entre 0 y
255 con valor inicial 0.
Despus he averiguado el valor de la barra con
R.setValue(255); he dicho que el increm ento por cada clic
tiene que ser 10 con R.setUnitIncrement(10);
Para escuchar los cambios, utilizo un objeto que implem enta
la clase Adjustm entListener que, a su vez, escucha los
sucesos de tipo Adjustm entEvent. Para asociar el oyente al
objeto scrollbar se utiliza el mtodo addAdjustm entListener.
javax.sound.midi
javax.sound.midi.spi
javax.sound.sampled
javax.sound.sampled.spi
Las partes que acaban por spi sirven para leer archivos
sonoros, convertirlos o leer los archivos de instrum entos en
el caso de midi. Nosotros no vamos a ver ests partes, sin
embargo veremos javax.sound.sampled y javax.sound.midi.
El paquete javax.swing.sampled permite grabar, tocar y
modificar datos sonoros.
Clip
DataLine
Line
LineListener
Mixer
Port
SourceDataLine
TargetDataLine
Clases
AudioFileFormat
AudioFileFormat.Type
AudioForm at
AudioForm at.Encoding
AudioInputStream
AudioPermission
AudioSystem
BooleanControl
BooleanControl.Type
CompoundControl
CompoundControl.Type
Control
Control.Type
DataLine.Info
EnumControl
EnumControl.Type
FloatControl
FloatControl.Type
Line.Info
LineEvent
LineEvent.Type
Mixer.Info
Port.Info
ReverbType
Excepciones
LineUnavailableException
UnsupportedAudioFileException
public sonido()
{
File sf=new File("italian.wav");
AudioFileFormat aff;
AudioInputStream ais;
try
{
aff=AudioSystem .getAudioFileForm at(sf);
ais=AudioSystem .getAudioInputStream (sf);
ol.open(ais);
ol.loop(Clip.LOOP_CONTINUOUSLY);
System .out.println("reproducin em pezada, apretar CTRL-C
para interrumpir");
}
catch(UnsupportedAudioFileException ee){}
catch(IOException ea){}
catch(LineUnavailableException LUE){};
}
public static void m ain(String[] ar)
{
new sonido();
}
}
Parece un poco trabajoso, sin embargo, siguiendo estos
pasos es posible leer y tocar cada archivo wav. Para hacer
otras operaciones, el paquete es bastante complejo y
actualmente no hay m anuales que expliquen el
funcionam iento (excepto la documentacin del JDK que,
como habis tenido la oportunidad de ver, no explica cmo
utilizar las cosas, sino que las describe y punto).
El paquete javax.suond.midi
ControllerEventListener
MetaEventListener
MidiChannel
MidiDevice
Receiver
Sequencer
Soundbank
Synthesizer
Transm itter
Clases
Instrument
MetaMessage
MidiDevice.Info
MidiEvent
MidiFileForm at
MidiMessage
MidiSystem
Patch
Sequence
Sequencer.SyncMode
ShortMessage
SoundbankResource
SysexMessage
Track
VoiceStatus
Excepciones
InvalidMidiDataException
MidiUnavailableException
im port javax.swing.*;
im port javax.sound.midi.*;
im port java.io.*;
public class m idifiles extends JFram e
{
public m idifiles()
{
try
{
File f2=new File("sorpresa.m id");
MidiFileForm at m ff2=MidiSystem .getMidiFileForm at(f2);
Sequence S=MidiSystem .getSequence(f2);
Sequencer seq=MidiSystem.getSequencer();
seq.open();
seq.setSequence(S);
seq.start();
System .out.println("Sorpresa para todos m is coetneos");
System .out.println("Apretar CTRL-C para interrumpir");
}
catch(MidiUnavailableException ecc){}
catch(InvalidMidiDataException ecc2){}
catch(IOException ecc3){}
;
}
im port java.util.*;
im port javax.sound.sam pled.*;
im port javax.sound.midi.*;
public class sintetizador extends JFram e
{
ent TIEMPO=50;
ent CANAL=0;
ent UNS=-1;
ent INSTRUMENTO=0;
Sintetizador SINTETIZADOR=new Sintetizador();
// GUI
JLabel teclado1=new JLabel(new Im ageIcon("teclado1.gif"));
JLabel teclado2=new JLabel(new Im ageIcon("teclado2.gif"));
JButton OkB=new JButton("Ok");
{
setTitle("Sintetizador sonoro de Pietro Castellucci");
setupAspecto();
setupValores();
setupSucesos();
SINTETIZADOR.setInstrum ento(
Instrumentos.getSelectedIndex(),CANAL);
setResizable(false);
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
pack();
Toolkit t = Toolkit.getDefaultToolkit();
Dim ension d=t.getScreenSize();
Dim ension win=getSize();
win=getSize();
setLocation(d.width/2-(win.width/2)-1,d.height/2-(win.height/2)-1);
show();
}
void setupAspecto()
{
teclado1.setCursor(new Cursor(Cursor.HAND_CURSOR));
teclado2.setCursor(new Cursor(Cursor.HAND_CURSOR));
OkB.setCursor(new Cursor(Cursor.HAND_CURSOR));
tastiera1.setToolTipText(
"Clcame para tocar"
);
tastiera2.setToolTipText(
"Clcame para tocar"
);
OkB.setToolTipText(
"Salir del program a"
);
"Instrum entos"
)
);
Canales.setBorder(
BorderFactory.createTitledBorder(
"Canales"
)
);
SP.add(Instrum entos);
// SP.add(Canales);
SP.add(uns);
m sg.setEditable(false);
m sg.setBackground(P.getBackground());
SP.add(m sg);
SP.add(OkB);
P.add(SP,BorderLayout.SOUTH);
SL.setBorder(BorderFactory.createTitledBorder(
"Presin "
));
SL.setOrientation(JSlider.VERTICAL);
SL.setMajorTickSpacing(25);
SL.setMaxim um(100);
SL.setMinimum(0);
SL.setMinorTickSpacing(1);
SL.setPaintLabels(true);
SL.setPaintTicks(true);
SL.setPaintTrack(true);
SL.setSnapToTicks(true);
SL.setValue(TIEMPO);
P.add(SL,BorderLayout.EAST);
setContentPane(P);
}
void setupValores()
{
try
{
ent e=0;
while (true)
{
String nombre= SINTETIZADOR.Instrum entos[i++].getNam e();
Instrumentos.addItem (nombre);
}
}
catch (ArrayIndexOutOfBoundsException e)
{};
try
{
int i=0;
while (true)
{
String nombre="Canales"+" "+(i+1);
SINTETIZADOR.CANALES[i++].allNotesOff();
Canales.addItem(nombre);
}
}
catch (ArrayIndexOutOfBoundsException e)
{};
if (Instrum entos.getItemCount()>0)
Instrumentos.setSelectedIndex(INSTRUMENTO);
}
void setupSucesos()
{
teclado1.addMouseListener(new Teclado1Listener());
teclado2.addMouseListener(new Teclado2Listener());
{
SINTETIZADOR.setInstrum ento(
Instrumentos.getSelectedIndex(),CANALES);
}
}
);
Canales.addItemListener(new ItemListener()
{
public void item StateChanged(Item Event e)
{
CANALES=Canales.getSelectedIndex();
SINTETIZADOR.cambiaCanal(CANAL);
}
});
OkB.addActionListener(new ActionListener()
{
public void actionPerform ed(ActionEvent e)
{
System .out.println("Gracias por haber tocado conmigo!");
System .exit(0);
}
}
);
}
// Sucesos
{}
}
// Utility fun
int getNota (int pos)
{
int nota;
nota=(pos/12);
return nota;
}
//*****************************************
// SOUND MANAGER
//*****************************************
//**********************************************************
*
// Sintetizador:
//**********************************************************
*
public class Sintetizador
{
private Synthesizer SYNT;
private Sequencer sequencer;
private Sequence seq;
private Soundbank BANK;
public Instrum ent[] Instrumentos;
public MidiChannel[] CANALES;
public Sintetizador()
{
setupSintetizador();
}
void setupSintetizador()
{
try
{
SYNT=MidiSystem.getSynthesizer();
sequencer=MidiSystem.getSequencer();
seq= new Sequence(Sequence.PPQ, 10);
SYNT.open();
BANK = SYNT.getDefaultSoundbank();
if (BANK != null)
Instrumentos = SYNT.getDefaultSoundbank().getInstruments();
else
Instrumentos = SYNT.getAvailableInstrum ents();
CANALES=SYNT.getChannels();
}
catch(MidiUnavailableException ecc){todonull();}
catch(InvalidMidiDataException ecc2){todonull();}
;
}
void todonull()
{
SYNT=null;
sequencer=null;
seq=null;
BANK=null;
Instrumentos=null;
}
public void setInstrum ento(int str,int can)
{
SA=str;
int prog=Instrum entos[str].getPatch().getProgram ();
CANALES[can].programChange(prog);
}
private int SA=0;
public void cambiaCanal(int can)
{
int prog=Instrum entos[SA].getPatch().getProgram ();
CANALES[can].programChange(prog);
}
public void tocar(ent nota,ent tiempo, ent canal)
{
CANALES[canal].allNotesOff();
CANALES[canal].noteOn(nota,tiem po);
}
public void tocar(ent nota,ent tiempo)
{
tocar(nota,tiempo,0);
}
public void callar()
{
CANALES[0].allNotesOff();
}
} // End of Sintetizador
}
Os habis dado cuenta de que es un program a consistente, sin embargo no
tenis que espantaros porque la m ayor parte del cdigo sirve para la
grfica y para escuchar los sucesos. La parte interesante para sintetizar los
sonidos la he puesto en la subclase Sintetizador, es decir, en
sintetizador.Sintetizador
es decir, la siguiente:
//**********************************************************
*
// Sintetizador:
//**********************************************************
*
void todonull()
{
SYNT=null;
sequencer=null;
seq=null;
BANK=null;
Instrumentos=null;
}
public void set nstrum ento(ent str,ent can)
{
SA=str;
ent prog=Instrum entos[str].getPatch().getProgram ();
CANALES[can].programChange(prog);
}
private ent SA=0;
public void cambiaCanal(ent can)
{
ent prog=Instrum entos[SA].getPatch().getProgram ();
CANALES[can].programChange(prog);
}
public void tocar(ent nota,ent tiempo, ent canal)
{
CANALES[canal].allNotesOff();
CANALES[canal].noteOn(nota,tiem po);
}
public void tocar(ent nota,ent tiempo)
{
tocar(nota,tiempo,0);
}
Conclusiones y bibliografa
program acin.
Quiero disculparm e con mis lectores menos expertos por si
han tenido problem as para entender algunas partes de la
gua y, al mismo tiempo, quiero hacerlo con los m s
expertos si han encontrado algo dem asiado aburrido o
sim ple. Los que han asistido a todo el curso tendran que ser
capaces de escribir unos apliques simples y unas
aplicaciones por su cuenta. No creo que hayis conseguido
todava gestionar grandes aplicaciones complejas, aunque,
con un poco de prctica y con los simples conceptos del
curso, os vis a convertir en excelentes program adores.
Yo estar siem pre disponible a posibles preguntas sobre el
curso o a m s explicaciones, pero os pido que no m e
escribis para los Javascript o para la configuracin de los
apliques bajados de la red.
Para los que quieran profundizar los tem as tratados o ver
nuevos, os dejo la bibliografa completa en la que me he
basado para preparar este curso.
Un saludo a todos.
Pietro Castellucci
Foiano di Val Fortore (Benevento)
Bibliografa