Escolar Documentos
Profissional Documentos
Cultura Documentos
Universidad de La Serena.
INDICE
I N D I C E ............................................................................................................................................................... 2
C A P I T U L O I .................................................................................................................................................... 4
Caractersticas de la Poo ................................................................................................................................... 10
C A P I T U L O II................................................................................................................................................. 25
Elementos Bsicos en todo programa Java: Objetos y Mtodos. ....................................................................... 28
Como construyo programas? ............................................................................................................................. 29
Primer encuentro con POO, el mtodo System.out.println ............................................................................... 30
Cmo edito un programa?.................................................................................................................................. 30
Cmo ejecuto un programa Java ........................................................................................................................ 31
Java, una Plataforma Independiente .................................................................................................................. 33
Una visin de la plataforma JDK ....................................................................................................................... 35
Instalacin de Java ............................................................................................................................................. 36
C A P I T U L O III ............................................................................................................................................... 42
Elementos del Lenguaje...................................................................................................................................... 42
Tipos de Datos y Strings ..................................................................................................................................... 42
Algunos Operadores ........................................................................................................................................... 43
Variables ............................................................................................................................................................ 43
Asignaciones....................................................................................................................................................... 45
Punto Flotante. ................................................................................................................................................... 46
Funciones Estndares ........................................................................................................................................ 47
Clases de I/O ...................................................................................................................................................... 49
ConsoleReader ................................................................................................................................................... 52
hsa.* ................................................................................................................................................................... 53
Swing .................................................................................................................................................................. 54
Strings................................................................................................................................................................. 57
C A P T U L O IV ................................................................................................................................................ 63
Decisiones (if)..................................................................................................................................................... 63
Ciclos .................................................................................................................................................................. 76
C A P I T U L O V ................................................................................................................................................. 86
Excepciones y Flujo de Datos (Exceptions y Streams) ...................................................................................... 86
Como leer archivos de texto ............................................................................................................................... 95
Leer de un Archivo de Texto ............................................................................................................................. 104
Escribiendo un Archivo de Texto ...................................................................................................................... 106
Archivos y Filtros. ............................................................................................................................................ 107
Excepciones y Flujo de Datos (Exceptions y Streams) .................................................................................... 110
Diagnostico de los errores en Expresiones y Variables ................................................................................... 111
Excepciones ...................................................................................................................................................... 114
Leer desde el teclado ........................................................................................................................................ 117
Como leer archivos de texto ............................................................................................................................. 120
Leer de un Archivo de Texto ............................................................................................................................. 128
Escribiendo un Archivo de Texto ...................................................................................................................... 131
Archivos y Filtros. ............................................................................................................................................ 132
C A P T U L O VI ............................................................................................................................................. 135
Programacin Orientada a Objetos en Java .................................................................................................... 135
Clases y Objetos ............................................................................................................................................... 136
Instancias de una Clase .................................................................................................................................... 137
Constructores ................................................................................................................................................... 138
Variables en la clase ........................................................................................................................................ 139
Clase como Tipo ............................................................................................................................................... 139
Expresiones para instanciar ............................................................................................................................. 140
Mtodos Instanciados ....................................................................................................................................... 140
La palabra clave this ........................................................................................................................................ 141
Mtodos en las Clases ...................................................................................................................................... 142
Implementando Estructuras de Datos .............................................................................................................. 142
Listas ................................................................................................................................................................ 142
Arboles AVL ..................................................................................................................................................... 144
Jerarquia de Clases .......................................................................................................................................... 157
Herencia ........................................................................................................................................................... 158
Jerarquia de clases en Java.............................................................................................................................. 160
Herencia y Constructores ................................................................................................................................. 161
Dynamic Binding .............................................................................................................................................. 162
Polimorfismo .................................................................................................................................................... 162
Sobreescritura de mtodos ............................................................................................................................... 163
Clases Abstractas y Mtodos Abstractos .......................................................................................................... 163
Interfaces .......................................................................................................................................................... 165
Paquetes ........................................................................................................................................................... 168
Declaracin import ......................................................................................................................................... 168
Java-Paquetes Estandar ................................................................................................................................... 169
Programacin Orientada a Objetos comparada con la Programacin de Procesos y programacin orientada a
eventos. ............................................................................................................................................................. 169
C A P I T U L O VII ............................................................................................................................................ 181
Eventos (Events) ............................................................................................................................................... 181
Eventos ............................................................................................................................................................. 182
GUI Minimo-Minimorum: ............................................................................................................................... 186
Estuctura de una Aplicacin Swing. ................................................................................................................. 189
C A P T U L O VIII. .......................................................................................................................................... 203
Swing ................................................................................................................................................................ 203
C A P T U L O IX ............................................................................................................................................. 221
Swing: Eventos de Ratn y Movimientos del Ratn ......................................................................................... 221
C A P I T U L O X .............................................................................................................................................. 232
GUI Avanzado (con Swing) .............................................................................................................................. 232
C A P T U L O XI .............................................................................................................................................. 245
GUI Avanzado (con Swing) .............................................................................................................................. 245
CAPITULO I
PROGRAMACIN ORIENTADA A OBJETOS
La programacin orientada a objetos proporciona una forma de ver los programas en funcin de
los datos y los mtodos que operan sobre ellos. En la programacin orientada a objetos, la
atencin se aleja de las funciones y se acerca a las cosas (objetos) que componen el programa.
Las diferencias bsicas entre la programacin orientada a objetos y el enfoque de procesos,
eventos u aspectos, pueden agruparse en cuatro principios bsicos: abstraccin, encapsular,
herencia y polimorfismo.
Abstraccin es el proceso de ignorar temporalmente los detalles subyacentes al objeto, para
centrar la atencin en el problema u objeto y as extraer sus caractersticas esenciales. Por
ejemplo, si se consideran los neumticos de un auto, el neumtico abstracto puede tener una
marca, tamao precio y una cantidad ideal de aire. Estas caractersticas se aplican a todos los
neumticos. Al utilizar la abstraccin es posible centrar la atencin sobre estas caractersticas
(comunes), en lugar de hacerlo sobre los detalles de un tipo especfico de neumtico.
Encapsular es el proceso de agrupar la informacin abstrada del objeto con las operaciones
(mtodos) que un programa puede realizar sobre los datos. Por ejemplo, una clase es el
encapsulado de los datos y mtodos de un objeto.
Herencia es un marco en el cual se pueden crear nuevas clases al introducir nuevas
caractersticas o cambios a clases ya existentes. La herencia libera al programador de la tarea de
reescribir funciones cuando se deben hacer pequeos cambios.
Finalmente, el Polimorfismo es la habilidad que tiene un objeto de tomar diferentes formas. El
prefijo poli significa muchas; morfismo formas. Por ejemplo, en un programa, un objeto
polimorfo que represente un telfono puede cambiar de forma para representar un telfono de
tonos, un telfono de pulsos o incluso un telfono celular.
Como puede notar algunos conceptos de la POO son anlogos a los mtodos de programacin
convencional, por ejemplo. Un mtodo es como un procedimiento porque ambos contienen
instrucciones de procesamiento. Las variables de clase y modelo se correlacionan a los datos de
la programacin tradicional. Los mtodos y datos son diferentes porque los procedimientos no
estn encapsulados normalmente con los datos que manipulan. Una clase es como un tipo
abstracto de datos, aunque para la POO, el proceso de escribir no se revela fuera de la clase. La
herencia no tiene analoga inmediata en la programacin convencional. El paso de mensajes
reemplaza a las llamadas de funcin como mtodo principal de control en los sistemas orientados
a objeto. Con las llamadas de funciones, los valores se presentan y el control regresa a la funcin
que efecta la llamada. Por el contrario, los objetos entran en accin gracias a los mensajes, y el
control est distribuido.
Considere como ejemplo, una entidad bancaria. En ella identificamos entidades que son cuentas:
cuenta_del_cliente1, cuenta_del_cliente2, etc. Al mismo tiempo, una cuenta puede
verse como un objeto que tiene atributos. Por ejemplo, nombre, nmero_de_cuenta y saldo, y
Clases
Una clase es un tipo de objetos definido por el usuario. Una clase equivale a la generalizacin de
un tipo especfico de objetos. Por ejemplo, Empleado.
Empleado
No obstante esta clase puede expandirse para incluir atributos, en este caso apellido, nombre, rut
y sexo. Para tal efecto, todos los atributos son definidos en la clase a travs de variables, es as
como la clase adquiere la siguiente forma:
Cdigo Java
class Empleado {
String apellido;
String nombre;
int rut;
boolean esFemenino;
}
UML
Empleado
apellido: String
nombre: String
rut:
int
esFemenino: boolean
Adems, si Ud. desea puede definir que los atributos tengan algunas propiedades, tales como
privado (-), pblico(+) o protegido(#). En tal caso queda,
Cdigo Java
public class Empleado {
private
String apellido;
private
String nombre;
private
int rut;
private
boolean esFemenino;
}
UML
Empleado
-
apellido: String
nombre: String
rut:
int
esFemenino: boolean
Por otro lado cabe preguntarse que deseo hacer con la clase Empleado?. Por ejemplo se desea
registrar horas de trabajo, horas extraordinarias, sueldo, viticos, u otros. En tal caso, se deben
implementar ciertos mtodos que realicen sta tarea.
Segn lo expuesto hasta ahora, un objeto contiene, por una parte, atributos que definen su estado,
y por otra, operaciones que definen su comportamiento. Tambin sabemos que un objeto es la
representacin concreta y especfica de una clase. Cmo se escribe una clase de objetos? Como
ejemplo, podemos crear una clase PC1.
Ejemplo 1.
public class PC1 {
String marca;
String procesador;
String pantalla;
boolean PC1_Encendido;
boolean presentacion;
}
en esta oportunidad se han definido 5 atributos. Veamos ahora, desde un punto de vista prctico,
que acciones seran convenientes considerar, por ejemplo, ponerse en marcha, apagarse, cargar
una aplicacin, desactivar algn proceso o activar otro, etc. Ahora para implementar este
comportamiento hay que crear mtodos. Los mtodos son rutinas de cdigo definidas dentro de la
clase, que se ejecutan en respuesta a alguna accin tomada desde dentro de un objeto de esa clase
o desde otro objeto de la misma o de otra clase, recuerde que los objetos se comunican mediante
mensajes.
Ejemplo 2.
public class PC1
{
String marca;
String procesador;
String pantalla;
boolean PC1_Encendido;
boolean presentacin;
//mtodo de la clase
void EncenderPC1()
{
if (PC1_Encendido == true) // si est encendido...
System.out.println("El PC ya est encendido.");
else // si no est encendido, encenderlo.
{
PC1_Encendido = true;
System.out.println("El PC se ha encendido.");
}
}
//mtodo de la clase
void Estado() {
System.out.println("\nEstado del PC:" +
"\nMarca " + marca +
"\nProcesador " + procesador +
"\nPantalla " + pantalla + "\n");
if (PC1_Encendido == true) // si el ordenador est encendido...
System.out.println("El PC est encendido.");
else // si no est encendido...
System.out.println("El PC est apagado.");
}
//mtodo de la clase, llamada clase principal
public static void main (String[] args)
{
PC1 miPC1 = new PC1();
miPC1.marca = "Dell";
miPC1.procesador = "Intel Pentium";
miPC1.pantalla = "AOC";
miPC1.EncenderPC1();
miPC1.Estado();
}
}
Como se puede observar un mtodo consta de su nombre precedido por el tipo del valor que
devuelve cuando finalice su ejecucin (la palabra reservada void indica que el mtodo no
devuelve ningn valor y seguido por una lista de parmetros separados por comas y encerrados
entre parntesis (en el ejemplo, no hay parmetros). Los parntesis indican a Java que el
identificador EncenderPC1() se refiere a un mtodo y no a un atributo. A continuacin se
escribe el cuerpo del mtodo encerrado entre {y}. Usted ya conoce algunos mtodos, llamados
en otros contextos funciones; seguro que conoce la funcin logaritmo que devuelve un valor real
correspondiente al logaritmo del valor pasado como argumento. Otro mtodo es Estado()que
visualiza los atributos especficos de un objeto. Finalmente para poder crear objetos de esta clase
y trabajar con ellos, tendr que aadir a esta clase el mtodo main(), tal como se hizo aqu, o
bien escribir un programa principal, tal como se muestra a continuacin, en donde MiPC.java
esta en un directorio y el archivo PC2.class en el mismo, de otra manera no se entendera el
llamado que se hace. A continuacin se visualiza un tpico mensaje de error de esta naturaleza.
C:\Documents and
Settings\usuario\Escritorio\POO\curso_poo_2006\MiPC.java:5:
cannot resolve symbol
symbol : class PC2
location: class MiPC
PC2 miPC2 = new PC2();
^
C:\Documents and
Settings\usuario\Escritorio\POO\curso_poo_2006\MiPC.java:5:
cannot resolve symbol
symbol : class PC2
location: class MiPC
PC2 miPC2 = new PC2();
^
2 errors
En resumen, Herramienta
las bibliotecas
de clases
y los marcos
proporcionan una excelente
completada
con cdigo
de salidaestructurales
1
plataforma para el desarrollo de las aplicaciones orientadas a objetos y la reutilizacin del cdigo.
Ejemplo 3.
public class MiPC {
public static void main (String[] args)
PC2 miPC2 = new PC2();
miPC2.marca = "Dell";
miPC2.procesador = "Intel Pentium";
miPC2.pantalla = "AOC";
miPC2.EncenderPC2();
miPC2.Estado();
}
}
//mtodo de la clase
class PC2{
String marca;
String procesador;
String pantalla;
boolean PC2_Encendido;
boolean presentacin;
//mtodo de la clase
void EncenderPC2() {
if (PC2_Encendido == true) // si est encendido...
System.out.println("El ordenador ya est encendido.");
else // si no est encendido, encenderlo.
{
PC2_Encendido = true;
System.out.println("El ordenador se ha encendido.");
}
}
//mtodo de la clase
void Estado()
{
System.out.println("\nEstado del ordenador:" +
"\nMarca " + marca +
"\nProcesador " + procesador +
"\nPantalla " + pantalla + "\n");
if (PC2_Encendido == true) // si el ordenador est encendido...
System.out.println("El ordenador est encendido.");
else // si no est encendido...
System.out.println("El ordenador est apagado.");
}
}
Caractersticas de la Poo
Las caractersticas fundamentales de la POO son: encapsulacin, herencia, abstraccin, y
polimorfismo.
Encapsulamiento
La encapsulacin es el trmino formal que describe el conjunto de mtodos y datos dentro de un
objeto de forma que el acceso a los datos se permite solamente a travs de los mtodos del objeto.
Esta caracterstica permite entonces ver un objeto como una caja negra en la que se ha
introducido de alguna manera toda la informacin relacionada con dicho objeto, permitiendo
manipular los objetos como unidades bsicas, permaneciendo oculta su estructura interna.
Generalmente los atributos de una clase de objetos se declaran privados, estando as oculto para
otras clases, siendo posible el acceso a los mismos nicamente a travs de los mtodos pblicos
de dicha clase. El mecanismo de ocultacin de miembros se conoce en la POO como
encapsulacin. El nivel de proteccin predeterminado para un miembro de una clase es el de
package (paquete), habiendo otros tales como, public, private y protected.
Ejemplo 4.
/**
* Conversin de grados centgrados a fahrenheit:
* F = 9/5 * C + 32
*/
import java.lang.System;
10
* Mtodos:
*
CentgradosAsignar, FahrenheitObtener y CentgradosObtener
*/
class CGrados
{
private float gradosC; // grados centgrados
public void CentgradosAsignar(float gC)
{
// Establecer el atributo grados centgrados
gradosC = gC;
}
public float FahrenheitObtener()
{
// Retornar los grados fahrenheit equivalentes a gradosC
return 9F/5F * gradosC + 32;
}
public float CentgradosObtener()
{
return gradosC; // retornar los grados centgrados
}
}
Tomando la clase CGrados, podemos advertir que contiene atributos private como gradosC, lo
que significa que un miembro de una clase declarado private puede ser accedido nicamente
por los mtodos de su clase, es decir, el atributo gradosC es accedido por el mtodo
CentgradosAsignar(). En la eventualidad que un mtodo de otra clase, por ejemplo el
mtodo main de la clase class CApGrados, incluyera una declaracin, tal como
grados.gradosC = 30; el compilador debera mostrar un error, indicando que el miembro
gradosC no es accesible desde esta clase, por tratarse de un miembro privado de Cgrados. Si
por otra parte, un miembro de una clase declarado public es accesible desde cualquier mtodo
definido dentro o fuera de la clase o paquete actual. Por ejemplo, en la clase CApGrados, se puede
observar cmo el ojeto grados de la clase CGrados creado en el mtodo main accede a su
mtodo CentgradosAsignar(), con el fin de modificar el valor de su miembro privado
gradosC.
En este sentido se dice que la clase CGrados encapsula una estructura de datos formada por un
float llamado gradosC, y que para acceder a esta estructura proporciona la interfaz pblica
formada
por
los
mtodos
CentgradosAsignar,
FahrenheitObtener
y
CentgradosObtener.
11
slo puede tener una superclase, llamada herencia simple, mientras que C++ y otros lenguajes
orientados a objeto las clases pueden tener ms de una superclase, conocida como herencia
mltiple. En esta ltima situacin una clase comparte los mtodos y propiedades de varias clases.
La forma de cmo Java supera esta situacin es a travs de la implementacin de interfaces. Una
interface es una coleccin de nombres de mtodos, sin incluir su implementacin y que pueden
ser aadidas a cualquier clase para proporcionarle comportamientos adicionales no incluidos en
los mtodos propios o heredados.
Por ejemplo pensemos en la clase Empleado definida como:
Ejemplo 5.
class Empleado {
String nombre;
int numEmpleado, sueldo;
static private int contador = 0;
//definir un constructor
Empleado(String nombre, int sueldo) {
/*Algunas veces un mtodo necesita hacer referencia al objeto que lo invoc, para
permitir esto Java define la palabra clave this, que puede ser usado dentro de
cualquier mtodo para referirse al objeto actual. Por ejemplo, */
this.nombre = nombre;
this.sueldo = sueldo;
numEmpleado = ++contador;
}
public void aumentarSueldo(int porcentaje) {
sueldo += (int)(sueldo * aumento / 100);
}
public String toString() {
return "Num. empleado " + numEmpleado + " Nombre: " + nombre +
" Sueldo: " + sueldo;
}
}
12
Ejemplo 6.
class Ejecutivo extends Empleado {
int presupuesto;
void asignarPresupuesto(int p) {
presupuesto = p;
}
}
Con esta definicin un Ejecutivo es un Empleado que adems tiene algn rasgo distintivo
propio. El cuerpo de la clase Ejecutivo incorpora slo los miembros que son especficos de esta
clase, pero implcitamente tiene todo lo que tiene la clase Empleado. A Empleado se le llama
clase base o superclase y a Ejecutivo clase derivada o subclase.
Los objetos de las clases derivadas se crean igual que los de la clase base y pueden acceder tanto
sus datos y mtodos como a los de la clase base. Por ejemplo:
Ejecutivo jefe = new Ejecutivo( "Armando Mucho", 1000);
jefe.asignarPresupuesto(1500);
jefe.aumentarSueldo(5);
se producir un error de compilacin pues en la clase Empleado no existe ningn mtodo llamado
asignarPresupuesto.
13
}
}
class SimpleHerencia {
public static void main(String args[]) {
A superOb = new A();
B subOb = new B();
// la superclass puede ser usada por ella misma.
superOb.i = 10;
superOb.j = 20;
System.out.println("Contenido de superOb: ");
superOb.showij();
System.out.println();
/* La subclass tiene acceso a todos los miembros public
de su superclass. */
subOb.i = 7;
subOb.j = 8;
subOb.k = 9;
System.out.println("Contenido de subOb: ");
subOb.showij();
subOb.showk();
System.out.println();
System.out.println("Sum de i, j y k en subOb:");
subOb.sum();
}
}
Como se puede ver, la subclase B incluye todos los miembros de su superclase A, por lo que
subOb puede acceder a las variables i y j, y llamar al mtodo showij(). Dentro se sum(),
tambin se pueden referenciar directamente las variables i y j, como si fuesen parte de B.
Abstraccin
clase Abstracta
Circulo
Fig_Geo
Triangulo
Poligono
14
Podramos pensar en tener una clase genrica, que podra llamarse Fig_Geo y una serie de clases
que extienden a la anterior que podran ser Circulo, Poligono, etc.
Podra haber un mtodo dibujar dado que sobre todas las figuras puede llevarse a cabo esta
accin, pero las operaciones concretas para llevarla a cabo dependen del tipo de figura en
concreto (de su clase). Por otra parte la accin dibujar no tiene sentido para la clase genrica
Fig_Geo, porque esta clase representa una abstraccin del conjunto de figuras posibles.
Para resolver esta problemtica Java proporciona las clases y mtodos abstractos. Un mtodo
abstracto es un mtodo declarado en una clase para el cual esa clase no proporciona la
implementacin (el cdigo). Una clase abstracta es una clase que tiene al menos un mtodo
abstracto. Una clase que extiende a una clase abstracta debe implementar los mtodos abstractos
(escribir el cdigo) o bien volverlos a declarar como abstractos, con lo que ella misma se
convierte tambin en clase abstracta.
Siguiendo con el ejemplo del apartado anterior, se puede escribir:
Ejemplo 8.
abstract class Fig_Geo {
. . .
abstract void dibujar();
. . .
}
class Circulo extends Fig_Geo {
. . .
void dibujar() {
// codigo para dibujar Circulo
. . .
}
}
15
}
}
class B extends A {
void callme() {
System.out.println("B's es una implementacion de callme.");
}
}
class AbstractDemo {
public static void main(String args[]) {
B b = new B();
b.callme();
b.callmetoo();
}
}
En resumen, las clases abstractas dividen los problemas complejos en mdulos sencillos y
ocultan los detalles de la realizacin. La claridad conceptual est presente en el diseo, en el
programa y en la aplicacin final.
Polimorfismo
16
Veamos ahora en general, a travs de un ejemplo una visin de lo tratado y lo que se aproxima a
travs del curso.
Ejemplo 11.
/************************************************************************
* Una clase para representar un empleado. Un ejemplo.
*
***********************************************************************/
public class Empleado {
protected String nombre; // nombre del empleado
protected String jobT; // trabajo del empleado, el ttulo
protected double jornal; // horas asociadas al jornal del empleado
// el monto de dinero que la compaia cancela al empleado
protected double pagoO;
/**********************************************************************
* Constructor: Crea un empleado standar dando nombre, titulo del job,
jornal.
*
* Parametros:
*
nombre: el nombre del empleado
17
*
titulo: trabajo del empleado, el ttulo
*
jornal: jornal del empleado
**********************************************************************/
public Empleado(String nombre, String titulo, double jornal) {
this.nombre = nombre;
this.jobT = titulo;
if (jornal < 0) {
System.out.println("Error: jornal negativo!");
jornal = 0;
} // end if
this.jornal = jornal;
// parte sin pago acumulado
this.pagoO = 0;
} // end constructor
/**********************************************************************
* Returns el nombre del empleado.
*********************************************************************/
public String getNombre() {
return nombre;
} // end getNombre
/**********************************************************************
* Returns el trabajo del empleado.
*********************************************************************/
public String getTitulo() {
return jobT;
} // end getTitulo
/**********************************************************************
* Pago al empleado por n de horas trabajadas. Incrementando
* el monto del pago.
*
* Parameter: n de horas trabajadas
*********************************************************************/
public void pago(double horas) {
pagoO += horas * jornal;
} // end pago
/**********************************************************************
* Returns el monto del pago para el empleado.
*********************************************************************/
public double monto_a_Pagar() {
return pagoO;
} // end monto_a_Pagar
/**********************************************************************
* Cero el monto adeudado. Llamada para establecer que se ha cancelado
* a empleado de alguna manera.
*********************************************************************/
public void cero() {
pagoO = 0;
} // end cero
/**********************************************************************
* Compara este empleado con otro.
* Se define para cuando ellos tienen el mismo nombre, jobTitulo y jornal.
* Parametros: otro objeto para comparar con este
* Return valor: true si este objeto es considerado igual al
*
otro objeto.
*********************************************************************/
public boolean igual(Object otro) {
if (otro instanceof Empleado) {
18
Empleado
-
nombre: String
jobT: String
jornal : double
pagoO: double
+
+
+
+
+
+
+
getNombre():String
getTitulo():String
pago(horas: double)
monto_a_Pagar(): double
cero(): void
igual(): boolean
aString(): String
Como Ud. puede notar en el cdigo de la clase Empleado existe un mecanismo que le llamamos
Constructor. A saber, un constructor es un procedimiento especial de una clase que es llamado
automticamente siempre que se desee crear un objeto de esa clase, siendo su funcin iniciar el
objeto. Por otra parte un destructor es un procedimiento especial de una clase que es llamado
automticamente siempre que se desee destruir un objeto de esa clase, siendo su funcin acabar
cualquier proceso en el que este objeto haya estado involucrado. Observar que cada objeto
mantiene su propia copia de los atributos, pero no de los mtodos de su clase, esto es cada objeto
almacena sus propios datos, pero para acceder y operar con ellos, todos comparten los mismos
mtodos definidos en su clase. Por lo tanto, para que un mtodo conozca la identidad del objeto
particular para el que ha sido invocado, Java proporciona una referencia al objeto denominada
this, tal como ud. lo aprecia en el constructor anterior. Como Uds. pueden notar existen otro tipo
de Empleados, por ejemplo un Vendedor Viajero (Salesperson) a quien se le paga por horas pero
adems obtiene una comisin, es decir un porcentaje de las ventas realizadas. A continuacin
veamos como tratar esta propuesta o cambio en la organizacin, y desde luego cambios en los
sistemas de administracin de la misma.
Ingeniera en Computacin, Universidad de La Serena
19
Propuesta 1: cambiar la clase Empleado por otra en que a todos los Empleados se les incluya el
concepto de Comisin, en donde la Comisin tal vez para muchos es 0. Ante lo cual deriva en
una excesiva computacin y capacidad de almacenamiento para todos los Empleados, pues no
todos estarn en esta situacin.
Propuesta 2: Crear una nueva clase, llamemosla Salesperson, la cual copia todas las variables
y mtodos desde la clase Empleado, pero agregando la comisin, o datos faltantes. Los problemas
que trae esta propuesta es la duplicidad de cdigo, es decir ms tipeo, lo que trae como
consecuencia una alta probabilidad de errores, y 2 clases a mantener. Ante las propuestas
anteriores surge una mucho ms plausible, y se refiere a extender la clase Empleado, y esto se
visualiza de la siguiente manera:
public class Salesperson extends Empleado{
//extra variables
//extra mtodos
}//end class Salesperson
en donde se dice que la clase Salesperson hereda todos los mtodos y variables desde la clase
Empleado, adems de otros extras que pueda incluir. La vista de heredar en UML es como sigue,
Empleado
-
nombre: String
jobTitulo: String
peso : double
pagoDeuda: double
+ getNombre():String
+ getTitulo():String
+ pago(horas: double)
+ montoPago(): double
+Ok()
Salesperson
- tasa: double
+ pagoSale(montoSale : double)
20
Algo que se debe tener cuenta respecto al vocabulario es que la clase Empleado es la superclase(o
clase padre), Salesperson es una subclase (o clase derivada). Se dice tambin que la clase
Salesperson extiende a la clase Empleado. Salesperson hereda variables y mtodos de la clase
Empleado. Salesperson es una clase derivada, que deriva de la clase Empleado.
21
Una clase hija o derivada hereda todas las variables y mtodos del padre, pero NO constructores,
esto significa que cada clase necesita de un constructor o constructores propios. Por otra parte, un
mejor camino para evitar duplicidad en la codificacin de la inicializacin es considerar el
mtodo super(), considerada como superclase. La declaracin
super(nombre, titulo, jornal);
dice que llama al constructor de la superclase, es decir Empleado. Invocar a super(), se debe
hacerse en el constructor en la primera llamada, para que pueda asumirlo.
Otra clase derivada podra ser, si es que sigue el juego de la organizacin, los empleados
ejecutivos, los que pueden recibir bonos de productividad, los que no estn basados en horas
necesariamente. Por ejemplo
Ejemplo 13.
/************************************************************************
* clase para empleado ejecutivo. Obtiene jornal plus bonos.
***********************************************************************/
public class Ejecutivo extends Empleado {
/**********************************************************************
* Constructor: Crea un ejecutivo dando nombre, job titulo, y jornal.
* Parametros:
*
nombre: nombre del empleado
*
titulo: el job titulo del empleado
*
jornal: jornal del empleado
*********************************************************************/
public Ejecutivo(String nombre, String titulo, double jornal) {
/* Note que TODOS estos constructores hacen esto para llamar a la clase
padreconstructor con los mismos parametros. Este constructor es necesario ,pues
clases hijas no heredan constructores, por eso la declaracion.*/
super(nombre, titulo, jornal);
} // end constructor
/**********************************************************************
* Pago de bonos al ejecutivo.
*
* Parametro: monto del bono
*********************************************************************/
public void pagoBono(double bono) {
pagoO += bono;
} // end pagoBono
/**********************************************************************
* Crea una representacin String de Ejecutivo, incluyendo nombre,
* job titulo, jornal y pago.
*
* Return valor: representacion string
*********************************************************************/
public String aString() {
return "(Ejecutivo) " + super.aString();
} // end aString
} // end class Ejecutivo
22
Veamos a continuacin una clase principal que servir para testear la clase Empleado sus
mtodos y las subclases.
Ejemplo 14.
/************************************************************************
* Un programa para testear la clase Empleado y sus subclases.
*
***********************************************************************/
public class EmpleadoTest {
// Metodo principal main: Crea varios empleados de diferentes tipos y testeamos
// los diferentes mtodos.
public static void main(String noUsado[]) {
// un empleado "normal" , pago $2. 250/hora, sin sobretiempo
Empleado ambler = new Empleado("Ambler", "agente", 2.250);
ambler.pago(8);
ambler.pago(10);
// total horas son 18, pago es de 2.250 * 18 = $40.500.
System.out.println("monto a pagar a ambler: $" + ambler.monto_a_Pagar());
// chequear el metodo cero
ambler.cero();
ambler.pago(8);
// pago es de 8 * 2.250 = 18.000.
System.out.println("monto a pagar a ambler: $" + ambler.monto_a_Pagar());
// un ejecutivo recibe $3.000/hora, sin sobretiempo pero puede recibir bonos
Ejecutivo perez = new Ejecutivo("perez", "director", 3.000);
perez.pago(10);
perez.pago(10);
perez.pagoBono(10);
// pago debera ser 2.000 * 3.000 + 10.000 = $70.000
System.out.println("montoa a pagar a perez: $" + perez.monto_a_Pagar());
// un vendedor viajero, recibe $1.000/hora plus 20% comision. Sin bonos o
sobretiempo
Salesperson castillo = new Salesperson("castillo", "salesperson", 1.000, .2);
castillo.pago(10);
castillo.pagoViaje(40);
// pago debera ser 1.000 * 1.000 + .2 * 40.000 = $18.000.
System.out.println("montoa pagar a castillo: $" + castillo.monto_a_Pagar());
// Demo para el metodo igual
System.out.println();
Empleado emp1 = new Empleado("Mario", "ingeniero", 3.000);
Empleado emp2 = new Empleado("Maria", "programador", 3.000);
System.out.println(emp1.igual(emp2)); // false
Salesperson emp3 = new Salesperson("Mario", "ingeniero", 3.000, .1);
System.out.println(emp1.igual(emp3)); // true
} // end main
} // end class EmpleadoTest
23
De la misma forma como se ha realizado aqu podra construirse una nueva clase que resulte ser
una extensin de Empleado. Por ejemplo, considerar la situacin de que algunos Empleados
reciben pago extra por sobretiempo, en tal caso considere el clculo del sueldo con sobretiempo.
Por ejemplo incremento de horas > 8 se paga 50% sino se paga como antes, etc.
24
Captulo 2: Fundamentos
C A P I T U L O II
FUNDAMENTOS
El libro Java How To Program (Deitel & Deitel 3Ed.) comienza con un captulo que describe
las ideas bsicas de computacin, programas, y lenguajes de programacin, este es un buen
libro gua. Por otra parte, el libro de Cay S. Horstmann, Core Java 2, Volumen I, es un libro
para personas que ya se manejan en Java. En la prctica siempre nos encontraremos con libros
que de una u otra manera tienen enfoques distintos. Este material tampoco es la excepcin y
en nuestro caso est orientado a los alumnos que en cierto modo han programado en algn
lenguaje de programacin y poseen un conocimiento de las herramientas bsicas de la
programacin, no obstante lo anterior, me he esmerado en mostrar en cada captulo las
herramientas que deberan conocer. No pretendo ser exhaustivo en el tema, sino tan slo fijar
ciertos estndares de conocimientos no importando el orden usual, es decir en este sentido no
comienzo definiendo los tipos de datos, luego operadores, como usualmente se hace, sino que
con el tipo de datos enteros voy utilizando las asignaciones, operadores, definicin de
funciones en diversas aplicaciones, ya que Ud. se supone que aprendi C, y adems curso
Estructuras de Datos.
El lenguaje Java que estaremos usando es uno de los ms recientes lenguajes de programacin
de alto nivel, la primera versin apareci en 1995, y Java2 versin 1.4 que estaremos usando
slo se libero el ao 2001. Java naci bajo el alero de una gran empresa de hardware y de
desarrollo de tecnologas, como es la empresa SUN Microsystems, siendo uno de los
referentes ms importantes en el tema. Hoy en da ya se cuenta con la versin 1.5, apropiada
para la programacin genrica. El programa en Java es traducido por el compilador que es un
programa en un lenguaje llamado bytecode que es similar al cdigo de mquina pero es
independiente de cualquier sistema en particular. El bytecode producido por compilador e
interpretado por la mquina virtual de Java (JVM) se llama cdigo del objeto. Fig. 1 muestra
la forma en que se realizan los procesos.
Figura 1.
25
Captulo 2: Fundamentos
Existe un nmero de herramientas disponibles para compilar y ejecutar programas Java. Para
este curso utilizaremos la versin liberada y disponible en el sitio Web, llamada Software
Development Kit (SDK), que puede ser bajada en forma gratuita de la direccin,
http://java.sun.com/j2se/
declaraciones.
La salida ser: Hola La Serena! en una lnea, y en la prxima se ver Nos vemos.
Notar la forma clsica del programa modelo, en donde las declaraciones estn entre{ }.
26
Captulo 2: Fundamentos
}
}
La Fig. 2, muestra el efecto que se genera sobre el archivo fuente Hola_Alumnos tras de
realizar la compilacin (con el comando javac). Ud. podr notar la generacin de dos nuevos
archivos con extensin .class (conteniendo bytecode).
27
Captulo 2: Fundamentos
usa el mtodo println para enviar el mensaje Hola amigos! al objeto System.out (el que
lo despliega en pantalla). Todo objeto pertenece a una clase la cual especifica los mtodos y
objetos que all habitan. La potencialidad, en la prctica del lenguaje Java viene dada por su
biblioteca de clases. Entre las cuales destacan 2 paquetes (packages) de propsito general
como son java.io y java.lang.
Por ejemplo, la biblioteca de Java proporciona 3 flujos estndar, manejados por la clase
System del paquete java.lang, que son automticamente abiertos cuando se inicia un
programa y cerrado para cuando finaliza.
System.in, referencia a la entrada estndar del sistema que normalmente coincide con el
teclado. Se utiliza para leer datos introducidos por el usuario.
System.out, referencia a la salida estndar del sistema que normalmente es el monitor. Se
utiliza para mostrar datos al usuario.
System.err, referencia a la salida estndar de error del sistema, que normalmente es el
monitor. Se utiliza para mostrar mensajes de error al usuario.
Java en general nos ofrece la libertad de crear nuestras propias clases, mtodos, objetos y
paquetes, pero por lo mismo debemos conocer al menos la biblioteca de clases de Java, pues
no en vano la librera de Java esta compuesta enteramente de clases.
Existen algunas clases que consisten de un nmero de mtodos stand-alone, es decir que no
pertenecen a algn objeto en particular, a estos le llamaremos mtodos static. No todos los
datos utilizados en los programas Java son objetos, es as por ejemplo los tipos de datos
simples, tales como integers y nmeros floating-point son considerados en forma diferente.
Ellos son llamados tipos datos primitivos, porque estn integrados en el sistema. Sin
embargo, no confundirse porque la biblioteca de Java proporciona las clases: Byte,
Ingeniera en Computacin, Universidad de La Seren
28
Captulo 2: Fundamentos
Character, Short, Integer, Long, Float, Double y Boolean, para encapsular cada uno de los
tipos expuestos.
Vea http://java.sun.com/docs/books/tutorial/java/data/numbers.html
Como construyo programas?
En la ltima seccin explicamos que un programa Java consiste de un nmero de clases. El
ejemplo anterior es una muestra de ello pero muy simple. En todo caso, todo programa
consiste de una clase que contiene justamente un mtodo esttico. Todo lenguaje de
programacin hace uso de mtodos pero usualmente bajo nombres diferentes, por ejemplo,
procedure o function son frecuentes en Pascal o C. En Java se conocen como mtodos.
Aqu est el programa anterior usando mtodos con una indentacin apropiada para entender
cuando y donde termina una declaracin
1. /* Escribir un mensaje en pantalla. */
2.
public static void main(String[] args)
3. { System.out.println(Hola, amigo! );
4. System.out.println(Luego nos vemos. );
5. }
Comentarios:
1.
Esto es un comentario que describe lo que el programa hace. Puede usar tambin //, en el
caso que sea solamente una lnea.
2.
Este es el encabezado del mtodo principal. Todo mtodo tiene un nombre, en este caso es
la palabra main (principal) que viene justamente antes del parntesis. Las palabras public,
static y void son llamadas por el compilador Java para cuando el mtodo deba ser usado.
Esto lo explicaremos despus. La parte String[] args, describe la informacin que esta
puesta a disposicin, llamada a los parmetros.
3-5. {
System.out.println(Hola, amigos! );
System.out.println(Luego nos vemos. );
29
Captulo 2: Fundamentos
30
Captulo 2: Fundamentos
Se supone que Ud. cuenta con un editor de texto como NotePad, TextPad o JPadPro
1.
2.
3.
4.
5.
6.
31
Captulo 2: Fundamentos
Fig. 3. Los tres procesos: escribir el archivo del programa, compilar para producir el archivo .class, y ejecutar el archivo
class.
Existen dos formas de correr un archivo ejecutable, ellas son llamadas Aplicaciones Java y
Applet Java.
Una Aplicacin Java, son programas que pueden ser ejecutados invocando al interprete
Java, desde la lnea de comando.
Un Applet es un programa Java que es incrustado en pginas Web y ejecutados por un
browser que soporta a Java. Hoy en da los Browser, tales como Explorer, Netscape,
lo poseen. As se visualizan ambos, note la diferencia.
public class TrivialAplicacion {
public static void main(String[] args) {
System.out.println("Hola,amigos.!");
}
}
import java.awt.*;
import java.applet.Applet;
public class TrivialApplet extends Applet {
public void paint(Graphics g) {
g.drawString("Hola,amigos.!", 20, 20);
}
}
cdigo HTML
<applet code="TrivialApplet.class" width=90 height=90>
</applet>
32
Captulo 2: Fundamentos
Para traducir un programa escrito en un lenguaje de alto nivel (programa fuente) a lenguaje
mquina se utiliza un programa llamado compilador. Este programa tomar como datos
nuestro programa escrito en lenguaje de alto nivel y dar como resultado el mismo programa
pero escrito en lenguaje mquina (en java bytecode), programa que ya puede ejecutar directa o
indirectamente el computador. Por ejemplo, un programa escrito en el lenguaje C necesita del
compilador C para poder ser traducido. Posteriormente el programa traducido podr ser
ejecutado directamente por el computador. En cambio, para traducir un programa escrito en el
lenguaje Java necesita del compilador Java; en este caso, el lenguaje mquina no corresponde
al del computador sino al de una mquina ficticia, denominada mquina virtual Java(JVM,
Java Virtual Machine), que ser puesta en marcha por el computador para ejecutar el
programa.
JVM (Mquina Virtual)
Qu es una mquina virtual?. Una mquina que no existe fsicamente sino que es simulada en
un computador por un programa. Por qu utilizar una mquina virtual? Porque, por tratarse
de un programa, es muy fcil instalarla en cualquier computador, basta con copiar ese
programa en su disco duro, por ejemplo. Y, qu ventajas reporta? Pues, en el caso de Java,
que un programa escrito en este lenguaje y compilado, puede ser ejecutado en cualquier
computador que tenga instalada esa mquina virtual, de hecho ya todos los sistemas operativos
cuentan con este soporte, vea Fig. 4. Esta solucin hace posible que cualquier computador
pueda ejecutar un programa escrito en Java independiente de la plataforma que utilice.
Ingeniera en Computacin, Universidad de La Seren
33
Captulo 2: Fundamentos
34
Captulo 2: Fundamentos
System.out.println(
"Nuestro primer programa Java, pero sofisticado.");
}
}
Notar que la expresin import java.lang.*; siempre existe por defecto, de manera que se
puede omitir, adems de extends Object dado que toda clase no se crea por si solo, sino que
proviene de una clase madre o padre (super clase) en este caso es Object.
Una visin de la plataforma JDK
La plataforma JDK pone a disposicin una serie de comandos y herramientas de utilidad entre
las cuales se encuentra:
Java-Compilador: javac, generando Byte-Code
Comando: javac ejemplo.java
Ejemplo: javac Hola_Alumno.java genera el archivo Hola_Alumno.class y digaHola.class.
Java-Interprete: java, llamando los Bytecode
Comando: java ejemplo
Importante: La extensin .class no debe incorporarse!
Ejemplo: java Hola_Alumno lleva a cabo la aplicacin.
Applet-Viewer: appletviewer, sirve para testear los Java-Applets sin Web-Browser
Comando: appletviewer ejemplo.html
Nota: El Applet debe ser referenciado en una pgina-HTML.
Ejemplo (absolutamente AppletMinimal (Hola_AlumnoApplet.java):
appletviewer Hola_AlumnoApplet.html.
Generador de Documentos estndar: javadoc, genera documentacin en la forma de
HTML-Documentos del cdigo fuente Java y contiene comentarios formales.
Comando: javadoc ejemplo.java
Ejemplo: javadoc -private -version -author -windowtitle "Ejemplo de un JavaDoc"
Hola_Alumno.java
Textmode-Debugger: jdb, Debugger orientado al texto.
Comando: jdb ejemplo
Desamblador: javap, recuperar cdigos fuentes Java desde Bytecode
Comando: javap ejemplo.
La devolucin del compilado Hola_Alumno.class con javap -c Hola_Alumno se v, as:
Compiled from Hola_Alumnos.java
public class Hola_Alumnos extends java.lang.Object {
public Hola_Alumnos();
public static void main(java.lang.String[]);
}
Ingeniera en Computacin, Universidad de La Seren
35
Captulo 2: Fundamentos
Method Hola_Alumnos()
0 aload_0
1 invokespecial #1 <Method java.lang.Object()>
4 return
Method void main(java.lang.String[])
0 getstatic #2 <Field java.io.PrintStream out>
3 ldc #3 <String "Hola alumnos">
5 invokevirtual #4 <Method void println(java.lang.String)>
8 return
Nota:
Si Ud. observa NO se recupera el cdigo fuente original, esto es por razones de proteccin
comercial. Sin embargo, existe un Java-Interpete disponible, llamado JavaRuntime
Environment (abrev. JRE).
Instalacin de Java
Como Ud. podr haber notado, para escribir programas se necesita un entorno de desarrollo
Java. Sun MicroSystems, propietario de Java, proporciona una forma gratuita, llamada Java
Development Kit(JDK) que se puede obtener en la direccin Web, http://www.sun.com
36
Captulo 2: Fundamentos
Para instalar la versin del CD Rom en una plataforma Windows, hay que ejecutar el archivo
j2sdk1_4_0-win.exe. De manera predeterminada el paquete ser instalado en jdk1.4,
pudindose instalar en cualquier otra carpeta. A continuacin podr instalar la documentacin
en jdk1.4\docs que se proporciona en el archivo j2sdk1_3_0-doc.zip.
La carpeta jre es el entorno de ejecucin de Java utilizado por el SDK. Es similar al intrprete
de Java (java), pero destinado a usuarios finales que no requieran todas las opciones de
desarrollo proporcionadas con la utilidad java. Incluye la mquina virtual, la biblioteca de
clases, y otros archivos que soportan la ejecucin de programas escritos en Java.
La carpeta lib contiene bibliotecas de clases adicionales y archivos de soporte requeridos por
las herramientas de desarrollo.
La carpeta demo contiene ejemplos. Por ejemplo Java2Demo a travs de un browser, en este
caso a travs de Netscape.
La carpeta include contiene los archivos de cabecera que dan soporte para aadir a un
programa Java cdigo nativo (cdigo escrito en un lenguaje distinto de Java, por ejemplo Ada
o C++).
La carpeta include-old contiene los archivos de cabecera que dan soporte para aadir a un
programa Java cdigo nativo utilizando interfaces antiguas.
Ingeniera en Computacin, Universidad de La Seren
37
Captulo 2: Fundamentos
Ahora, que ya tiene todos los archivos y carpetas de la distribucin instalados, slo le falta un
editor de cdigo fuente Java. Es suficiente con un editor de texto sin formato; por ejemplo el
bloc de notas de Windows. No obstante, todo el trabajo de edicin, compilacin, ejecucin y
depuracin, se har mucho ms fcil si se utiliza un entorno de desarrollo con interfaz grfica
de usuario que integre las herramientas mencionadas, en lugar de tener que utilizar las interfaz
de lnea de rdenes del JDK, como veremos a continuacin. Algunos entornos de desarrollo
integrados para Java son: Forte de Sun, Visual Caf de Symantec, JBuilder de Borland, Kawa
de Tek- Tools, Visual Age Windows de IBM, pcGRASP de Auburm University, Visual J++ de
Microsoft, JPadPro, BlueJ, Eclipse, y otros. La mayora de ellos se ajustan a las necesidades
del curso. Tomar la precaucin de que algunos IDEs para que funcionen requieren ciertas
versiones de Java, infrmese.
TextPad ( www.textpad.com).
JCreator LE ( www.jcreator.com).
JEdit ( www.jedit.org).
JGrasp ( www.bluej.org).
DrJava ( drjava.sourceforge.net).
WinZip ( www.winzip.com).
MySQL ( www.mysql.com).
Tomcat ( www.apache.org).
Verificar que el sistema operativo haya asumido los cambios, producto de la instalacin de
jdk1.4. Para tal efecto, utilizando lneas de comando MSDOS habr que aadir a la variable de
entorno path la ruta de la carpeta donde se encuentra esta utilidad, como por ejemplo:
38
Captulo 2: Fundamentos
A continuacin se muestran algunas demos que trae la distribucin, las que Ud. puede ejecutar
sin dificultad. Por ejemplo,
C:\jdk1.3.1\demo\sound\JavaSound.jar
C:\jdk1.3.1\demo\jfc\Java2D\Java2Demo.jar
39
Captulo 2: Fundamentos
40
Captulo 2: Fundamentos
41
C A P I T U L O III
Elementos del Lenguaje
En esta leccin veremos los elementos que aporta Java (caracteres, tipos de datos, operadores,
y otros) para escribir un programa. Considere esta leccin como soporte para el resto de las
lecciones.
Tipos de Datos y Strings
Integers
Hemos visto que no todos los valores tratados por programas Java son objetos. Los tipos de
valores simples, tales como integers y floating-point son tratados en forma diferente y son
llamados tipos de datos primitivos. Empezaremos con el uso de los enteros (integers.)
Suponga que Ud. visit Miami, y al regresar le quedan 8 pennies, ningn nickels, 5 dimes y 6
quarters. Cuanto tiene en total?
Para trabajar la respuesta sepa que un penny es una moneda de 1 cent., un nickel son 5 cents,
un dime son 10 cents, y un quarter es un cuarto de dlar o 25 cents. A travs del siguiente
programa no le ser difcil saber que Ud. tiene 208 cents. El siguiente programa ilustra varios
puntos de inters respecto al trabajo con enteros.
Ejemplo 1
public class Cambio1
{ /* Calcular cuantas monedas Ud. tiene (en cents)
Sabiendo que tiene 6 quarters, 5 dimes, ningn nickels,
y 8 pennies(o centavos en USA). */
public static void main(String[] args)
{ System.out.print("Ud. tiene ");
System.out.print(6*25 + 5*10 + 0*5 + 8);
System.out.println(" cents.");
}
//declaracin1
//declaracin2
//declaracin3
En ejemplo1, el mtodo main contiene tres declaraciones. Cuando lo ejecuta, las tres
declaraciones generan tres partes de lnea simple sobre la pantalla. Note que las primeras 2
usan print en vez de println. Permitiendo que el valor 208 aparezca inmediatamente
despus de la palabra Ud. tiene, sobre la misma lnea, y cents aparece despus.
Ud.tiene
208
cents
Generado por
declaracin1
declaracin2
declaracin3
42
/
%
adicin
substraccin
multiplicacin
divisin
mdulo
En Java (y muchos otros lenguajes de programacin) nmeros son ya sea integers o floatingpoint. Estos 2 tipos son almacenados en memoria en diferentes sentidos. Si el valor es, por
ejemplo 4, se trata de un integer. Por otro lado si es 4.0, ser tratado como floating-point.
Todos los valores del Ejemplo1 son integers. En la medida que pueda siempre use integers,
pues sern tratados ms rpido al requerir menos memoria, y no existe peligro de redondeo.
El operador, /, tiene 2 formas. Si es usado con 2 integers entonces es integer division
(divisin entera). Por ejemplo, 11 / 4 = 2, (11) / 4 = 2. Si es usado con dos valores
floating-point , o un integer y un valor floating-point, denota divisin normal. Por ejemplo,
10.5 / 2 = 5.25. El mdulo o resto es solamente usado con dos integers. Por ejemplo, 11%4 =
3 y (11)%4 = 3. Si evala m/n o m%n donde n es cero, le enva un error.
En los procesos de evaluacin, Java asume que los operadores , / y % tienen ms alta
prioridad que la + y la . Por ejemplo, 3+45 es lo mismo que 3+(45), pero no (3+4)5.
Cuando evala expresiones con varios operadores + y en una fila, o varios operadores , / y
% en una fila, el criterio es de izq. a der. Por ejemplo, 345 es lo mismo que (34)5, no
3(45). Similarmente 3/4/5 es lo mismo que (3/4)/5, no 3/(4/5) (el que produce un error).
Variables
Ejemplo2
public class Cambio2
{ /* Idem Ejemplo1. */
public static void main(String[] args)
{ int total = 6*25 + 5*10 + 0*5 + 8;
System.out.print("Ud. tiene ");
System.out.print(total/100);
System.out.print(" dlares con ");
System.out.print(total%100);
System.out.println(" cents.");
}
}
43
El Ejemplo2 es otra versin del programa Ejemplo1, esta vez haciendo uso de variables.
La declaracin
nos dice: crea una variable total que denota la expresin 625 + 510 + 05 + 8 ( = 208).
La palabra int muestra que el valor de total es un valor integers. Llamado declaracin de
variable. La declaracin
System.out.print(total/100);
dice: la salida es el cuociente entre total que es dividido por 100 (divisin entera). Es decir
208/100 (= 2) es la salida. La declaracin
System.out.print(total%100);
dice: la salida es el resto de la divisin de total dividido por 100. Es decir 208%100 (= 8).
Esto es lo que se despliega en pantalla.
Ud. tiene
dlares con 8
cents
Ejemplo 3
public class Cambio3
{
public
{ int
int
int
int
int total =
quarters*25 + dimes*10 + nickels*5 + cents;
System.out.print("Ud. tiene ");
System.out.print(total/100);
System.out.print(" dlares con ");
System.out.print(total%100);
System.out.println(" cents.");
}
}
44
Asignaciones
Toda variable tiene un nombre y una porcin de memoria, segn el tipo de dato declarado.
Decimos que el valor en la porcin de memoria es el valor asignado a la variable. En el
siguiente ejemplo el valor de la variable peso es cambiada una vez.
Ejemplo 4
public class Peso1
{
}
}
Este programa parte creando 2 variables llamadas stones y libras . (1 stone = 14 libras.)
y declara
libras = 14*stones + libras;
es nuestro primer ejemplo de cmo usar el valor floating-point. Y dice: crea una variable
llamada kilos de tipo double, y le asigna el valor libras * 0.4536 . Una variable de tipo
double posee 64 bits de memoria. El producto de un entero y un floating-point es calculado
en floating-point. En este caso la respuesta ser 67.1328. Una vez que el peso de la persona
ha sido calculado, las ltimas tres declaraciones entregan la respuesta.
Ud. pesa 67.1328 kilos.
La declaracin
es una declaracin de variable de tipo int. Esto significa que cuando Java obedece la
declaracin de asignacin la realiza en 2 etapas: primero evala la expresin a la derecha de
=, y almacena el resultado en la variable a la izquierda de =. De esta manera cuando
agregamos 15stones y el valor original en libras, obtendremos la respuesta en la variable
Ingeniera en Computacin, Universidad de La Seren
45
libras,
libras.
que dice: adicione 14stones a libras. Similarmente puede usar = para cuando quiera
restar o substraer un valor desde una variable, y podemos usar = cuando queramos
multiplicar una variable por el valor, y as sucesivamente. Uno de los ejemplos ms comnes
en este tipo de declaraciones es para cuando queremos adicionar 1 al valor de la variable. En
tal caso podemos escribir, por ejemplo,
x += 1;
para sumar 1 al valor de x. Sin embargo, es ms comn una declaracin del tipo
x++;
Por ejemplo, Tipo puede ser int, Nombre puede ser quarters, y Expresion ser 6. Esta sera
la declaracin
int quarters = 6;
Punto Flotante.
El nombre punto flotante floating-point proviene en el sentido que estos nmeros son
representados en la memoria del computador. La notacin es similar a la notacin cientfica
(es decir, 1.0751024), pero usando base 2 en vez de base 10.
En Java, el tipo de dato double es el usado ms comnmente para valores punto flotante.
64 bits son usados para valores double. Siendo el rango de los valores: aproximadamente
1.810308, equivalente a 15 dgitos significativos. El nombre double es para double
precision floating-point. Java tiene un segundo tipo de dato para tratar nmeros floatingpoint, llamados float. Este tipo de dato usa solamente 32 bits para los valores, siendo ms
econmico en el uso de memoria, pero tiene la mitad de la precisin de double.
Ingeniera en Computacin, Universidad de La Seren
46
Los nmeros floating-point pueden ser escrito con punto decimal, es decir, 14.56 o 14.0.
Puede tambin ser escrito con exponente, es decir, 14.56E-12, que es equivalente a
14.561012.
Como cualquier tipo de dato, podemos declarar variables de tipo double. Por ejemplo,
double radio = 1.67;
que crear una variable llamada radio, considerando 64-bit en memoria que contiene el valor
inicial 1.67.
Funciones Estndares
Java proporciona mtodos que calculan el rango de las funciones matemticas usando valores
double. Aqu hay algunos ejemplos, ellos son mtodos static (es decir, mtodos que NO
pertenecen a un objeto) en la librera Math de Java.
Math.sin(x)
Math.cos(x)
Math.tan(x)
Math.exp(x)
Math.log(x)
Math.abs(x)
Math.floor(x)
Math.ceil(x)
seno de x
coseno de x
tangente de x
ex
log natural de x
valor absoluto de x
entero ms grande que sea x
entero ms pequeo que sea x
pues el resultado se redondea perdiendo precisin ya que sqrt() devuelve un valor de tipo
doble. Algunas otras observaciones, son las siguientes,
int m = 3;
int n = 4;
double x = mn;
cuando Java ejecuta la tercera declaracin evalua mn usando aritmtica entera para dar 32-bit
al valor entero 12. Entonces convertir el valor 12 a 64-bit floating-point, que ser
almacenado en x. Si reemplazamos, la tercera declaracin por,
double x = m/n;
la respuesta es que x ser seteado a 0. La razn es que en aritmtica entera usar la expresin
m/n, y el operador ser divisin entera. As el valor es cero.
47
Suponga que queremos usar una divisin normal en floating-point para trabajar sobre x
Debemos entonces tratar el valor de m y n como valor floating-point. Pudiendo escribir,
double x = ((double) m) / n;
El trmino (double) es llamado cast. Podemos usar casts para transformar un valor de un tipo
cualquiera que sea en un valor equivalente de otro tipo.
La parte entera de un nmero floating-point. Por ejemplo, el nmero floating-point 4.7 se
convierte en el entero 4. El camino para hacer esto en Java es usar el cast int. Supongamos
lo siguiente,
double x = 4.7;
int i = (int) x;
Por ejemplo, si x es igual a 4.7, el valor de x + 0.5 ser 5.2, y el valor de(int)(x + 0.5)
ser 5, el cual es el techo de 4.7. Sin embargo, si x es 4.7, se obtiene que el valor de x + 0.5
ser 4.2, y el valor de (int)(x + 0.5) ser 4, el que no es el techo de 4.7.
Ejemplo 5.
// Demo para practicar con los tipos de datos y operadores
class BasicaMate {
public static void main(String args[]) {
// aritmetica usando integers
System.out.println("Aritmtica");
/*
double x =4.7;
int i = (int) (x + 0.5);
System.out.println("x es " + x);
System.out.println("i es " + i);
*/
/*
double r;
r= Math.sqrt(10);
*/
float r;
r=(float)Math.sqrt(10);
int m = 3;
int n = 4;
double x = m/n;
double z = ((double) m) / n;
System.out.println("r es " + r);
System.out.println("m es " + m);
System.out.println("n es " + n);
System.out.println("x es " + x);
Ingeniera en Computacin, Universidad de La Seren
48
Clases de I/O
Por lo general, cada texto introductorio en el lenguaje Java trae hoy en da sus propias clases,
generando que inevitablemente debamos conocer como trabajan las clases, los mtodos y la
forma de ingresar y retornar datos. Tal como se mencionaba, en la Leccin1 Fundamentos),el
libro Java How To Program (Deitel & Deitel 3Ed.) posee el paquete com.deitel.jhtp3.*,
de la misma manera el libro de Cay S. Horstmann, Core Java 2, Volumen I, (Fundamentals)
trae el paquete corejava, y David Flanagan trae el paquete com.davidflanagan.*. Con esto
quiero decir que en la prctica siempre nos encontraremos con libros que de una u otra manera
tienen enfoques distintos y distintas clases para tratar el ingreso y retorno de datos.
Frecuentemente un programa necesita obtener informacin desde un origen o enviar
informacin a un destino, hasta el momento los datos son estticos, es decir han sido
incorporados al programa a travs de asignaciones simples con expresiones aritmticas. Sin
embargo en general la comunicacin entre el origen de cierta informacin y el destino, se
realiza mediante un flujo de informacin (llamado, stream en ingls), que es un objeto que
hace de intermediario entre el programa, y el origen o el destino de la informacin. Luego,
para que un programa pueda obtener informacin desde un origen tiene que abrir un flujo y
leer la informacin, anlogamente para escribir la informacin. De all que necesitemos
incorporar datos en forma dinmica a travs del teclado. Todas las clases relacionadas con
flujos en la distribucin estndar de Java estn en el paquete java.io, de manera que en rigor
debera importar este paquete en el encabezado mediante la declaracin import java.io.*;
en el encabezado del programa. Sin embargo, Java lo importa por defecto, de manera que no
se preocupe de hacerlo. Como ya habamos mencionado, existen normalmente tres flujos de
datos de I/O conectados a su programa:
System.in--- el flujo de entrada.
System.out--- el flujo para los resultados normales.
System.err--- el flujo para los mensajes de error.
Si su programa hace aritmtica, los caracteres de la entrada se convertirn en uno de los tipos
numricos primitivos. Se calcula (usando aritmtica), y luego el resultado se convierte a dato
character. La informacin que un programa enva al monitor son datos character:
Ingeniera en Computacin, Universidad de La Seren
49
(Realmente, los caracteres no se envan directamente al monitor, sino que ellos se convierten
primero en una seal de video por la tarjeta grfica. Esta forma de convertir datos de una
forma a otra es muy comn). El siguiente programa lee characters desde el teclado en el
String llamado enDato. Luego los caracteres almacenados en String son enviados al
monitor.
Ejemplo 6.
import java.io.*;
class Eco{
public static void main (String[] args) throws IOException
{
InputStreamReader inStream = new InputStreamReader( System.in ) ;
BufferedReader stdin = new BufferedReader( inStream );
String enDato;
System.out.println("Ingrese el dato:");
enDato = stdin.readLine();
System.out.println("Ud. ingreso:" + enDato );
}
}
La lnea import java.io.*; dice que el paquete java.io ser usado y * significa que
cualquier clase al interior del paquete sera usada.
IOException
es necesario para programas que tienen entrada por teclado (por lo menos por
ahora.) para informarle al compilador que main() tiene un funcionamiento de entrada que
eventualmente podra fallar. A lo que si el programa que se est ejecutando y un
funcionamiento de la entrada falla, el sistema le informar del fracaso y el programa se
detendr. En otras lecciones donde tratemos (Exceptions) veremos con ms detalle esta y otras
situaciones. Examinemos las siguientes declaraciones, que son bsicas para el I/O de datos en
Java.
(1) InputStreamReader inStream = new InputStreamReader (System.in);
(2) BufferedReader stdin= new BufferedReader (inStream);
50
Observar que si Ud. quisiera que el usuario ingresara datos numericos, su programa debera
convertir los caracteres a tipo de dato numrico. Para ello no olvidar que los caracteres son
primero ledos en un objeto String para luego convertirlo a dato numrico. Para tal efecto se
usa la declaracin
enDato = stdin.readLine();
num = Integer.parseInt( enDato );// convertir a int
Aqu se muestra una nueva versin del programa Peso1.java , usando BufferReader.
Ejemplo 7.
import java.io.*;
public class PesoBuffer
{
/* Calcula las libras a kilos
dado el peso almacenado en libras. */
public static void main(String[] args) throws IOException
{
BufferedReader stdin = new BufferedReader ( new InputStreamReader( System.in )
);
String stones, libras;
int num, num1;
double kilos;
System.out.println("Digame su peso.");
System.out.print("Cuantos stones: ");
stones = stdin.readLine();
num
= Integer.parseInt( stones );
System.out.print("Cuantas libras: ");
libras = stdin.readLine();
num1 = Integer.parseInt(libras);
num1 = 14*num + num1;
kilos = num1 * 0.4536;
System.out.print("Ud. pesa ");
System.out.print(kilos);
System.out.println(" kilos.");
}//end main
}//end PesoBuffer
51
ConsoleReader
ConsoleReader es otra clase usada para leer datos de entrada. Horstmann en su libro Core
Java, proporciona un paquete corejava para, entre otras cosas, leer la entrada de datos por
teclado. La clase es llamada ConsoleReader, que est habilitada en un archivo de nombre
ConsoleReader.java. Para usarla basta insertar la siguiente declaracin
ConsoleReader in = new ConsoleReader(System.in);
Aqu se muestra una nueva versin del programa Peso1.java , usando ConsoleReader.
Ejemplo 8
public class PesoConsole
{
System.out.println("Digame su peso.");
System.out.print("Cuantos stones: ");
int stones = in.readInt();
System.out.print("Cuantas libras: ");
int libras = in.readInt();
libras = 14*stones + libras;
double kilos = libras * 0.4536;
System.out.print("Ud. pesa ");
System.out.print(kilos);
System.out.println(" kilos.");
}//end main
} //end PesoConsole
52
53
Swing
Y finalmente mediante el uso de la librera Swing. Observar que el encabezado invoca a la
direccin javax.swing.JOptionPane;
Ejemplo 10.
import javax.swing.JOptionPane;
public class PesoSwing {
/* Calcula las libras a kilos
dado el peso almacenado en libras. */
public static void main( String args[] )
{
int stones, libras;
String entrada;
// prompt para input y leer la entrada
entrada = JOptionPane.showInputDialog("Digame su peso. Cuantos stones: " );
54
System.exit( 0 );
// termina el programa
}
}
Ejemplo 11.
CelsiusToFarehheit2
main
JOptionPane
showInputDialog
Integer
intValue
System.out
main
DecimalFormat
format
import java.text.*;
import javax.swing.*;
/** CelsiusToFahrenheit2 convierte Celsius a Fahrenheit.
*
input: los grados Celsius, se lee un integer de dialog
*
output: los grados Fahrenheit, un double */
public class CelsiusToFahrenheit2{
public static void main(String[] args) {
String input = JOptionPane.showInputDialog("Ingresar entero, C T.:");
int c = new Integer(input).intValue(); // convierte input en un int
double f = ((9.0 / 5.0) * c) + 32;
DecimalFormat formato = new DecimalFormat("0.0");
System.out.println("para C Celsius " + c + ",");
System.out.println("grados F Fahrenheit = " + formato.format(f));
}
}
55
cuyo resultado es 73.4 F, pero en MS-DOS. Sin embargo a veces es necesario ingresar los
datos por teclado y con varios parmetros a la vez. Esto ltimo lo veremos en el prximo
captulo.
Ahora, nos falta aprender el ingreso de datos a travs de archivos, que sean ledos por el
programa, tratados o manipulados por l, para luego ir a depositarlos en otro archivo de salida,
por ejemplo. Esto lo veremos ms adelante, en las siguientes secciones. El propsito del
siguiente ejemplo es mostrar entrada y salida de datos usando la consola y los archivos de la
clase hsa. El paquete hsa posee muchas otras clases que le pueden ser de utilidad. Ud. podr
comprobar tras la ejecucin del programa ArchivoHsaDemo.java que en el archivo
salida.txt en su carpeta de trabajo estn los datos 34, 56, 78, 90, 12. Adems intente
ingresar un nmero NO entero y ver otra de las gracias del paquete hsa, y digo gracia
porque el cdigo no posee declaraciones try-catch (atrapa excepciones).
Ejemplo 12.
import hsa.*;
public class ArchivoHsaDemo {
public static void main (String [] args) {
int [] numsArray = {34, 56, 78, 90, 12};
int i, aNum;
String entraString, saleString;
//Screen Input en la Consola
System.out.print("Ingrese un nmero entero: ");
aNum = Stdin.readInt();
// Screen Output para un nmero
System.out.println("El nmero es: " + aNum);
//Archivo Texto de Output
TextOutputFile saleFile = new TextOutputFile ("salida.txt");
for (i = 0 ; i < numsArray.length ; i++)
saleFile.println (numsArray [i]);
saleFile.close ();
//Archivo Texto de Entrada
int numNums = 0;
int[] leerNums;
TextInputFile enFile = new TextInputFile ("salida.txt");
Ingeniera en Computacin, Universidad de La Seren
56
while (!enFile.eof()) {
aNum = enFile.readInt();
numNums++;
} // end while
enFile.close();
leerNums = new int [numNums];
enFile = new TextInputFile ("salida.txt");
for (i = 0; i < numNums; i++)
leerNums[i] = enFile.readInt();
enFile.close();
// Chequear los nmeros que han sido ledos.
saleString = "Los nmeros son: ";
for (i = 0 ; i < numNums ; i++)
saleString = saleString + leerNums [i] + ", ";
System.out.println(saleString);
} //end main method
} //end ArchivoHsaDemo
Strings.
Esta seccin contiene informacin sobre uno de los tipos de datos ms comunes, strings. Un
literal string es escrito entre comillas. Por ejemplo, el perro. Si el literal es vaco se
escribe . Un string puede contener control de caracteres, esta es una lista de
combinaciones que se pueden hacer.
\n
\t
\b
\r
\f
\\
\
\
Por ejemplo,
newline
tab
backspace
return
line feed
\ character
caracter
caracter
System.out.print(El\nfin);
57
que desplegara el mensaje El perro corre. sobre la pantalla. Por otra parte El +
animal + corre + cuanTas + veces, denota el string El perro corre 10
veces.
El siguiente programa usa los mtodos usuario.readLine() para leer el nombre del
usuario y usuario.readInt() para leer la edad.
Ejemplo 13
public class Chatear
{
{
/* Chateando. */
public static void main(String[] args)
58
e
2
f
3
a
4
Java tiene un tipo de dato llamado String que difiere de los 8 tipos primitivos, en lo
fundamental porque un valor del tipo string es un objeto. Un string no es justamente un valor
de dato, tambin tiene "mtodos". (Un mtodo es un subprograma que es parte de un objeto.)
por ejemplo, si str es una variable de tipo String, Ud. puede llamar al mtodo str.length(), que
es una funcin que devuelve el nmero de carcteres en el string. Hay mucho ms que usted
puede hacer con string. Una cosa que usted no puede hacer con string es usar los operadores
<,>, <=, y <= para compararlos. Usted puede usar legalmente = = y != para comparar String,
pero debido a las peculiaridades en los objetos de la manera de comportarse, ellos no darn
los resultados que usted quiere. (El operador = = verifica si se guardan dos objetos en la
misma direccin de memoria, en lugar de si ellos contienen el mismo valor. Si Ud. examina la
distribucin de Java2 ver que en java.lang.String se encuentran estos y otros mtodos que le
pueden
servir
de
ayuda.
No
obstante,
la
versin
1.4
trae
en
C:\j2sdk1.4.2_05\src\java\util el directorio regex, que es de mucha utilidad.
La clase String define una serie de mtodos, al cual le dedicaremos algunos ejemplos. Se
supone que s1 y s2 son de tipo Strings:
s1.equals(s2)
59
(s.length( ) );
(s.indexOf('3') );
(t.indexOf('6') );
("char:" + s.charAt(3) );
("sub:" + s.substring (2) );
( (s == t)? "Y" : "N" );
( (s.equals (t) ? "Y" : "N" ));
("compare:" + s.compareTo(u) );
}
}
//el resultado es siempre true!!, porque ambos identificadores se refieren al mismo objeto. str1
y str2 ocupan la misma rea de memoria para objetos String.
str1
abc
str2
rea de memoria
Sin embargo, la utilizacin del operador new hace que se reserve o asigne memoria para un
nuevo objeto. Por ejemplo,
String str1= new String(abc);
String str2=abc;
if (str1.equals(str2)){}
//el resultado es siempre true!!, pues Java aade el objeto String abc al rea de memoria
destinada a tales objetos, de manera que cuando se compila, la segunda lnea no aade un
nuevo objeto porque ya existe uno con el mismo literal.
if (str1==str2){}
60
equals()
madre.
Ejemplo 15
class StringTest {
public static void main ( String[] args )
String str;
str
= new String("Hola alumnos");
System.out.println(str);
str
= new String("Chao alumnos");
System.out.println(str);
}
}
crea un primer Objeto, e inserta una referencia a este objeto en str, y lo imprime
System.out.println(str);
61
un programa ejecutable con este tipo de situacin invoca a su recolector de basura, a lo que el
object (el "garbage") puede volver a usar su memoria.
Ejemplo 16
Este ejemplo muestra varios objetos de la misma clase
class StringTest1
{
public static void main ( String[] args )
{
String strA; // referencia al primer objeto
String strB; // referencia al segundo objeto
// crea primer objeto y almacena su referencia
strA
= new String( "Hola alumnos" );
//sigue referenciando al objeto e imprime los datos
System.out.println( strA );
// crea un segundo objeto y almacena su referencia.
StrB
= new String( "Chao alumnos" );
//sigue referenciando al objeto e imprime los datos
System.out.println(
strB
);
strA
);
El programa imprime:
Hola alumnos
Chao alumnos
Hola alumnos
62
CAPTULO4
Llegado a esta leccin el alumno ya podr escribir programas simples pero completos. En esta
seccin se estudiarn las estructuras de control de un programa Java, entre las cuales estn las
repeticiones o ciclos y otras.
Decisiones (if)
Ahora nos dedicaremos al uso de la declaracin if. Existe una gran cantidad de alternativas
en la programacin en donde se debe ya sea decidir o seleccionar desde algunas alternativas.
En la mayora de los programas que hemos visto hasta ahora, las declaraciones no tienen
alternativas de hacer otras cosas, es un tanto lineal de cmo el compilador se comporta, dada
las instrucciones que hemos utilizado. No obstante existen posibilidades de usar alternativas o
decisiones. Este tipo de decisiones se llama en Java declaracin o estructura if. Un ejemplo
de este tipo es,
if (resp == 6048)
System.out.println("Bien!");
else
System.out.println("Error.");
que nos dice, que si el valor de resp es igual a 6048, despliega el mensajeBien!, De otra
manera dir Error. Notar que la expresin,
resp == 6048
63
De manera similar, podemos hacer uso de la lgica, en particular del conectivo ``and''
(conjuncin) para escribir una expresin que busca una variable entero minuto que se
encuentra en un rango de 0..59:
(minuto >= 0) && (minuto <= 59)
El simbolo, &&, denota ``and.'' Una pequea ejecucin de la traza de esta expresin para
cuando minuto es 64, y donde el resultado es false, como se aprecia.
(minuto >= 0) && (minuto <= 59)
=> (64 >= 0) && (minuto <= 59)
=> true && (minuto <= 59)
=> true && (64 <= 59)
=> true && false => false
Semantica
E1 && E2
conjuncin (``and''):
true && true => true
true && false => false
false && E2 => false
E1 || E2
disjuncin (``or''):
false || false => false
false || true => true
true || E2 => true
!E
negacin(``not''):
!true => false
!false => true
esta disjuncin, ||, resulta ser true, por lo tanto no existe necesidad de calcular el 2
argumento, resultando la expresin, true.
64
Ejemplo 2
Otro ejemplo interesante es considerar el mtodo: deposit(int monto): boolean, que
trata de especificar lo siguiente..
1. Si monto es no-negativo, entonces adiciona monto a la cuenta balance.
2. de otra manera, use un error de mensaje e ignore el depsito.
3. return el resultado.
Vea la salida y siga practicando, dndose otras situaciones.
import javax.swing.*;
/** BankCuenta administra una cuenta simple */
public class BankCuenta{
private int balance;
// balance >= 0
siempre!
65
Ejemplo 3
public class Multiplica1
{
{
ConsoleReader usuario =new ConsoleReader(System.in);
System.out.println("Cuanto es 72 veces 84?");
int resp = usuario.readInt();
if (resp == 6048)
System.out.println("Exito!");
else
System.out.println("Error!");
}
}
66
67
68
Que dice: Si a es menor que b despliega un mensaje, de otra manera NO hace nada.
Esta
if (a < b) then
System.out.println(El nmero ms pequeo es + a);
else
{}
es una forma ms general de una rama en if,
b = 10,
c = 3,
d = 8.
Note que la declaracin if siempre contiene el valor ms pequeo de los valores testeados, de
manera que al final, s contiene el ms pequeo de todos los valores. Una forma simple de if
con una rama es usar la declaracin return. Aqu les muestro un programa que usa el mtodo
Math.sqrt para calcular la raz cuadrada para el usuario.
69
Ejemplo 5
public class RaizCua
{ /* Busca el usuario calcular la raz cuadrada de un nmero, para ello
ingresa un valor y la salida es lo que espera. */
public static void main(String[] args)
{ ConsoleReader in = new ConsoleReader(System.in);
System.out.print("Ingrese un nmero: ");
double x = in.readDouble();
if (x < 0)
{ System.out.println
("Nmero debe ser >= 0.");
return;
}
System.out.println
("La raz cuadrada es " + Math.sqrt(x));
}
}
return statement
(sin valor de return)
return EXPRESION;
return;
La primera forma es usada al interior de un mtodo que retorna un valor. Que dice: termina
obedeciendo este mtodo y retorna el valor dado por la EXPRESION. El segundo es usado al
interior de un mtodo que no retorna valor.
Escogiendo entre alternativas
A menudo es necesario escoger entre 3 o ms alternativas. Esto puede hacerse combinando
varios if. Por ejemplo,
Si el rango de consumo de agua est entre 70 100 costo = A
Si el rango de consumo de agua est entre 60 69 costo = B
Si el rango de consumo de agua est entre 50 59 costo = C
Si el rango de consumo de agua est entre 40 49 costo = D
Si el rango de consumo de agua est entre 30 39 costo = E
Si el rango de consumo de agua est entre 20 29 costo = F
Si el rango de consumo de agua est entre 10 19 costo = G
Si el rango de consumo de agua est entre 0 9 costo = H.
Ingeniera en Computacin, Universidad de La Seren
70
Aqu mostramos un programa completo que convierte un rango ingresado por usuario en
costos.
Ejemplo 6
public class Costos
{ /* Lee un valor en el rango 0 a 100,
y como salida le entrega el costo.
*/
public static void main(String[] args)
{ ConsoleReader in = new ConsoleReader(System.in);
System.out.print("Ingrese el rango [0-100]: ");
int rango = in.readInt();
String costo;
if (rango >= 70) costo = "A";
else if (rango >= 60) costo = "B";
else if (rango >= 50) costo = "C";
else if (rango >= 40) costo = "D";
else costo = "F";
System.out.println("Costo = " + costo);
}
}
La misma tcnica puede ser usada para situaciones en las que se quiera testear una serie de
situaciones una despus de otra
if (B1)
else if
else if
else if
else T
S1
(B2) S2
(B3) S3
(Bn) Sn
71
Un tipo de dato bastante frecuente de usar en los cdigos donde intervienen las decisiones son
los tipos de datos booleanos, llamados boolean. La expresin booleana resp == 6048
puede ser evaluada para obtener uno de los valores de verdad true o false. Estos valores
son llamados valores booleanos. Determinando un tipo de dato llamado boolean. Ud. puede
crear variables de tipo boolean y asignarlo a una expresin Booleana, por ejemplo,
boolean ok = (x > 0);
El operador == normalmente nunca es usado para testear si 2 string son los mismos, una
alternativa es utilizar el mtodo equalsIgnoreCase()
st1.equalsIgnoreCase(st2)
que retorna true si st1 y st2 son dos string que consisten de los mismos caracteres, ya sea
mayscula o minsculas, de otra manera ser false. Como ejemplo mostramos un pequeo
sistema de registro para alumnos. En este ejemplo se ha construido una clase llamada Alumno
y un archivo para testear si la clase esta correcta para los datos que se le ingresan, al cabo del
cual entrega una edicin de los datos que Ud. ingreso pudiendo en on-line cambiar los datos
que acabo de ingresar.
Ingeniera en Computacin, Universidad de La Seren
72
Ejemplo 7
public class Alumno {
private String idNumero;
private String nombre;
private String preGrado;
private int anhos;
private boolean estaRegistrado;
/* alumno se ha registrado.
*/
public void registro()
{ estaRegistrado = true;
}
/* alumno NO se ha registrado.
*/
public void desregistro()
{ estaRegistrado = false;
}
/* Return true si el alumno se ha registrado, sino
return false.
*/
public boolean tieneRegistro()
{ return estaRegistrado;
}
/* Editar los detalles del alumno.
*/
public void edit(ConsoleReader input)
{
System.out.print("ID numero (" + idNumero +") " );
String replica = input.readLine();
if (! replica.equals(""))
idNumero = replica;
System.out.print("Nombre (" + nombre + ") ");
replica = input.readLine();
if (! replica.equals(""))
nombre = replica;
System.out.print("Programa de pregrado (" + preGrado + ") ");
replica = input.readLine();
if (! replica.equals(""))
if (replica.equals("Ing. Civil") ||
replica.equals("Ing. Alimentos") ||
replica.equals("Ing. Computacion") ||
replica.equals("Ped. Matematicas"))
preGrado = replica;
else
System.out.println("programa de pregrado desconocido.");
System.out.print("Aos (" + anhos + ") ");
replica = input.readLine();
if (! replica.equals(""))
anhos = Integer.parseInt(replica);
if (estaRegistrado)
System.out.print("Esta registrado (si) ");
else
System.out.print("Esta registrado (no) ");
replica = input.readLine();
if (! replica.equals(""))
if (replica.equals("si"))
estaRegistrado = true;
Ingeniera en Computacin, Universidad de La Seren
73
Observar que Test Alumno es una nueva clase pblica la cual invoca a Alumno y
ConsoleReader. TestAlumno esta guardado en archivo con nombre TestAlumno.java,
independiente de la clase Alumno. Pero si en el mismo directorio donde se reconocen.
public class TestAlumno
{
/* Lee detalles de los alumnos. Crea el correspondiente objeto Alumno, y edita
los detalles del objeto.
*/
public static void main(String[] args)
{
/* Crea ConsoleReader para leer el tipo de usuario. */
ConsoleReader in = new ConsoleReader(System.in);
/* Crea el Alumno. */
System.out.println
("Cul es el nmero ID del alumno(a)?");
String i = in.readLine();
System.out.println
("Cul es el nombre del alumno(a)?");
String n = in.readLine();
System.out.println
("Pregrado al que pertenece el alumno(a)?");
String d = in.readLine();
Alumno st = new Alumno(i,n,d);
System.out.println();
System.out.println("Editar los detalles del alumno.");
st.edit(in);
System.out.println();
}
}
Aqu se ve la salida posible al programa anterior, llamado Test Alumno.java con la clase
Alumno en el archivo Alumno.java, adems de la clase ConsoleReader.java
74
igual
no igual
menor que
menor o igual a
mayor que
mayor o igual a
Justamente algunas expresiones aritmticas pueden ser construdas de una forma muy simple
usando operadores aritmticos, tales como, +, , , etc. Si B1 y B2 son expresiones Booleanas.
operador
B1 && B2
B1 || B2
! B1
hace
B1 and B2
B1 or B2
not B1
Expresiones cuyo resultado estn basado en la lgica Boolena, por ejemplo, B1 && B2 es
true si B1 y B2 son ambos true, de otra manera es false. Cuando Java evala B1 && B2,
evaluara primero B1. Si B1 es false no evaluara B2, pues esta condenado a ser false. Un
anlisis similar se hace con los otros conectivos. La expresin ! B1 ser true si B1 es false,
y ser false si B1 es true.
Una expresin de este tipo,
n >= 0 && n< 10 || n >= 20 && n < 30
Una de las tareas ms comunes para cuando compara string, es salir en forma elegante de un
men, por ejemplo tipeando quit, para tal efecto se usa que un valor boolean es o no
equals.
75
Ejemplo 8
public class ComoEstas
{
Ciclos
Esta seccin trata de un problema comn en programacin y se refiere a la construccin de
loops o ciclos. Ud. conoce que declaracin usar para la accin de repetir cada vez, lo mismo
de la expresin booleana a usar para testear si el loop a finalizado su tarea. Pero
desafortunadamente para llevar a cabo este tipo de test, es ya sea al comienzo de la accin, de
donde Ud. usa la declaracin while, si ocurre al final usa la declaracin do-while. Pero
que usar cuando desea testear lo que esta ocurriendo a mitad de camino?
Existen varias formas de solucionar esto, un ejemplo tpico es que el usuario ingrese un
nmero x, si x 0, despliegue la raz cuadrada de x. Si el usuario ingresa un nmero negativo
obtendr una seal de trmino del programa,
Repeat
{ Lea el siguiente valor de la entrada
y almacenelo en x;
Si x es negativo termina;
Salida, la raz cuadrada de x;
}
76
Versin 2
Esta versin usa break. Un break dice a Java: termine el loop que Ud. esta realizando en el
acto. En esta version, es un break que causa el termino del loop, y no la expresin Booleana
al comienzo del while. La expresin Boolean al comienzo del while es la constante true. De
seguro que cuando Java evala esto, siempre obtendr el resultado true. As este ciclo nunca
concluye, pero junto con un break podemos generar cdigos que terminen la ejecucin del
programa.
while (true)
{ Lea el siguiente valor de entrada
y almacenelo en x.
if (x<0) break.
Salida, la raz cuadrada de x.
}
break puede ser usado para terminar cualquier tipo de
un break esta en el interior de un ciclo que es a su vez
77
}
}
Note que usamos un valor negativo para controlar el programa, valores de este tipo se llaman
sentinelas. Otra forma es usar un mensaje de quit. En tal caso Ud. ingresa esta palabra para
terminar el programa, sino convertir el valor ingresado a double y continua procesando los
datos.
while (true)
{ System.out.print("Ingrese el nmero: ");
String replica = in.readLine();
if (replica.equalsIgnoreCase(quit)) break;
double x = Double.parseDouble(replica);
System.out.println
("Raiz Cuadrada = " + Math.sqrt(x));
}
for
A menudo los loop son usados para generar una serie de valores, cada uno de los cuales esta
almacenado en una variable. Por ejemplo, supongamos que queremos desplegar una tabla de
valores de cos(x) para los valores x: 0, 5, 10, 15, 85, 90. Tal cdigo sera,
double x = 0;
while (x <= 90)
{ Display el valor de x y cos(x).
x = x+5;
}
Un loop de esta forma puede expresarse como for , que tiene la forma,
for (Primero; Continua; Siguiente)
Declaracion
Por ejemplo,
for (double x = 0; x <= 90; x = x + 5)
System.out.println(\t + x + \t + Math.cos(x));
(El valor de cos(x) esta desplegado con 16 decimales). Cuando tengamos un loop del tipo
while, tal como,
int i = 0;
while (i < n)
{ Declaracin
i++;
}
78
Para dejar el termino como una constante, podemos usar una constante llamada cuanTos
for (int i = 0; i < cuanTos; i++)
Escoger un circulo y un color al azar
Y pinte el circulo con el color.
APLICACIONES
En este segmento he escogido estas tres aplicaciones con la intencin de usar de mejor manera
las estructuras de control en beneficio de obtener un programa amigable.
a) Argumentos en la lnea de comando.
Muchas veces, cuando invocamos a un programa desde el sistema operativo, necesitamos
escribir uno o ms argumentos a continuacin del nombre del programa, separados por un
espacio en blanco. Por ejemplo, ls -l del sistema operativo UNIX o en dir /p del sistema
operativo MS-DOS. Tanto ls como dir son programas; -l y /p son opciones o argumentos en la
lnea de rdenes que pasamos al programa para que tenga un comportamiento diferente al que
tiene de forma predeterminada; es decir, para cuando no se pasan argumentos. De la misma
forma, podemos construir aplicaciones Java que admitan argumentos a travs de la lnea de
comando. Qu mtodo recibir esos argumentos? El mtodo main, ya que este mtodo es el
punto de entrada a la aplicacin y tambin el punto de salida.
public static void main(String[] args)
// Cuerpo del mtodo
Como se puede observar, el mtodo main tiene un argumento args que en lo formal es una
matriz unidimensional de tipo String. Para ejecutarlo con parmetros deber ir a INICIOprogramas-accesorios-simbolo del sistema, aunque algunos IDEs traen incorporado esta
alternativa. Si Ud. lo hubiese ejecutado de la misma forma que antes, le debera salir un
mensaje, como el siguiente.
Ejemplo 10
import java.text.*;
/** CelsiusAFahrenheit convierte input Celsius a Fahrenheit.
*
input: C Celsius, un integer
*
output: F Fahrenheit, un double */
public class CelsiusAFahrenheit
{ public static void main(String[] args) {
int c = new Integer(args[0]).intValue();//args[0] argumento del programa
Ingeniera en Computacin, Universidad de La Seren
79
En general, el nombre args puede ser cualquier otro. Esta matriz almacenar los argumentos
pasados en la lnea de comando cuando se invoque a la aplicacin para su ejecucin de la
forma que se observa a continuacin. Observe que cada argumento est separado por un
espacio.
>java MiAplicacion argumento1 argumento2 ...
Cada elemento de la matriz args referencia a un argumento, de manera que args[0] contiene el
primer argumento de la lnea de comando, args[1] es el segundo, y as sucesivamente. Por
ejemplo, supongamos que tenemos una aplicacin Java denominada Test.java que acepta los
argumentos -n y -l. Entonces, podramos invocar a esta aplicacin escribiendo en la lnea de
comando del sistema operativo el siguiente comando:
>java Test -n -l
Esto hace que automticamente la matriz args de objetos String se cree para contener dos
objetos String: uno con el primer argumento y otro con el segundo. Para clarificar lo expuesto
vamos a mostrar una aplicacin a travs de un ejemplo que simplemente visualiza los valores
de los argumentos que se la han pasado en la lnea de comando. Esto nos dar una idea de
cmo acceder desde un programa a esos argumentos. Supongamos que la aplicacin se
denomina Test y que slo admite argumentos -n, -k y -l. Esto quiere decir que podremos
especificar de cero a tres argumentos. Los argumentos repetidos y no vlidos se desecharn.
Por ejemplo, la siguiente lnea invoca a la aplicacin Test pasndole los argumentos n y -l:
>java Test -n -l
80
81
82
c) Recursividad
Existen procesos que se llaman a s mismo, tales procesos o mtodos son llamados mtodos
recursivos, muy tiles y fcil de programar en contraste con los mtodos iterativos. Por eso
que los mtodos recursivos son muy aplicados en la programacin y Ud. podra seguirse
familiarizandose con esto. Consideremos el siguiente programa. Lea dos enteros de la
entrada de usuario y luego despliege el valor del primero elevado al segundo. El valor es
power(n,p). Note que power es un mtodo recursivo.
Ejemplo 13
public class PotenProg
{ /* Lee 2 integers, x e y, donde y>=0. Output es el valor de x elevado
a y. */
public static void main(String[] args)
{ ConsoleReader in =
new ConsoleReader(System.in);
System.out.print
("Ingrese el primer entero: ");
int i1 = in.readInt();
System.out.print
("Ingrese el segundo entero(>0): ");
int i2 = in.readInt();
System.out.println
(i1 + " elevado a " + i2 +
" = " + power(i1,i2));
}
/* Si p>=0, return n elevado a p. */
private static int power(int n, int p)
{ if (p == 0)
return 1;
else
return power(n,p-1)*n;
}
}
= 243
Suponga ahora que el programa est siendo ejecutado y la entrada por usuario es 2 y 4. Luego
el mtodo main es llamado, el usuario ingresa los dos valores, luego Java llamar a
power(2,4) para encontrar la solucin y respuesta, notar que la funcin est definida como
mtodo. En la primera llamada al mtodo power el parmetro valor es n = 2 y p = 4. En este
caso la segunda declaracin return en el cuerpo del mtodo ser realizada, esto significa que
Java evaluar la expresin power(n,p-1)*n, y entonces power(2,3) ser evaluado. Se tiene,
power(2,4) power(2,3). La siguiente vez que power es llamado pasa lo mismo, esta vez
power(2,2) ser llamada y el diagrama queda, power(2,4) power(2,3) power(2,2).
Ingeniera en Computacin, Universidad de La Seren
83
No digo que este proceso sea rpido, pero si es sencilla su implementacin para calcular np.
Si p < 0 la cadena seguir por siempre. Luego un cdigo para calcular np, donde p 0, deber
tener probablemente algo parecido a esto.
int resp = 1;
for (int i = 0; i < p; i++)
resp = resp * n;
En general, cualquier mtodo recursivo puede ser escrito usando cdigo no-recursivo. Otro
ejemplo tpico es el factorial de un nmero entero.
Ejemplo 14
public class FactorialTest
{ // Clculo del factorial de un nmero
public static long factorial(int n)
{
if (n == 0)
return 1;
else
return n * factorial(n-1);
}
public static void main(String[] args)
{
ConsoleReader in = new ConsoleReader(System.in);
int numero;
long fac;
Ingeniera en Computacin, Universidad de La Seren
84
do
{
System.out.print("Ingrese el Nmero:");
numero = in.readInt();
}
while (numero < 0 || numero > 25);
fac = factorial(numero);
System.out.println("\nEl factorial de " + numero + " es: " + fac);
}
}
85
CAPITULO5
Excepciones y Flujo de Datos (Exceptions y Streams)
Mensajes de error enviados por el compilador.
Los humanos podemos tolerar errores ortogrficos y gramaticales, pero los computadores no,
y por esta razn el compilador Java cumple con su labor de denunciar este tipo de errores,
identificando la lnea y dando una corta explicacin. Por ejemplo, aqu tenemos un programa
que tiene varios errores.
public class test
{ public static main(String[] args)
{ System.out.println(Hello!)
}
b) Luego el compilador reporta otro error en la lnea 3 del programa y que se ubica
aproximadamente en la posicin marcada con ^. Lo que nos ayuda a ver con mayor
preocupacin que pasa en ese segmento de programa, y notamos que al escribir la
palabra. Hola!, hemos olvidado escribirlo entre comillas.
C:\Documents and
Settings\usuario\Escritorio\POO\POO_web_CD\Java_poo\Libro_Base_java\test.jav
a:4: ';' expected
}
^
C:\Documents and
Settings\usuario\Escritorio\POO\POO_web_CD\Java_poo\Libro_Base_java\test.jav
a:5: '}' expected
^
4 errors
Herramienta completada con cdigo de salida 1
Para mayor consulta dirigirse a The Java Language Specification, de J. Gosling, B. Joy, y G.
Steele, Addison Wesley Publishing, 1996, para la definicin del lenguaje Java.
Diagnostico de los errores en Expresiones y Variables
Expresiones y variables le dan a un programa ms potencia, pero al mismo tiempo ofrecen la
oportunidad de generar ms errores. Los errores en este sentido pueden ser de dos formas:
Errores relacionados con la gramtica, contexto (tipo de datos), que el compilador Java
puede detectar, son llamados: errores en tiempo de compilacin.
Si consideramos el programa
public class Test1{
public static void main(String[] args) {
System.out.println( (1+2(*3 );//que desea?
System.out.println(Hola!);
}
}
87
C:\Documents and
Settings\usuario\Escritorio\POO\POO_web_CD\Java_poo\Libro_Base_java\Test1.java:
4: cannot resolve symbol
symbol : class string
location: class Test1
string s;
^
C:\Documents and
Settings\usuario\Escritorio\POO\POO_web_CD\Java_poo\Libro_Base_java\Test1.java:
3: operator + cannot be applied to int,boolean
System.out.println(3 + true);
^
tras el proceso natural de compilacin podr ver que el compilador no anuncia ningn tipo de
problemas. Sin embargo, en la ejecucin dice lo que se muestra.
este es un tpico error en tiempo de ejecucin, o tambin llamado una exception. Esto surgi
cuando un programa usa tipos de datos incorrectos como argumentos del programa. No
obstante si declara double i=0; en la ejecucin saldr
c) Otro ejemplo, surge para cuando se desea ejecutar un programa Java pero con varios
parmetros desde la consola.
Ingeniera en Computacin, Universidad de La Seren
88
El mensaje de error fue gatillado por la lnea 3, y fue generado por la creacin de un objeto
Integer en la lnea, siendo que la entrada de datos es un carcter, en este caso a.
Finalmente, mostremos algunos errores que no son detectados ni por el compilador de Java, ni
por su intrprete. Por ejemplo, se imprimen las variables x e y que son la misma. La
declaracin pasa la inspeccin del compilador Java, ahora realiza su ejecucin y si Ud. espera
ver ya sea un true o un false ver que surge un resultado, 7.
public class test {
public static void main(String[] args)
int x = 3;
int y = 7;
System.out.println(x = y);
System.out.println("Hola!");
}
}
89
90
La ltima parte finally clausula es por lo general omitida. Cuando el interprete obedece la
declaracin try-catch, ella ejecuta la DECLARACION try normalmente. Si ninguna
excepcion es arrojada, eso es todo cuanto la declaracin try-catch hace. Si una excepcion es
arrojada, el interprete partira buscando para una try-clausula que sea obedecida para cuando
la excepcion fue arrojada.
Por supuesto la declaracin try en la declaracin try-catch fue obedecida, pero puede
haber otra declaracin try-catch ms cerca de donde ocurri el error. El intrprete entonces
buscar el ms interno, llamaremos a la declaracin que produjo el error S0. Primero el
intrprete mira dentro del cuerpo del mtodo que contiene S0. Si encuentra que S0 est dentro
de una try, toma una. Si hay dos o ms declaraciones try anidadas que contienen a S0,
toma la ms interna. Si S0 no est al interior de una try, el intrprete va a la declaracin S1
que llam el mtodo que contiene S0. Entonces empieza buscando la catch ms interna que
contiene S1. Si no puede encontrar uno en ese cuerpo del mtodo, va a la declaracin S2
llamando el mtodo que contiene S1. Y as sucesivamente. Aqu se muestra un programa que
contiene una declaracin try-catch. El programa lee una serie de valores de punto flotante
ingresados por el usuario, y se detiene cuando lee la palabra fin. Suma los nmeros y al
mismo tiempo cuenta cuantos nmeros son, finalmente, divide la suma de los nmero por el
contador generando as el promedio de los nmeros ingresados, el cual es desplegado en
pantalla.
El programa chequea si ve en la lnea la palabra fin. La lnea es leda usando readLine. Si
ella no tiene fin, el programa procura convertirla en nmero usando el metodo
Double.parseDouble. Si por error de tipeado, el usuario tipea algo que no es un nmero o la
palabra fin, entonces una NumberFormatException ser lanzada. Si no es capturado el
programa despliega un mensaje de error por defecto y para.
Una declaracin try-catch ha sido insertada en esta versin del programa para capturar las
excepciones, y as evitar el mensaje de error. La clausula try incluye la llamada a
Double.parseDouble, y la accin que continua para cuando el nmero esta correcto. La
clausula catch justamente despliega un simple error de mensaje, y entonces el programa esta
habilitado para realizar su tarea.
Ejemplo 1
public class Promedio1
{
/* Lee nmeros flotante ingresados por el
usuario y entrega el promedio.
(Version que usa ConsoleReader.)
*/
public static void main(String[] args) {
ConsoleReader usuario = new ConsoleReader(System.in);
/* Lee y agrega los valores, y cuenta cuantos son. */
double sum = 0;
int cuanTos = 0;
System.out.println("Ingrese los datos.");
while (true)
{ String linea = usuario.readLine();
Ingeniera en Computacin, Universidad de La Seren
91
if (linea.equals("fin")) break;
try
/* proteccin de cdigo, que podra lanzar una excepcin dentro de try, pues
este segmento de cdigo podra causar una excepcin, si no existen problemas
continue, sino*/
{
}
catch (NumberFormatException e)
/* Atrape la excepcin, haciendo una prueba para manejar una excepcin dentro
de catch*/
{ System.out.println
("Ingreso NO reconocido, intentelo de nuevo!.");
}
}
/* el promedio. */
if (cuanTos > 0)
System.out.println
("El valor promedio es = " + sum/cuanTos);
else
System.out.println("Sin resultado.");
}
}
Tambin como excepciones producidas por Java, puede forzar una excepcion para ser arrojada
mediante la declaracin throw . Esta clausula indica que algn cdigo en el cuerpo de su
mtodo podra lanzar una excepcin, para tal efecto simplemente agregar la palabra throw
despus del nombre del mtodo pero antes de abrir el bloque. Por ejemplo,
public boolean miMetodo(int x, int y) trows AnException {
Note que un constructor es usado para crear el objeto exception aqu. Existen muchos tipos de
excepciones definidas en la librera. Para encontrarlas todas vea la clase Exception y sus
subclases. Tambin, puede Ud. definir sus propias clases exccepcion extendiendo la clase
Exception.
Leer desde el teclado
Cuando un programa Java lee la entrada, usa un objeto de algn tipo para manejar la entrada.
El objeto ser conectado a la fuente de la entrada, es decir la entrada fuente, me refiero a el
teclado o archivo de texto. En trminos de leer valores de entrada desde la fuente usamos
mtodos pertenecientes a ese objeto. El objeto ConsoleReader el cual hemos usado durante el
curso para leer desde el teclado es un tpico ejemplo de un objeto que maneja la entrada.
92
El objeto que maneja la entrada ser llamada InputStream o un Reader. La diferencia depende
sobre que valores produce para cuando lea los caracteres. Un InputStream returns un 8-bit
byte cada vez que lea un carcter, que es como el sistema lo representa. Un Reader returns 16bit caracteres. Esta es la forma estandar que Java representa caracteres, usando caracteres de
cdigo llamados unicode.
Cada vez que se crea un objeto ConsoleReader, hacemos uso de otro objeto llamado
System.in. Esto es un InputStream conectado directamente al teclado. InputStreams tiene
varios mtodos asociados con ellos, pero solamente uno puede ser usado para leer la entrada
que es read que lee 8-bit byte. El siguiente diagrama representa el objeto System.in
conectado al teclado, con la informacin que fluye del teclado,
keyboard
System.in
Java posee clases llamadas InputStreamReader que consiste de objetos que producen los
caracteres 16-bit unicode usados por Java. Existe un constructor que puede convertir un
InputStream en un InputStreamReader. Ud. deber darle InputStream como parametro, y el
creara el InputStreamReader.
Por ejemplo, la declaracin siguiente construira una
InputStreamReader conectado a System.in.
InputStreamReader lector = new InputStreamReader(System.in);
Ud. puede incluir un segundo parmetro para especificar un decodificador noestandar para
devolver bytes en caracteres unicode. Sin el segundo parametro, el InputStreamReader usar
un decodificador estandar, el cual es satisfactorio para usos o propsitos normales. Lo mismo
es posible para la salida. Aqu esta el diagrama de InputStreamReader definido anteriormente.
Se obtiene 8-bit bytes desde el teclado, usando System.in, convirtindolos en caracteres de
16-bit.
teclado
System.in
InputStreamReader
Un InputStreamReader tiene un mtodo read que entrega un carcter simple. Esto sera
posible de usarse para cuando escriba mtodos que usan nmeros reales, lneas de texto, etc.
Sin embargo, un conveniente punto de partida es un objeto, el cual puede leer una linea de
caracteres ala vez. Existen 2 tipos de objetos que pueden hacer uso de ellos. Uno es llamado
BufferedReader y el otro es LineNumberReader. Ambos tienen un mtodo readLine que
retorna la siguiente lnea de entrada. Ud, puede convertir un InputStreamReader en
BufferedReader. Usualmente se hace mediante constructores. Por ejemplo,
BufferedReader usuario =
new BufferedReader
(new InputStreamReader(System.in));
Ingeniera en Computacin, Universidad de La Seren
93
System.in
InputStreamReader
BufferedReader
Ejemplo 2
Un programa que pregunta por la dimensin del cuadrado y entrega lo solicitado. Si le ingresa
el valor 5, vera la figura:
*****
*
*
*
*
*
*
*****
import java.io.*;
public class Ejerc5{
public static void main(String args[]) throws IOException {
int tam;
BufferedReader din;
din = new BufferedReader( new InputStreamReader(System.in));
System.out.println("Cuadrado");
System.out.println("========");
while (true) {
System.out.print("Largo del lado [1-20,0=Fin]: ");
tam = Integer.parseInt(din.readLine());
if (tam < 1) {
break;
}
else if (tam <= 20) {
for (int i = 1; i <= tam; ++i) {
for (int j = 1; j <= tam; ++j) {
if (j == 1 || j == tam || i == 1 || i == tam){
System.out.print("*"); }
else {
System.out.print(" ");
}
}
System.out.println();
}
}
}
}
}
94
Ejemplo 3
El programa CambioMoneda, calcula el cambio para un monto de dolares-y cents, todo ello
ingresado por teclado.
import java.io.*;
/** CambioMoneda calcula el cambio para un monto de dolares-y -cents.
* input: un monto en dolares y un monto en cents. Ambos enteros.
* output: el listado de las monedas necesarias. */
public class CambioMoneda
{ public static void main(String[] args) throws IOException
{ BufferedReader teclado = new BufferedReader(new
InputStreamReader(System.in));
System.out.println("Tabla de Montos");
System.out.println("===============");
System.out.print("Ingrese monto de dolares: ");
String dolares = teclado.readLine();
System.out.print("Ingrese monto de cets: ");
String cents = teclado.readLine();
int monedas = (100 * new Integer(dolares).intValue())
+ new Integer(cents).intValue();
System.out.println( "quarters = " + (monedas/25) );
monedas = monedas % 25;
System.out.println( "dimes = " + (monedas/10) );
monedas = monedas % 10;
System.out.println( "nickels = " + (monedas/5) );
monedas = monedas % 5;
System.out.println( "pennies = " + monedas );
}
49\n
95
Por otra parte un archive binario es una secuencia de unos y ceros, de manera que 49 es
expresado como, 11001, y no como la representacin '4' y '9').
Cuando obtenemos informacin de entrada desde un archivo, se dice que read desde el
archivo; para cuando depositamos una informacin de salida en un archivo, decimos write en
l. Cuando comenzamos a usar un archivo, decimos que se open , y cuando terminamos de
usarlo, lo close. Los archivos pueden ser read/written en dos sentidos:
sequential file pueden ser read (o written) desde front to back; es decir es un libro que
tiene una sola direccin de lectura, pudiendo regresar en una sola direccin,
(forwards).
random access file pueden ser reads (o writes) sobre cualquier lugar, es como si en un
libro pudiese abrirlo en cualquier pgina.
Sequential files son simples para manejar y trabajar aplicaciones estandares, mientras que los
Random access files son usados principalmente para aplicaciones de database donde se
especifican bits de informacin. En este segmento se vern solamente sequential files. Para
programas Java que usan sequential file, se debe establecer si el archio usado es usado para
La clase BufferedReader lee un flujo de entrada de caracteres y los guarda en un array llamado
buffer. Para crear una versin en buffer se debe tener un objeto Reader existente de algn
tipo. Para crear un BufferedReader se puede utilizar el siguiente constructor.
BufferedReader(Reader).
Un flujo de caracteres almacenado en bufer se puede leer utilizando los mtodos read() y
read(char[], int , int) descritos en FileReader. Puede leer una lnea de texto usando el mtodo
readLine(). El mtodo readLine() devuelve un objeto String que contiene la prxima lnea de
texto en el flujo, sin incluir el carcter o caracteres que representan el final de una lnea, que
puede ser(\n, lnea nueva), (\r, retorno de carro) o una combinacin de esta ltima con la
primera. Si se llega al final del flujo, el valor devuelto de la cadena es igual a null.
Ejemplo 4:
Escribimos una aplicacin que lee el contenido de un archivo secuencial cuyo nombre es dado
por el usuario desde el teclado y copia el archivo, f, line by line, en otro file, f.out.
import java.io.*;
/** CopiarFile copia el contenido de un file, f,
* cuyo nombre es sustituido por un file, f.out
Ingeniera en Computacin, Universidad de La Seren
*/
96
al ingresar su nombre, asumir que ese archivo existe y copiara su contenido en un archivo de
salida similar. Todo esto lo comprobar si se remite a ver el directorio en donde esta
trabajando. A continuacin se ve un mensaje clsico para cuando no existe el archivo en
cuestin.
97
}
catch(RuntimeException e)
{
JOptionPane.showMessageDialog(null,
"Error en input: " + i + ". Ejecutelo nuevamente.");
}
System.out.println("Terminado.");
}
/** readAnInt lee un int y lo retorna */
private static int readAnInt() {
String s = JOptionPane.showInputDialog("Ingrese un entero:");
int num = new Integer(s).intValue();
return num;
}
}
String tokenizers y los file objects pueden ayudar a crear una aplicacin cuya entrada se basa
en un cierto formato, as como su salida. Un ejemplo estndar es el proceso de enlistar alguna
informacin, en donde en este ejemplo se trata de un archivo secuencial, donde cada lnea
contiene el nombre de un empleado, las horas trabajadas y el pago por ellas, ya sea en un
contexto de sobretiempo o alguna otra que no interesa. La informacin se ve as.
Fred Mercader|31|20.25
Lucy Riggs|42|24.50
Ethel Meza|18|18.00
Notar que la secuencia de lneas es terminada por un simbolo especial, !. Una aplicacin de
este tipo lee las lneas una por una, extrae el tokens de cada lnea, convirtiendo a nombre y
nmero y calculando el sueldo.
98
class LeerInfo
Metodos
getNextRecord():
boolean
nombreE(): String
horasE(): int
sueldoE(): double
close()
/** LeerInfo lee los records desde un sequential file. El records tiene el
formato, NOMBRE|HORA|PAGO. El file termina con un ! */
import java.io.*;
import java.util.*;
public class LeerInfo{
private BufferedReader infile; // la direccin del input file
private String END_OF_FILE = "!";
// nombre, hora y pago del record ledo:
private String nombre;
private int hora;
private double pago;
/**constructor de LeerInfo para leer desde un file el file_nombre*/
public LeerInfo(String file_nombre) {
try { infile = new BufferedReader(new FileReader(file_nombre)); }
catch (Exception e){
System.out.println("LeerInfo error: nombre file malo: "
+ file_nombre + "
Abortando!");
throw new RuntimeException(e.toString());
}
}
public String nombreE() { return nombre; }
public int horasE() { return hora; }
public double sueldoE() { return pago; }
public void close() {
try { infile.close();
}
catch (IOException e){
System.out.println("LeerInfo Atencin: falla"); }
}
/** getNextRecord pretende leer un nuevo registro.
* @return si otro record record fue read y esta ready para procesar*/
public boolean getNextRecord()
boolean result = false;
nombre = null;
hora = -1;
pago = -0.1;
try {
Ingeniera en Computacin, Universidad de La Seren
99
if ( infile.ready() ) {
String linea = infile.readLine();
StringTokenizer t = new StringTokenizer(linea, "|");
String s = t.nextToken().trim();
if ( ! s.equals(END_OF_FILE) ) {
// termina?
if ( t.countTokens() == 2 ) { // hora y pago?
nombre = s;
hora = new Integer( t.nextToken().trim()).intValue();
pago = new Double(t.nextToken().trim()).doubleValue();
result = true;
}
else { throw new RuntimeException(linea);
}
}
}
}
catch (IOException e){
System.out.println("LeerInfo error: " + e.getMessage());
}
catch (RuntimeException e){
System.out.println("LeerInfo error: mal formato record: "
+ e.getMessage() + " se salta este record y trata otra vez");
result = getNextRecord(); // try again
}
return result;
}
}
Para testear la clase LeerInfo, implementemos una clase principal llamada Pagos.java para
testearla.
/** Pagos lee un archivo bajo un cierto formato. */
import javax.swing.*;
public class Pagos{
public static void main(String[] args) {
String in_nombre = JOptionPane.showInputDialog("Nombre archivo
entrada:");
String out_nombre = JOptionPane.showInputDialog("Nombre archivo
salida:");
if ( in_nombre != null && out_nombre != null ) {
procesandoArchivo(in_nombre, out_nombre);
}
System.out.println("Terminado");
}
private static void procesandoArchivo(String in, String out) {
LeerInfo leer = new LeerInfo(in);
while ( leer.getNextRecord() ) {//algo se hace con ellos?
double pago = leer.horasE() * leer.sueldoE();
}
leer.close();
}
}
100
Aqu tenemos otra versin de Promedio1, la diferencia radica en que el programa no usa la
clase ConsoleReader. El programa parte creando un BufferedReader para leer la entrada del
usuario. Las diferencias son mostrada en bold. Como Ud. ver la primera lnea ser
afectada
101
Ejemplo 5
import java.io.*;
public class Promedio2
{
Note que en el encabezado del programa as como en ejemplo que haca referencia a la
formacin de cuadrados se tiene,
public static void main(String[] args) throws IOException
Este llama al compilador que el mtodo main contiene, llamado readLine, que puede arrojar
la IOException, la cual no ser atrapada pues main no tiene la declaracin try-catch para
atraparla. En IOException se cubre un rango de diferentes errores o condiciones que pueden
ocurrir en la entrada. Un excepcin de chequeo( checked exception) . Esto significa que
debemos ya sea escribir una declaracin que la atrape, o debemos agregar una clausula
throws
Ingeniera en Computacin, Universidad de La Seren
102
al encabezado del mtodo. Una clausula throws lista una o ms exepciones, separadas por
comas.
CAY HORSTMANNS ConsoleReader CLASS
import
import
import
import
java.io.BufferedReader;
java.io.InputStream;
java.io.InputStreamReader;
java.io.IOException;
/**
A class to read strings and numbers
from an input stream.
This class is suitable for
beginning Java programmers.
It constructs the necessary buffered
reader, handles I/O exceptions, and
converts strings to numbers.
*/
public class ConsoleReader
{
103
}
}
Ud. podr utilizar esta clase en el futuro o tal vez adaptarla para sus propsitos. Recuerde que
esta versin como un ejemplo del tema que se esta tratando captura cualquier IOExceptions
que ocurra, y detiene el programa. Si Ud. no quiere esto tendr que eliminar la declaracin
try-catch.
FileReader
BufferedReader
Ingeniera en Computacin, Universidad de La Seren
104
Una vez que BufferedReader ha sido construdo, podemos coleccionar las lineas de entrada
desde el archivo usando el mtodo readLine justamente como cuando los datos vinieran del
teclado. Una diferencia es que se necesita chequear cuando todas las lneas del archivo han
sido ledas. El mtodo readLine returns null cuando el fin de archivo ha sido alcanzado.
Tambin, cuando se lee desde un archivo, se le recomienda que siempre cierre la conexin al
archivo como si Ud. hubiese terminado con l. FileReaders y BufferedReaders tienen
ambos un mtodo llamado close para hacerlo lanzando un IOException.
Tenemos una versin final del programa promedio, el cual lee datos desde un archivo llamado
hola.dat. Justamente un BufferedReader es construdo, conectando al archivo. No existe
ningn Reader conectado al teclado.
Ejemplo 6
import java.io.*;
public class Promedio4
{ /* Lee nmeros punto flotante desde un archivo
hola.dat, y entrega su promedio.
*/
public static void main(String[] args)
{ BufferedReader datos;
try
{ datos = new BufferedReader
(new FileReader("hola.dat"));
}
catch (FileNotFoundException e)
{ System.out.println
("Archivo hola.dat no fue encontrado.");
return;
}
/* Lee y suma los valores, contando cuantos son. */
double sum = 0;
int cuanTos = 0;
try
{ while (true)
{ String linea = datos.readLine();
if (linea == null) break;
try
{ double siguiente =
Double.parseDouble(linea);
sum = sum + siguiente;
cuanTos++;
}
catch (NumberFormatException e)
{ System.out.println
("Datos malos: " + linea);
}
}
datos.close();
}
catch (IOException e)
{ System.out.println(e);
return;
}
Ingeniera en Computacin, Universidad de La Seren
105
/* promedio. */
if (cuanTos > 0)
System.out.println
("El promedio es = " + sum/cuanTos);
else
System.out.println("Ningn resultado.");
}
}
Notas
Si el archivo no existe el resultado atrapa inmediatamente una excepcin del tipo
FileNotFoundException a raz de la primera declaracin try-catch y el programa detiene su
ejecucin.
La declaracin fuera de try-catch , la cual contiene el loop while, atrapa la excepcin
IOExceptions arrojado o lanzado por readLine y close.
La declaracin interna de try-catch , interna al loop, atrapa cualquier exepcin
NumberFormatExceptions arrojada por Double.parseDouble.
La secuencia de datos continua hasta fin de archivo. Si no existe la palabra fin al final, el
programa detiene su ejecucin leyendo cuando linea este seteado a null.
Si cualquier lnea de datos contiene algn error, el programa imprimir la lnea para ayudar al
usuario a entender que es lo malo en el archivo.
Escribiendo un Archivo de Texto
Si desea escribir a un archivo de texto en lnea basta con usar FileWriter, tal como se
muestra en el siguiente ejemplo.
import java.io.*;
public class FileWriterDemo{
public static void main( String args[] ) {
FileWriter fw = null;
try
{
fw = new FileWriter( "fileWriter.txt" );
fw.write( "Hola erico, aqui va el archivo" );
}
catch ( IOException e ) {
System.out.println( "No se pudo generar el archivo" );
}
finally {
try {
if ( fw != null ) fw.close();
} catch ( IOException e ) {}
}
}
}
106
Si desea escribir a un archivo de texto, es mejor usar un objeto PrintWriter. Este objeto tiene
mtodos convenientes, tales como println y print, justamenta para System.out. Un
PrintWriter no puede ser conectado directamente al archivo, pero puede ser conectado al
objeto FileWriter, el cual acepta caracteres unicode y los escribe al archivo de texto. Aqu
se da una declaracin que crea un PrintWriter para escribir un archivo de texto hola.txt.
PrintWriter salir =
new PrintWriter
(new FileWriter(hola.txt))
FileWriter
PrintWriter
Una vez realizado esto podemos usar los mtodos out.print y out.println para enviar los
datos al archivo hola.txt. Despus que toda la salida ha sido escrita al archivo llame a
out.flush(), para asegurarse que ningn carcter este perdido en la cola para cuando la
coneccin se cierre. Finalmente, llamar a out.close() para cerrar la conexin.
Archivos y Filtros.
En varios de los ejemplos que se han visto se ha utilizado una cadena para referirse al archivo
incluido en la operacin de un flujo. Esto es suficiente si queremos trabajar con archivos y
flujos pero el problema surge para cuando queramos trabajar con copiar archivos, cambiar
nombre u otras tareas. Para solucionar este problema se debe trabajar con un objeto File.
File es tambin parte del paquete java.io, y representa una referencia de archivos o carpeta.
Los constructores que puede utilizar son:
File(String), File(String, String), File(File, String). Junto con ellos existe una
cantidad de mtodos tales como exists(), length(), renameTo(File), delete() o
deleteOnExit(), mkdir(), etc..
107
java
seguido con algunos argumentos de caracteres llamados command line arguments. Por
ejemplo,
java miProg data.txt hola.dat
y suponemos que el interprete Java es dado la lnea de comando con 2 argumentos , como
antes se mencionaba, entonces un parametro variable llamado args sera creado que contenga
una referencia a los 2 elementos del array que anteriormente hacan referencia al strings
data.txt y hola.dat.
data.txt
args
hola.dat
Con los argumentos strings presentados en esta forma, el mtodo main puede procesarlo en el
sentido que el programador decida. Por ejemplo, puede usar la expresin
args.length
para denotar el nmero de argumentos. Y los argummentos individuales pueden ser referidos
como args[0], args[1], etc.
Un ejemplo de esta idea esta dado por la siguiente aplicacin que convierte en mayscula todo
el texto de un archivo. El archivo es ledo mediante un flujo de entrada almacenado en buffer,
y se lee un carcter a la vez. Una vez convertido en mayscula, el carcter se enva a un
archivo temporal por medio de un flujo de entrada almacenado en buffer. Los objetos File se
usan en vez de las cadenas para indicar los archivos involucrados, lo cual hace posible
cambiarles el nombre y borrarlos segn se necesite.
108
Ejemplo 7
import java.io.*;
public class todoMayusDemo {
public static void main(String[] arguments) {
todoMayus may = new todoMayus(arguments[0]);
may.convert();
}
}
class todoMayus {
String nombreFuente;
todoMayus(String nombreArg) {
nombreFuente = nombreArg;
}
void convert() {
try {
// Crea los objetos archivos(File)
File nombre = new File(nombreFuente);
File temp = new File( nombreFuente + ".tmp");
// Crea una entrada stream
FileReader fr = new
FileReader(nombre);
BufferedReader in = new
BufferedReader(fr);
// Crea la salida stream
FileWriter fw = new
FileWriter(temp);
BufferedWriter out = new
BufferedWriter(fw);
boolean eof = false;
int inChar = 0;
do {
inChar = in.read();
if (inChar != -1) {
char outChar = Character.toUpperCase( (char)inChar );
out.write(outChar);
} else
eof = true;
} while (!eof);
in.close();
out.close();
boolean borrar = nombre.delete();
if (borrar)
temp.renameTo(nombre);
} catch (IOException e) {
System.out.println("Error -- " + e.toString());
} catch (SecurityException se) {
System.out.println("Error -- " + se.toString());
}
}
}
109
a)
b)
Luego el compilador reporta otro error en la lnea 3 del programa y que se ubica
aproximadamente en la posicin marcada con ^. Lo que nos ayuda a ver con mayor
preocupacin que pasa en ese segmento de programa, y notamos que al escribir la
palabra
Hola!, hemos olvidado escribirlo entre comillas.
C:\Documents and
Settings\usuario\Escritorio\POO\POO_web_CD\Java_poo\Libro_Base_java\test.jav
a:4: ';' expected
}
^
c)
110
C:\Documents and
Settings\usuario\Escritorio\POO\POO_web_CD\Java_poo\Libro_Base_java\test.jav
a:5: '}' expected
^
4 errors
Herramienta completada con cdigo de salida 1
d)
Para mayor consulta dirigirse a The Java Language Specification, de J. Gosling, B. Joy, y G.
Steele, Addison Wesley Publishing, 1996, para la definicin del lenguaje Java.
Errores relacionados con la gramtica, contexto (tipo de datos), que el compilador Java
puede detectar, son llamados: errores en tiempo de compilacin.
Si consideramos el programa
public class Test1{
public static void main(String[] args) {
System.out.println( (1+2(*3 );//que desea?
System.out.println(Hola!);
}
}
111
tras el proceso natural de compilacin podr ver que el compilador no anuncia ningn tipo de
problemas. Sin embargo, en la ejecucin dice lo que se muestra.
este es un tpico error en tiempo de ejecucin, o tambin llamado una exception. Esto surgi
cuando un programa usa tipos de datos incorrectos como argumentos del programa. No
obstante si declara double i=0; en la ejecucin saldr
112
c) Otro ejemplo, surge para cuando se desea ejecutar un programa Java pero con varios
parmetros desde la consola.
public class test {
public static void main(String[] args) {
int i = new Integer(args[0]).intValue();
System.out.println(1 / i);
System.out.println("Hola!");
}
}
El mensaje de error fue gatillado por la lnea 3, y fue generado por la creacin de un objeto
Integer en la lnea, siendo que la entrada de datos es un carcter, en este caso a.
113
Finalmente, mostremos algunos errores que no son detectados ni por el compilador de Java, ni
por su intrprete. Por ejemplo, se imprimen las variables x e y que son la misma. La
declaracin pasa la inspeccin del compilador Java, ahora realiza su ejecucin y si Ud. espera
ver ya sea un true o un false ver que surge un resultado, 7.
public class test {
public static void main(String[] args)
int x = 3;
int y = 7;
System.out.println(x = y);
System.out.println("Hola!");
}
}
2.
114
Las excepciones son a menudo atrapadas o arrojadas por el mismo Java, ya sea por uno de los
mtodos de librera, o por un interprete, es decir, cuando encuentra algo el mismo trata de
accesar a un array de elementos con un valor del indice fuera del rango correcto de valores. En
este caso, la excepcion ser una IndexOutOfBoundsException.
Una clusula catch es parte de una declaracin try-catch y tiene la forma siguiente.
try
{ Declaraciones
catch (EXCEPCION1 e1)
{ Declaraciones
}
catch (EXCEPCION2 e2)
{ Declaraciones
finally
{ Declaraciones
}
La ltima parte finally clausula es por lo general omitida. Cuando el interprete obedece la
declaracin try-catch, ella ejecuta la declaracin try normalmente. Si ninguna excepcin es
arrojada, eso es todo cuanto la declaracin try-catch hace. Si una excepcin es arrojada, el
intrprete partira buscando para una try-clausula que sea obedecida para cuando la excepcin
fue arrojada.
Por supuesto la declaracin try en la declaracin try-catch fue obedecida, pero puede
haber otra declaracin try-catch ms cerca de donde ocurri el error. El intrprete entonces
buscar el ms interno, llamaremos a la declaracin que produjo el error S0. Primero el
intrprete mira dentro del cuerpo del mtodo que contiene S0. Si encuentra que S0 est dentro
de una try, toma una. Si hay dos o ms declaraciones try anidadas que contienen a S0,
toma la ms interna. Si S0 no est al interior de una try, el intrprete va a la declaracin S1
que llam el mtodo que contiene S0. Entonces empieza buscando la catch ms interna que
contiene S1. Si no puede encontrar uno en ese cuerpo del mtodo, va a la declaracin S2
llamando el mtodo que contiene S1. Y as sucesivamente. Aqu se muestra un programa que
contiene una declaracin try-catch. El programa lee una serie de valores de punto flotante
ingresados por el usuario, y se detiene cuando lee la palabra fin. Suma los nmeros y al
mismo tiempo cuenta cuantos nmeros son, finalmente, divide la suma de los nmeros por el
contador generando as el promedio de los nmeros ingresados, el cual es desplegado en
pantalla.
El programa chequea si ve en la lnea la palabra fin. La lnea es leda usando readLine. Si
ella no tiene fin, el programa procura convertirla en nmero usando el metodo
Double.parseDouble. Si por error de tipeado, el usuario tipea algo que no es un nmero o la
palabra fin, entonces una NumberFormatException ser lanzada. Si no es capturado el
programa despliega un mensaje de error por defecto y para.
Una declaracin try-catch ha sido insertada en esta versin del programa para capturar las
excepciones, y as evitar el mensaje de error. La clausula try incluye la llamada a
Ingeniera en Computacin, Universidad de La Seren
115
}
catch (NumberFormatException e)
/* Atrape la excepcin, haciendo una prueba para manejar una excepcin dentro de
catch*/
{ System.out.println
("Ingreso NO reconocido, intentelo de nuevo!.");
}
}
/* el promedio. */
if (cuanTos > 0)
System.out.println
("El valor promedio es = " + sum/cuanTos);
else
System.out.println("Sin resultado.");
}
}
Tambin como excepciones producidas por Java, puede forzar una excepcion para ser arrojada
mediante la declaracin throw . Esta clausula indica que algn cdigo en el cuerpo de su
mtodo podra lanzar una excepcin, para tal efecto simplemente agregar la palabra throw
despus del nombre del mtodo pero antes de abrir el bloque. Por ejemplo,
public boolean miMetodo(int x, int y) trows AnException {
116
Note que un constructor es usado para crear el objeto exception aqu. Existen muchos tipos de
excepciones definidas en la librera. Para encontrarlas todas vea la clase Exception y sus
subclases. Tambin, puede Ud. definir sus propias clases exccepcion extendiendo la clase
Exception.
Leer desde el teclado
Cuando un programa Java lee la entrada, usa un objeto de algn tipo para manejar la entrada.
El objeto ser conectado a la fuente de la entrada, es decir la entrada fuente, me refiero a el
teclado o archivo de texto. En trminos de leer valores de entrada desde la fuente usamos
mtodos pertenecientes a ese objeto. El objeto ConsoleReader el cual hemos usado durante el
curso para leer desde el teclado es un tpico ejemplo de un objeto que maneja la entrada.
El objeto que maneja la entrada ser llamada InputStream o un Reader. La diferencia depende
sobre que valores produce para cuando lea los caracteres. Un InputStream returns un 8-bit
byte cada vez que lea un carcter, que es como el sistema lo representa. Un Reader returns 16bit caracteres. Esta es la forma estandar que Java representa caracteres, usando caracteres de
cdigo llamados unicode.
Cada vez que se crea un objeto ConsoleReader, hacemos uso de otro objeto llamado
System.in. Esto es un InputStream conectado directamente al teclado. InputStreams tiene
varios mtodos asociados con ellos, pero solamente uno puede ser usado para leer la entrada
que es read que lee 8-bit byte. El siguiente diagrama representa el objeto System.in
conectado al teclado, con la informacin que fluye del teclado,
keyboard
System.in
Java posee clases llamadas InputStreamReader que consiste de objetos que producen los
caracteres 16-bit unicode usados por Java. Existe un constructor que puede convertir un
InputStream en un InputStreamReader. Ud. deber darle InputStream como parametro, y el
creara el InputStreamReader.
Por ejemplo, la declaracin siguiente construira una
InputStreamReader conectado a System.in.
InputStreamReader lector = new InputStreamReader(System.in);
Ud. puede incluir un segundo parmetro para especificar un decodificador noestandar para
devolver bytes en caracteres unicode. Sin el segundo parametro, el InputStreamReader usar
un decodificador estandar, el cual es satisfactorio para usos o propsitos normales. Lo mismo
es posible para la salida. Aqu esta el diagrama de InputStreamReader definido anteriormente.
117
System.in
InputStreamReader
Un InputStreamReader tiene un mtodo read que entrega un carcter simple. Esto sera
posible de usarse para cuando escriba mtodos que usan nmeros reales, lneas de texto, etc.
Sin embargo, un conveniente punto de partida es un objeto, el cual puede leer una linea de
caracteres ala vez. Existen 2 tipos de objetos que pueden hacer uso de ellos. Uno es llamado
BufferedReader y el otro es LineNumberReader. Ambos tienen un mtodo readLine que
retorna la siguiente lnea de entrada. Ud, puede convertir un InputStreamReader en
BufferedReader. Usualmente se hace mediante constructores. Por ejemplo,
BufferedReader usuario =
new BufferedReader
(new InputStreamReader(System.in));
System.in
InputStreamReader
BufferedReader
Ejemplo 2
Un programa que pregunta por la dimensin del cuadrado y entrega lo solicitado. Si le ingresa
el valor 5, vera la figura:
*****
*
*
*
*
*
*
*****
import java.io.*;
public class Ejerc5{
public static void main(String args[]) throws IOException {
int tam;
BufferedReader din;
din = new BufferedReader( new InputStreamReader(System.in));
System.out.println("Cuadrado");
System.out.println("========");
while (true) {
Ingeniera en Computacin, Universidad de La Seren
118
Ejemplo 3
El programa CambioMoneda, calcula el cambio para un monto de dolares-y cents, todo ello
ingresado por teclado.
import java.io.*;
/** CambioMoneda calcula el cambio para un monto de dolares-y -cents.
* input: un monto en dolares y un monto en cents. Ambos enteros.
* output: el listado de las monedas necesarias. */
public class CambioMoneda
{ public static void main(String[] args) throws IOException
{ BufferedReader teclado = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Tabla de Montos");
System.out.println("===============");
System.out.print("Ingrese monto de dolares: ");
String dolares = teclado.readLine();
System.out.print("Ingrese monto de cets: ");
String cents = teclado.readLine();
int monedas = (100 * new Integer(dolares).intValue())
+ new Integer(cents).intValue();
System.out.println( "quarters = " + (monedas/25) );
monedas = monedas % 25;
System.out.println( "dimes = " + (monedas/10) );
monedas = monedas % 10;
System.out.println( "nickels = " + (monedas/5) );
monedas = monedas % 5;
System.out.println( "pennies = " + monedas );
}
}
119
49\n
Por otra parte un archive binario es una secuencia de unos y ceros, de manera que 49 es
expresado como, 11001, y no como la representacin '4' y '9').
Cuando obtenemos informacin de entrada desde un archivo, se dice que read desde el archivo;
para cuando depositamos una informacin de salida en un archivo, decimos write en l. Cuando
comenzamos a usar un archivo, decimos que se open , y cuando terminamos de usarlo, lo close.
Los archivos pueden ser read/written en dos sentidos:
sequential file pueden ser read (o written) desde front to back; es decir es un libro que
tiene una sola direccin de lectura, pudiendo regresar en una sola direccin,
(forwards).
random access file pueden ser reads (o writes) sobre cualquier lugar, es como si en un
libro pudiese abrirlo en cualquier pgina.
Sequential files son simples para manejar y trabajar aplicaciones estandares, mientras que los
Random access files son usados principalmente para aplicaciones de database donde se
especifican bits de informacin. En este segmento se vern solamente sequential files. Para
programas Java que usan sequential file, se debe establecer si el archio usado es usado para
120
La clase BufferedReader lee un flujo de entrada de caracteres y los guarda en un array llamado
buffer. Para crear una versin en buffer se debe tener un objeto Reader existente de algn
tipo. Para crear un BufferedReader se puede utilizar el siguiente constructor.
BufferedReader(Reader).
Un flujo de caracteres almacenado en bufer se puede leer utilizando los mtodos read() y
read(char[], int , int) descritos en FileReader. Puede leer una lnea de texto usando el mtodo
readLine(). El mtodo readLine() devuelve un objeto String que contiene la prxima lnea de
texto en el flujo, sin incluir el carcter o caracteres que representan el final de una lnea, que
puede ser(\n, lnea nueva), (\r, retorno de carro) o una combinacin de esta ltima con la
primera. Si se llega al final del flujo, el valor devuelto de la cadena es igual a null.
Ejemplo 4:
Escribimos una aplicacin que lee el contenido de un archivo secuencial cuyo nombre es dado
por el usuario desde el teclado y copia el archivo, f, line by line, en otro file, f.out.
import java.io.*;
/** CopiarFile copia el contenido de un file, f,
* cuyo nombre es sustituido por un file, f.out */
public class CopiarFile
{ public static void main(String[] args) throws IOException
{ String f = JOptionPane.showInputDialog("Input nombrefile: ");
// se construye el objeto view que reads desde el input file:
BufferedReader infile = new BufferedReader(new FileReader(f));
// se construye el objeto view que writes al output file:
PrintWriter outfile = new PrintWriter(new FileWriter(f + ".out"));
while ( infile.ready() ) // existen ms lineas que leer en infile?
{ String s = infile.readLine();
outfile.println(s);
}
infile.close();
outfile.close();
}
}
121
al ingresar su nombre, asumir que ese archivo existe y copiara su contenido en un archivo de
salida similar. Todo esto lo comprobar si se remite a ver el directorio en donde esta
trabajando. A continuacin se ve un mensaje clsico para cuando no existe el archivo en
cuestin.
122
String tokenizers y los file objects pueden ayudar a crear una aplicacin cuya entrada se basa
en un cierto formato, as como su salida. Un ejemplo estndar es el proceso de enlistar alguna
informacin, en donde en este ejemplo se trata de un archivo secuencial, donde cada lnea
contiene el nombre de un empleado, las horas trabajadas y el pago por ellas, ya sea en un
contexto de sobretiempo o alguna otra que no interesa. La informacin se ve as.
Fred Mercader|31|20.25
Lucy Riggs|42|24.50
Ethel Meza|18|18.00
!
Notar que la secuencia de lneas es terminada por un simbolo especial, !. Una aplicacin de
este tipo lee las lneas una por una, extrae el tokens de cada lnea, convirtiendo a nombre y
nmero y calculando el sueldo.
class LeerInfo
Metodos
getNextRecord():
boolean
nombreE(): String
horasE(): int
sueldoE(): double
close()
/** LeerInfo lee los records desde un sequential file. El records tiene el
formato, NOMBRE|HORA|PAGO. El file termina con un ! */
import java.io.*;
import java.util.*;
public class LeerInfo{
private BufferedReader infile; // la direccin del input file
private String END_OF_FILE = "!";
Ingeniera en Computacin, Universidad de La Seren
123
124
Para testear la clase LeerInfo, implementemos una clase principal llamada Pagos.java para
testearla.
/** Pagos lee un archivo bajo un cierto formato. */
import javax.swing.*;
public class Pagos{
public static void main(String[] args) {
String in_nombre = JOptionPane.showInputDialog("Nombre archivo
entrada:");
String out_nombre = JOptionPane.showInputDialog("Nombre archivo salida:");
if ( in_nombre != null && out_nombre != null ) {
procesandoArchivo(in_nombre, out_nombre);
}
System.out.println("Terminado");
}
private static void procesandoArchivo(String in, String out) {
LeerInfo leer = new LeerInfo(in);
while ( leer.getNextRecord() ) {//algo se hace con ellos?
double pago = leer.horasE() * leer.sueldoE();
}
leer.close();
}
}
125
BufferedReader(archivo);
boolean eof = false;
while (!eof) {
//mtodo readLine()dentro de un loop para leer el archivo
//de texto lnea por lnea. El loop termina para cuando
//el mtodo devuelve el valor null.
String linea = buff.readLine();
if (linea == null)
eof = true;
else
System.out.println(linea);
}
buff.close();
} catch (IOException e) {
System.out.println("Error -- " + e.toString());
}
}
}
Aqu tenemos otra versin de Promedio1, la diferencia radica en que el programa no usa la
clase ConsoleReader. El programa parte creando un BufferedReader para leer la entrada del
usuario. Las diferencias son mostrada en bold. Como Ud. ver la primera lnea ser
afectada
Ejemplo 5
import java.io.*;
public class Promedio2
{
126
/* promedio. */
if (cuanTos > 0)
System.out.println
("El promedio es = " + sum/cuanTos);
else
System.out.println("Sin valor.");
}
}
Note que en el encabezado del programa as como en ejemplo que haca referencia a la
formacin de cuadrados se tiene,
public static void main(String[] args) throws IOException
Este llama al compilador que el mtodo main contiene, llamado readLine, que puede arrojar
la IOException, la cual no ser atrapada pues main no tiene la declaracin try-catch para
atraparla. En IOException se cubre un rango de diferentes errores o condiciones que pueden
ocurrir en la entrada. Un excepcin de chequeo( checked exception) . Esto significa que
debemos ya sea escribir una declaracin que la atrape, o debemos agregar una clausula
throws
throws IOException
al encabezado del mtodo. Una clausula throws lista una o ms exepciones, separadas por
comas.
CAY HORSTMANNS ConsoleReader CLASS
import
import
import
import
java.io.BufferedReader;
java.io.InputStream;
java.io.InputStreamReader;
java.io.IOException;
/**
A class to read strings and numbers
from an input stream.
This class is suitable for
beginning Java programmers.
It constructs the necessary buffered
reader, handles I/O exceptions, and
converts strings to numbers.
*/
public class ConsoleReader
{
127
*/
public ConsoleReader(InputStream inStream)
{ reader =
new BufferedReader
(new InputStreamReader(inStream));
}
/** Read a line of input and
convert it into an integer.
*/
public int readInt()
{ String inputString = readLine();
int n = Integer.parseInt(inputString);
return n;
}
/** Reads a line of input and convert it
into a floating-point number.
*/
public double readDouble()
{ String inputString = readLine();
double x =
Double.parseDouble(inputString);
return x;
}
/** Read a line of input.
In the (unlikely) event of
an IOException, the program halts.
*/
public String readLine()
{ String inputLine = "";
try
{ inputLine = reader.readLine();
}
catch(IOException e)
{ System.out.println(e);
System.exit(1);
}
return inputLine;
}
}
Ud. podr utilizar esta clase en el futuro o tal vez adaptarla para sus propsitos. Recuerde que
esta versin como un ejemplo del tema que se esta tratando captura cualquier IOExceptions
que ocurra, y detiene el programa. Si Ud. no quiere esto tendr que eliminar la declaracin
try-catch.
128
FileReader
BufferedReader
Una vez que BufferedReader ha sido construdo, podemos coleccionar las lineas de entrada
desde el archivo usando el mtodo readLine justamente como cuando los datos vinieran del
teclado. Una diferencia es que se necesita chequear cuando todas las lneas del archivo han
sido ledas. El mtodo readLine returns null cuando el fin de archivo ha sido alcanzado.
Tambin, cuando se lee desde un archivo, se le recomienda que siempre cierre la conexin al
archivo como si Ud. hubiese terminado con l. FileReaders y BufferedReaders tienen
ambos un mtodo llamado close para hacerlo lanzando un IOException.
Tenemos una versin final del programa promedio, el cual lee datos desde un archivo llamado
hola.dat. Justamente un BufferedReader es construdo, conectando al archivo. No existe
ningn Reader conectado al teclado.
Ejemplo 6
import java.io.*;
public class Promedio4
{ /* Lee nmeros punto flotante desde un archivo
hola.dat, y entrega su promedio.
*/
public static void main(String[] args)
{ BufferedReader datos;
Ingeniera en Computacin, Universidad de La Seren
129
try
{ datos = new BufferedReader
(new FileReader("hola.dat"));
}
catch (FileNotFoundException e)
{ System.out.println
("Archivo hola.dat no fue encontrado.");
return;
}
/* Lee y suma los valores, contando cuantos son. */
double sum = 0;
int cuanTos = 0;
try
{ while (true)
{ String linea = datos.readLine();
if (linea == null) break;
try
{ double siguiente =
Double.parseDouble(linea);
sum = sum + siguiente;
cuanTos++;
}
catch (NumberFormatException e)
{ System.out.println
("Datos malos: " + linea);
}
}
datos.close();
}
catch (IOException e)
{ System.out.println(e);
return;
}
/* promedio. */
if (cuanTos > 0)
System.out.println
("El promedio es = " + sum/cuanTos);
else
System.out.println("Ningn resultado.");
}
}
Notas
130
Si cualquier lnea de datos contiene algn error, el programa imprimir la lnea para
ayudar al usuario a entender que es lo malo en el archivo.
Si desea escribir a un archivo de texto, es mejor usar un objeto PrintWriter. Este objeto tiene
mtodos convenientes, tales como println y print, justamenta para System.out. Un
PrintWriter no puede ser conectado directamente al archivo, pero puede ser conectado al
objeto FileWriter, el cual acepta caracteres unicode y los escribe al archivo de texto. Aqu
se da una declaracin que crea un PrintWriter para escribir un archivo de texto hola.txt.
PrintWriter salir =
new PrintWriter
(new FileWriter(hola.txt))
FileWriter
PrintWriter
Ingeniera en Computacin, Universidad de La Seren
131
Una vez realizado esto podemos usar los mtodos out.print y out.println para enviar los
datos al archivo hola.txt. Despus que toda la salida ha sido escrita al archivo llame a
out.flush(), para asegurarse que ningn carcter este perdido en la cola para cuando la
coneccin se cierre. Finalmente, llamar a out.close() para cerrar la conexin.
Archivos y Filtros.
En varios de los ejemplos que se han visto se ha utilizado una cadena para referirse al archivo
incluido en la operacin de un flujo. Esto es suficiente si queremos trabajar con archivos y
flujos pero el problema surge para cuando queramos trabajar con copiar archivos, cambiar
nombre u otras tareas. Para solucionar este problema se debe trabajar con un objeto File.
File es tambin parte del paquete java.io, y representa una referencia de archivos o carpeta.
Los constructores que puede utilizar son:
File(String), File(String, String), File(File, String). Junto con ellos existe una
cantidad de mtodos tales como exists(), length(), renameTo(File), delete() o
deleteOnExit(), mkdir(), etc..
Hemos visto que al realizar el comando
>java miProg
el Java interprete obtendr la clase compilada miProg.class y se dirige a unos de los mtodos
main , el cual obedecera. En vez de este simple comando podemos tipear el comando java
seguido con algunos argumentos de caracteres llamados command line arguments. Por
ejemplo,
java miProg data.txt hola.dat
y suponemos que el interprete Java es dado la lnea de comando con 2 argumentos , como
antes se mencionaba, entonces un parametro variable llamado args sera creado que contenga
Ingeniera en Computacin, Universidad de La Seren
132
una referencia a los 2 elementos del array que anteriormente hacan referencia al strings
data.txt y hola.dat.
data.txt
args
hola.dat
Con los argumentos strings presentados en esta forma, el mtodo main puede procesarlo en el
sentido que el programador decida. Por ejemplo, puede usar la expresin
args.length
para denotar el nmero de argumentos. Y los argummentos individuales pueden ser referidos
como args[0], args[1], etc.
Un ejemplo de esta idea esta dado por la siguiente aplicacin que convierte en mayscula todo
el texto de un archivo. El archivo es ledo mediante un flujo de entradab almacenado en
buffer, y se lee un carcter a la vez. Una vez convertido en mayscula, el carcter se enva a
un archivo temporal por medio de un flujo de entrada almacenado en buffer. Los objetos File
se usan en vez de las cadenas para indicar los archivos involucrados, lo cual hace posible
cambiarles el nombre y borrarlos segn se necesite.
Ejemplo 7
import java.io.*;
public class todoMayusDemo {
public static void main(String[] arguments) {
todoMayus may = new todoMayus(arguments[0]);
may.convert();
}
}
class todoMayus {
String nombreFuente;
todoMayus(String nombreArg) {
nombreFuente = nombreArg;
}
void convert() {
try {
// Crea los objetos archivos(File)
File nombre = new File(nombreFuente);
File temp = new File( nombreFuente + ".tmp");
// Crea una entrada stream
FileReader fr = new
FileReader(nombre);
BufferedReader in = new
BufferedReader(fr);
Ingeniera en Computacin, Universidad de La Seren
133
134
CAPTULO 6
Programacin Orientada a Objetos en Java
Hasta el momento hemos discutido una serie de conceptos de la programacin orientada a
objetos en Java, sin preocuparnos mayormente sobre el detalle de ciertas declaraciones, como
por ejemplo, Porqu main() en los programas antes escrito deben ser public y static?. La
idea para entender la filosofa que est detrs de Java pasa por analizar y entender algunos
conceptos de la POO. Por otra parte, en esta oportunidad pretendo que aprendan aplicar en
java la POO, as como los fundamentos de la POO, y como ellos se visualizan en Java, como
por ejemplo los conceptos de: clase, objeto, mtodo, instancia, herencia, polimorfismo,
constructor, interface, sobrecarga, etc. En resumen este segmento trata de introducirlo en los
fundamentos que le harn tomar confianza con la POO.
Un pequeo adelanto respecto de los conceptos de la POO es que la POO encapsula datos
(atributos) y mtodos en un objeto. Los objetos tienen la propiedad de ocultar la informacin.
Ahora si Ud. ha programado en C, ver que es orientado a la accin, Java en cambio es
orientada a objetos, esto significa que en C la unidad de programacin son las funciones (en
Java este tipo de estructuras se llaman mtodos). No obstante, las funciones no desaparecen
en Java, sino que ellas son encapsuladas como mtodos con datos que se procesan al interior
de la clase. La Fig.1, nos muestra cmo se ve en general un segmento de programa en Java.
Declaracin de clase
public abstract final class Nombre_Clase
extends Nombre_Clase
implements lista_Interface {
Atributo
type Nombre Atributo;
Constructor
public Nombre_Clase ( )
{//...}
Mtodo
public hola (...)
{//...}
Fig. 1
Ingeniera en Computacin, Universidad de La Seren
135
Trminos tcnicos
en POO
-Agente
-Progr. Visual
-dynamic binding
Caractersticas
-Polimorfismo
-Abstraccin
-Encapsulacin
-Persistencia
Mecanismos Bsicos
-Objeto
-Mensaje y MtodosClase y ModeloHerencia
Fig. 2
La Fig. 2 muestra los pilares bsicos de la orientacin a objeto. Los programadores en Java se
concentran en crear sus propias Clases, que son tipos definidos de programas o bien utilizar
algunas para sus propios fines. As por ejemplo, ya hemos usado la clase ConsoleReader en
los ejemplos de las otras lecciones. Cada clase contiene datos, como tambin un conjunto de
mtodos que manipulan los datos.
Observacin: El modelamiento de grandes sistemas es exitoso en la medida que se haga
asesorar por una herramienta de modelamiento. UML (Unified Modeling Language) es un
lenguaje de programacin grfico til para la descripcin de diferentes aspectos en la
modelacin de un sistema orientado a objetos, en donde se pueden representar clases, objetos
y su relacin.
Clases y Objetos
Una class (clase) es una estructura de programacin en la que se pueden agrupar los datos de
un objeto junto con los mtodos que operan sobre ellos. En Ejemplo1, se declara una clase de
nombre Empleado como Tipo, la que no posee mtodos (por ahora). Formalmente una clase
puede considerarse como una especificacin 4-upla, por tener 4 componentes, en forma de
variables con tipo y nombre. El modelo UML asociado a la clase, se muestra a continuacin.
En donde se han definido 4 atributos, dos de ellos pueden contener una cadena de caracteres
(recordar que una cadena de caracteres es un objeto de la clase String), el otro es de tipo entero
y finalmente un atributo de tipo boolean , el que puede ser verdadero o falso.
Ejemplo 1
class Empleado {
String apellido;
String nombre;
int rut;
boolean esFemenino;
}
136
Empleado
Apellido: String
Nombre: String
Rut:
int
EsFemenino: boolean
objetoEmpleado: Empleado
Apellido: Rojas
Nombre: Lautaro
Rut:
73881706
EsFemenino: false
137
Constructores
Al crear la instancia de un objeto, el programa habitualmente asigna valores iniciales a sus
elementos de datos. Para simplificar la inicializacin de los elementos del objeto, Java soporta
una funcin o mtodo especial llamado constructor, que se ejecuta de forma automtica al
crear la instancia. La funcin contructora es un mtodo pblico que tiene el mismo nombre de
la clase.
Es necesario tener en cuenta que:
Un constructor tiene el mismo nombre que la clase,
Un constructor siempre se llama con la palabra clave new,
Los constructores pueden tener ceros o ms parmetros,
Los constructores no devuelven ningn tipo en forma explcita. Por eso que la llamada a
constructores, como tambin los mtodos con tipo de resultado void entregan el resultado
en la forma " return;.Veamos el siguiente ejemplo.
Ejemplo 3
class Empleado {
String apellido;
String nombre;
int rut;
boolean esFemenino;
// Declaracin de un Constructor:
Empleado(String nn, String vn, int pn, boolean w) {
apellido = nn;
nombre = vn;
rut = pn;
esFemenino = w;
}
}
class EjemploConstructor {
public static void main(String args[]){
Empleado m,n;
// Llamada al Constructor:
m = new Empleado("Meyer", "Hans", 11073, false);
n = new Empleado("Rojo", "Maria", 865, true);
// leer las Instancia-variable:
System.out.println("Apellido: " + m.apellido);
System.out.println("Nombre: " + m.nombre);
System.out.println("Numero Personal: " + m.rut);
System.out.println("Hablamos de:" +(m.esFemenino ? "Sra.": "Sr."));
}
}
138
Variables en la clase
En contrario a la instancia-variable existe tambin para una clase y para todo objeto de una
clase un ejemplar, llamada variable de la clase, an cuando la clase no tenga ninguna
instancia. Esta variable es esttica, y un ejemplo tpico es un contador.
Ejemplo 4
class Empleado {
String apellido;
String nombre;
int rut;
boolean esFemenino;
// una variable de la clase,inicializada por 0.
static int contador = 0;
Empleado(String nn, String vn, int pn, boolean w) {
apellido = nn;nombre = vn;rut = pn;esFemenino = w;
contador++;
}
}
class EjemploContador {
public static void main(String args[]){
System.out.println("Contador: " + Empleado.contador);
Empleado m1 = new Empleado("Montes","Hugo",11073,false);
System.out.println("Contador: " + Empleado.contador);
Empleado m2 = new Empleado("Rojo", "Maria", 865, true);
System.out.println("Contador: " + Empleado.contador);
}
}
139
class EjemploClasecomoTipo {
public static void main(String args[]){
Empleado m, jefe; // una clase como tipo variable local
jefe = new Empleado("Rojo", "Martin", 341, false, null);
m = new Empleado("Meyer", "Hans", 11073, false, jefe);
}
}
Mtodos Instanciados
Al interior de una clase cada declaracin sin la palabra static describe un mtodo instanciado.
Ejemplo 7
class Empleado {
String apellido;
String nombre;
int rut;
boolean esFemenino;
// Constructor:
Empleado(String nn, String vn, int pn, boolean w){
apellido = nn;
nombre = vn;
rut = pn;
esFemenino = w;
}
// un mtodo Instanciado:
void salida(){
System.out.print(esFemenino ? "Sra. " : "Sr. ");
Ingeniera en Computacin, Universidad de La Seren
140
b)
class Empleado {
String apellido;
String nombre;
int rut;
boolean esFemenino;
//Constructor:
Empleado(String apellido, String nombre, int pn, boolean w){
this.apellido = apellido; // "this" es imprescindible
this.nombre = nombre; // "this" es imprescindible
int rut;
boolean esFemenino;
this.rut = pn; // "this" es imprescindible
this.esFemenino = w; // "this" es imprescindible
}
}
141
Listas
En teora las listas pueden en contrario a los array aceptar muchos elementos y se pueden
realizar operaciones que son ms elegantes y eficientes que los arrays. Aqu se muestra un
ejemplo de lista enlazada.
Ingeniera en Computacin, Universidad de La Seren
142
Ejemplo 9
class Empleado {
String apellido;
String nombre;
int rut;
boolean esFemenino;
Empleado(String nn, String vn, int pn, boolean w){
apellido= nn;
nombre = vn;
rut = pn;
esFemenino = w;
}
}
class ListaEmpleados {
Empleado elemento;
ListaEmpleado continua;
// Constructor para Listas con un elemento:
ListaEmpleado(Empleado m){
elemento = m;
continua = null;
}
// Constructor para Lista con ms de un elemento:
ListaElemento(Empleado m, ListaEmpleado l){
elemento = m;
continua = l;
}
}
class EjemploLista {
public static void main(String args[]){
Empleado m1 = new Empleado("Soto", "Martin", 341, false);
Empleado m2 = new Empleado("Barrios", Petra", 865, true);
Empleado m3 = new Empleado("Meyer", "Hans", 11073, false);
// Construccin de una lista con estos 3 Empleados:
ListaEmpleado l = new ListaEmpleado(m1,
new ListaEmpleado(m2, new ListaEmpleado(m3)));
}
}
Arboles
En teora los rboles no son nada ms que grafos sin ciclos, cuyos elementos relevantes son
los vrtices(nodos) y los lados(edges). Aqu se muestra un ejemplo de rbol de
jerarquerizacin. Este es un caso particular para la implementacin de cualquier tipo de
rboles, en particular arboles binarios.
Ejemplo 10
class Persona {
String apellido, nombre;
Persona padre, madre;
Persona(String apellido, String nombre, Persona padre, Persona madre){
this.apellido = apellido;
this.nombre = nombre;
this.padre = padre;
this.madre = madre;
Ingeniera en Computacin, Universidad de La Seren
143
}
void salida(int e){
for(int s = e ; s > 0 ; s--) System.out.print(' ');
System.out.println(vorname + " " + nachname);
if( padre != null) padre.salida(e+4);
if(madre != null) madre.salida(e+4);
}
}
class Arbolito {
public static void main(String args[]){
Persona p =
new Persona("Martin", "Schmidt",
new Persona("Hans", "Schmidt", // padre
new Persona("Ulrich", "Schmidt", null, null), // padre del padre
new Person("Susanne","Schmidt", null, null)), // Madre del padre.
new Person("Petra","Schmidt", // Madre
new Person("Josef", "Mayer" , null, null ), // Padre de la madre.
new Person("Claudia","Mayer" , null, null))); // Madre de la madre.
p.salida(0);
}
}
Arboles AVL
Mtodos de Consulta
Al igual que como se hizo para los rboles de bsqueda binaria podemos realizar consultas en
un rbol AVL. A saber, Insertar y Eliminar, y otros mtodos que no resultan tan directos como
en los rboles de bsqueda binaria, por el problema de balanceo que se genera.
Ejemplos:
Dado el siguiente rbol T de bsqueda binaria
8
10
1) En este rbol, son insertados los nodos con claves 9 y 11. Generndose el rbol T1 :
8
10
11
144
2) Basado en T, son insertados los nodos con claves 1, 3, 5 y 7. Generndose el rbol T2:
8
-1
-2
10
Ya al insertar la clave 1 el rbol pierde la propiedad de AVL.. De aqu el aplicar una doble
rotacin.
4
10
10
145
conversin de uno de ellos al otro se conoce como Rotacin simple, que significa en lo
substancial cambiar la estructura del rbol. Las figuras muestran tambin las variantes
simetricas.
k2
k1
k1
k2
Z
k1
k2
k2
k1
Z
Rotaciones Simples
Representacin en Java
Un rbol AVL se representa de la misma manera que un rbol binario de bsqueda, esto es con
nodos que contienen punteros a su padre y a sus hijos izquierdo y derecho, sin embargo, un
nodo ahora debe almacenar un campo adicional que indica la altura o balance del nodo.
// Descripcin de un nodo para un rbol AVL
class Nodo_Avl
{ // Instancias
protected Nodo_Avl izq;
// hijo Izquierdo
protected Nodo_Avl der;
// hijo derecho
protected int altura;
// altura
public Comparable datos;
// elementos
// Constructores
public Nodo_Avl(Comparable datElem)
{
this(datElem, null, null );
}
public Nodo_Avl( Comparable datElem, Nodo_Avl ib, Nodo_Avl db )
Ingeniera en Computacin, Universidad de La Seren
146
{
datos = datElem;
izq = ib;
der = db;
balance = 0;
}
}
/*
Este mtodo puede ser llamado solamente si k2 tiene un hijo
izquierdo,
realizando una rotacin entre el nodo k2, tal como lo muestra la figura 7.
Adems, actualiza la altura, asignando la nueva raz a k2.
*/
private static Nodo_Avl RotacionSimpleIzq(Nodo_Avl k2)
{
Nodo_Avl k1 = k2.izq;
k2.izq = k1.der;
k1.der = k2;
k2.altura = max( altura( k2.izq ), altura( k2.der ) ) + 1;
k1.altura = max( altura( k1.izq ), k2.altura ) + 1;
return k1;
}
k2
k1
k1
k3
D
k2
B
A
A
B
C
D
C
Rotacin Izq-Der, Rotacin Doble.
147
K3
k2
K1
A
k3
k1
k2
D
B
A
C
D
/*
Rotacin Doble, basada en Fig. 8: Este mtodo solo puede ser usadosi k3 tiene
hijo izquierdo y los hijos de k3 tienen hijo derecho. Esta rotacin se conoce
como rotacin izq-der. Actualiza la altura, y su raz.
*/
private static Nodo_Avl DobleRotacionIzq_Der(Nodo_Avl k3) {
/* Rotacin entre k1 y k2*/
k3.izq = RotationSimpleIzq( k3.izq);
return RotationSimpleDer( k3 ); }
148
Ejemplo:
Ud. podr verificar que cualquier desbalanceo causado por una insercin en un rbol AVL
puede ser realizada por una Rotacin Doble o Simple, (Ver (1)). Ahora, respecto a la
eficiencia de esta TDA mencionemos que almacenar la informacin de la altura, que en este
caso son suficientes con +1, 0 y 1, es de gran utilidad
Ingeniera en Computacin, Universidad de La Seren
149
Entonces recordemos que para Insertar un nodo con la clave x en un rbol AVL, el valor x
se inserta recursivamente en el subarbol correspondiente, tal como en los rboles de bsqueda
binario. En el caso que la altura del subrbol no cambie, la insercin concluye. En caso
contrario es necesario utilizar segn sea el caso, Rotacin Simple o Rotacin Doble.
Implementacin de la Insercin en los rboles AVL
Archivo Nodo_Avl.java
// Declaracion de la clase Nodos para los elementos en los arboles AVL.
class Nodo_Avl
{
// Instancias
protected Nodo_Avl izq;
protected Nodo_Avl der;
protected int altura;
public Comparable datos;
//
//
//
//
hijo izquierdo
hijo derecho
altura
los datos como elementos del arbol avl
// Constructores
public Nodo_Avl(Comparable datElem)
{
this(datElem, null, null );
}
public Nodo_Avl( Comparable datElem, Nodo_Avl ib, Nodo_Avl db )
{
datos = datElem;
izq = ib;
der = db;
altura = 0;
}
}
Archivo Arbol_Avl.java
//
//
//
//
//
//
//
//
//
//
//
//
//
/*
Ingeniera en Computacin, Universidad de La Seren
150
arbol
/*
* Eliminar el arbol.
*/
//no esta implementado....
/*
* Test, si el arbol esta vacio o no.
* devuelve true, caso de vacio; sino false.
*/
public boolean esVacio( )
{
return raiz == null;
}
/*
* Entregar el contenido del rbol en una sucesion ordenada.
*/
public void printArbol( )
{
if( esVacio( ) )
System.out.println( "Arbol vacio" );
else
printArbol( raiz );
}
/*
* Salida de los elementos del arbol binario rotados en 90 grados
*/
Ingeniera en Computacin, Universidad de La Seren
151
152
return b;
}
/*
* Analogamente al anterior pero el ms grande.
*/
private Nodo_Avl hallarMax(Nodo_Avl b )
{
if (b == null)
return b;
while (b.der != null)
b = b.der;
return b;
}
/*
* Metodo interno para determinar un dato.
* x es el dato buscado
* b es la raiz
* Devuelve: Nodo con el correspondiente dato.
*/
private Nodo_Avl hallar(Comparable x, Nodo_Avl b)
{
while( b != null )
if (x.compareTo( b.datos) < 0 )
b = b.izq;
else if( x.compareTo( b.datos ) > 0 )
b = b.der;
else
return b;
// paso
return null;
// no paso nada
}
/*
* Metodo Interno para devolver los datos de un subarbol en una sucesion
ordenada.
* b es la raiz.
*/
private void printArbol(Nodo_Avl b)
{
if( b != null )
{
printArbol( b.izq );
System.out.println( b.datos );
printArbol( b.der );
}
}
/*
* salida del arbol binario rotado en 90 Grados
*/
private void salidaArbolBinario(Nodo_Avl b, int nivel)
{
if (b != null)
{
salidaArbolBinario(b.izq, nivel + 1);
for (int i = 0; i < nivel; i++)
{
System.out.print(' ');
}
System.out.println(b.datos);
salidaArbolBinario(b.der, nivel + 1);
Ingeniera en Computacin, Universidad de La Seren
153
}
}
/*
* Salida: altura de los nodos, o -1, en el caso null.
*/
private static int altura(Nodo_Avl b)
{
return b == null ? -1 : b.altura;
}
/*
* Salida: Maximum entre lhs y rhs.
*/
private static int max( int lhs, int rhs )
{
return lhs > rhs ? lhs : rhs;
}
/*
* Rotacion Simple Izquierda(simetrica a Rotacion Simple Derecha).
* Para los arboles AVL, esta es una de las simples rotaciones.
* Actualiza la altura, devuelve la nueva raiz.
*/
private static Nodo_Avl RotacionSimpleIzq(Nodo_Avl k2)
{
Nodo_Avl k1 = k2.izq;
k2.izq = k1.der;
k1.der = k2;
k2.altura = max( altura( k2.izq ), altura( k2.der ) ) + 1;
k1.altura = max( altura( k1.izq ), k2.altura ) + 1;
return k1;
}
/*
* Rotacin Simple Derecha.
*/
private static Nodo_Avl RotacionSimpleDer(Nodo_Avl k1)
{
Nodo_Avl k2 = k1.der;
k1.der = k2.izq;
k2.izq = k1;
k1.altura = max( altura( k1.izq ), altura( k1.der ) ) + 1;
k2.altura = max( altura( k2.der ), k1.altura ) + 1;
return k2;
}
/*
* Rotacion doble: primero hijo izquierdo con su hijo derecho
* entonces nodo k3 con el nuevo hijo izquierdo.
* para los arboles AVL, esta es una doble rotacin
* actualiza alturas, entrega nueva raiz.
*/
private static Nodo_Avl RotacionDobleIzq_Der(Nodo_Avl k3)
{
k3.izq = RotacionSimpleDer( k3.izq );
return RotacionSimpleIzq( k3 );
}
/*
* rotacion doble: primero hijo derecho
* con su hijo izquierdo; luego nodo k1 con nuevo hijo derecho.
* Para los AVL, esta es una doble rotacin.
* actualiza alturas, entrega nueva raiz.
*/
private static Nodo_Avl RotacionDobleDer_Izq(Nodo_Avl k1)
{
k1.der = RotacionSimpleIzq(k1.der);
Ingeniera en Computacin, Universidad de La Seren
154
return RotacionSimpleDer(k1);
}
}
archivo Arbol_AvlTest.java
public class Arbol_AvlTest
{
// Programa Test
public static void main(String [] args)
{
Arbol_Avl b1 = new Arbol_Avl();
Arbol_Avl b2 = new Arbol_Avl();
for (int i = 0; i < 7; i++) //
{
Integer r = new Integer(i);
b1.insertar(r);
}
System.out.println("Arbol girado en 90 grados");
b1.salidaArbolBinario();
for (int i = 0; i < 10; i++)
{
// Genera un nmero entre 0 y 100
Integer r = new Integer((int)(Math.random()*100));
b2.insertar(r);
}
System.out.println("Arbol girado en 90 grados");
b2.salidaArbolBinario();
System.out.println("Travesia en Inorden(Izq-Raiz-Der)");
b2.printArbol();
}
}
Salida que se genera:
Arbol girado en 90 grados
0
1
2
3
4
5
6
Arbol girado en 90 grados
4
14
35
39
52
64
74
75
77
Travesia en Inorden(Izq-Raiz-Der)
4
14
35
39
Ingeniera en Computacin, Universidad de La Seren
155
52
64
74
75
77
Interpretacin de la salida
Arbol girado en 90 grados
0
1
2
3
4
5
6
La implementacin de los rboles AVL, as como su salida estn basados en los ejemplos y
materiales entregados en (3).
3
c insertado
AVL con balanceo:
c(0)
b(0)
a(0)
156
Jerarquia de Clases
Las clases que poseen la (o las) propiedad de la clase superior son descritas como subclases de
la superclase.
Ejemplo 11
class Alumno {
String apellido;
String nombre;
boolean esFemenino;
String carrera;
byte semestre;
// Constructor
Alumno (String apellido, String nombre, boolean,esFemenino,
String carrera, byte semestre) {
this.apellido = apellido;
this.nombre = nombre;
this.esFemenino = esFemenino;
this.carrera = carrera;
this.semestre = semestre;
}
}
Una clase puede a menudo ser especializada, de la misma manera que una superclase puede
ser generalizada. Un ejemplo, para la especializacin sera una clase Colaborador, la que
asume una nueva propiedad traducida en una variable tarifa, incorporandosela a la clase
Empleado.
Ejemplo 12
class Colaborador {
String apellido; // copia de la clase Empleado
String nombre; // copia de la clase Empleado
int rut; // copia de la clase Empleado
boolean esFemenino; // copia de la clase Empleado
String tarifa;// trato preferencial??
// Constructor
Colaborador (String apellido, String nombre, int rut, boolean
esFemenino,String tarifa) {
this.apellido = apellido;
this.nombre = nombre;
this.rut = rut;
this.esFemenino = esFemenino;
this.tarifa = tarifa;
}
Importante: La clase Persona es tambin una superclase de la clase Colaborador, pero ella
no es una superclase directa. En contrario, la clase Colaborador es una subclase ( o indirecta)
subclase de la clase Persona. En general, entre una super y una subclase pueden existir
muchas (sub- resp.super-)clases.
157
Herencia
En Java la herencia es descrita a travs de la palabra reservada extends, en general se tiene
class sub-clase extends super-clase{...}
Ingeniero
Gerente
Juan
Secretaria
Susana
158
Ejemplo 13
// Empleado como subclase de Persona
class Empleado extends Persona {
// componentes heredadas:directo de Persona:
apellido, nombre, esFemenino.
// nueva declaracin de componente objeto:
int rut;
// constructor
Empleado (String apellido, String nombre, int rut, boolean esFemenino) {
this.apellido = apellido;
this.nombre = nombre;
this.rut = rut;
this.esFemenino = esFemenino;
}
void salida() {
System.out.print(esFemenino ? "Sra. " : "Sr. ");
System.out.print(nombre + " " + apellido);
System.out.println(" (Rut: " + rut + ")");
}
}
// Alumno como subclase de Persona
class Alumno extends Persona {
// componente heredada:
// directamente de Persona: apellido, nombre, esFemenino
// nueva declaracin de componentes objeto:
String carrera;
byte semestre;
// Constructor
Alumno (String apellido, String nombre, boolean esFemenino, String carrera, byte
semestre) {
this.apellido = apellido;
this.nombre = nombre;
this.esFemenino = esFemenino;
this.carrera = carrera;
this.semestre = semestre;
}
}
//Colaborador como subclase de Empleado
class Colaborador extends Empleado {
// componentes heredadas:
// indirectamente de Persona: apellido, nombre, esFemenino
// directamente de Empleado: rut, salida()
// nueva componente Objeto:
String tarifa;
// constructor
Colaborador (String apellido, String nombre,int rut, boolean esFemenino, String
tarifa) {
this.apellido = apellido;
this.nombre = nombre;
this.rut = rut;
this.esFemenino = esFemenino;
this.tarifa = tarifa;
}
}
159
Empleado
Rut : int
Salida ()
alumno
carrera: String
Semestre: byte
Colaborador
Tarifa: String
160
Herencia y Constructores
class Alumno extends Persona {
String carrera;
byte semestre;
// constructor general:
Alumno(String apellido, String nombre, boolean esFemenino,String carrera, byte
semestre) {
// llamada a los constructores de "Persona" con "super":
super(apellido, nombre, esFemenino);
this.carrera = carrera;
this.semestre = semestre;
}
// Constructor para alumno de Computacin en I Sem:
Alumno (String apellido, String nombre, boolean esFemenino) {
// llamada del constructor de "Alumno" con "this":
this(apellido, nombre, esFemenino, "Computacion", 1);
}
}
Como ejemplo del uso de estas propiedades sera contar el nmero de todos los Empleados.
Para eso la clase Empleado debera verse as.
Ejemplo 14
class Empleado extends Persona{
static int numEmpleados = 0;
int rut;
// cambio del constructor
Empleado () {
numEmpleados++;
}
// constructor
Empleado (String apellido, String nombre, int rut, boolean esFemenino) {
super(apellido, nombre, esFemenino);
numEmpleados++;
this.rut = rut;
}
void salida() {
System.out.print(esFemenino ? "Sra " : "Sr ");
System.out.print(nombre + " " + apellido);
System.out.println(" (Rut: " + rut + ")");
}
}
161
Dynamic Binding
Dynamic Binding es una caracterstica comn de los lenguajes orientados a objeto y se refiere
al proceso de entrelazar un programa de forma que existan todas las conexiones apropiadas
entre sus componentes, en rigor es una consecuencia de la puesta en prctica o realizacin del
polimorfismo.
Polimorfismo
Polimorfismo es un trmino que se utiliza para describir una situacin en donde un nombre
puede referirse a diferentes mtodos. En Java existen dos tipos de polimorfismo: el que ocurre
en la sobrecarga y el que ocurre en el reemplazo.
El polimorfismo en la sobrecarga sucede cuando existen varios mtodos dentro de una clase,
todos ellos con el mismo nombre, lo cual est permitido siempre y cuando los mtodos tengan
diferente nmero o tipos de parmetros. Tener diferentes tipos de retorno no sirve al eliminar
la ambigedad de los mtodos y no ayuda si se necesitan dos mtodos con el mismo nombre y
los mismos parmetros pero diferentes tipos de retorno. Al crear mtodos de clase
polimrficos y escribir cdigo que acceda a ellos, Java determina cul de los mtodos debe
llamar durante la compilacin.
Por otra parte, al reemplazar mtodos, Java determina cul debe llamar al momento de ejecutar
el programa, no durante la compilacin. Para determinar qu mtodos debe llamar, Java debe
considerar no slo los que estn dentro de una clase, sino adems los que estn en las clases
madres. El reemplazo ocurre cuando un mtodo en una clase tiene el mismo nombre y firma
(nmero, tipo y orden de los parmetros) que un mtodo de una clase madre ( o superclase).
En caso de que los mtodos tengan el mismo nombre y firma, el mtodo de la clase derivada
siempre reemplaza al mtodo de la clase madre.
Ejemplo 15
class EjemploPoli {
public static void pago (Empleado empleado) {
System.out.println("Empleado" + empleado.apellido + " recibe Pago.");
}
public static void main (String[] args) {
Empleado empleado;
// Polimorfismo
empleado = new Colaborador("Meyer", "Hans", false, 1, "IIa");
// Polimorfismo en la entrega de parametros
pago(empleado);
}
}
162
Sobreescritura de mtodos
Ejemplo 16
class Colaborador extends Empleado {
String tarifa;
// sobreescritura de Metodo
void salida () {
System.out.print(esFemenino ? "Sra. " : "Sr ");
System.out.print(nombre + " " + apellido);
System.out.println(" Rut: " + rut);
System.out.println(" Tarifa: " + tarifa);
}
}
class EjemploSobreescritura {
public static void main (String[] args) {
Empleado m;
m = new Empleado("Meyer", "Hans", false, 1);
m.salida(); // llamada a salida() de la clase "Empleado"
m = new Colaborador("Soto", "Martin", false, 2, "IIa");
m.salida(); // llamada a salida() de la clase "Colaborador"
}
}
Las clases que contienen mtodos abstractos se conocen como clases abstractas.
Un programa no puede crear instancias de una clase abstracta de forma directa, es
necesario crear instancias de sus subclases.
163
Las clases abstractas pueden contener una mezcla de mtodos abstractos y no abstractos
(concretos). Los mtodos concretos contienen la instrumentacin del mtodo.
Cualquier subclase que extienda a la clase abstracta debe proporcionar la instrumentacin
de todos los mtodos abstractos. En caso contrario, la subclase misma se convierte en una
clase abstracta.
Un ejemplo de mtodo abstracto puede ser integrado en la clase Persona, con el nombre de
mtodo Ocupacin(), la que para esta clase no es todava realizada y por tal motivo se deja
declarada como abstracta.
Ejemplo 17
abstract class Persona {
String apellido;
String nombre;
boolean esFemenino;
Persona () {
}
// constructor
Persona (String apellido, String nombre, boolean esFemenino) {
this.apellido = apellido;
this.nombre = nombre;
this.esFemenino = esFemenino;
}
// mtodo Abstracto
abstract void Ocupacion();
}
Importante: Los mtodos abstractos al igual como otros mtodos son heredados.
class Empleado extends Persona {
int rut;
Empleado (String apellido, String nombre, int rut, boolean esFemenino) {
super(apellido, nombre, esFemenino);
this.rut = rut;
}
void salida() {
System.out.print(esFemenino ? "Sra " : "Sr ");
System.out.print(nombre + " " + apellido);
System.out.println(" (Rut: " + rut + ")");
}
// sobreeescritura del mtodo abstracto heredado
void Ocupacion() {
System.out.println("Trabajan");
}
}
class Alumno extends Persona {
String carrera;
byte semestre;
Student (String apellido, String nombre, boolean esFemenino, String carrera,
byte semestre) {
super(apellido, nombre, esFemenino);
this.carrera = carrera;
this.semestre = semestre;
Ingeniera en Computacin, Universidad de La Seren
164
}
// sobreescritura del mtodo abstracto heredado
void Ocupacion() {
System.out.println("Aprender");
}
}
Interfaces
En Java, una clase puede tener slo una superclase (clase madre). Como ya vimos, puede
crear nuevas clases derivndolas de clases existentes, heredando as las variables y mtodos de
la clase madre. sta es una tcnica poderosa que permite agregar funcionalidad de forma
creciente y al mismo tiempo mantener las clases tan sencillas como sea posible. Adems,
obliga a pensar bien el diseo de los programas y organizar su flujo.
Sin embargo, tal vez quiera derivar caractersticas de ms de una clase madre, lo cual puede
venir a raz del problema que desea resolver, como representar la solucin en trminos de
clases. Java no permite la herencia mltiple, es decir, la capacidad de derivar una nueva clase
a partir de ms de una clase existente. De cualquier modo, Java tiene una forma para declarar
tipos especiales de clase que permite un nmero ilimitado de derivaciones. Las diferencias
principales entre una interface y una clase son las siguientes:
Una interface, al igual que una clase abstracta, proporciona los nombres de los mtodos
pero no sus instrumentaciones.
Una clase puede instrumentar varias interfaces, ordenando de esta forma la restriccin de
herencia mltiple de Java.
Un programa no puede crear una instancia u objeto de una interface.
Todos los mtodos de una interface son implcitamente pblicos y abstractos.
Todas las variables de una interface son implcitamente pblicas, estticas y finales. No se
permite ningn otro tipo.
La clase que instrumenta a la interface debe instrumentar todos los mtodos, a menos que
sea declarada como abstracta.
Una interface no tiene una clase padre antecesora (Object). En su lugar, las interface
tienen una jerarqua independiente que puede ser aplicada a cualquier parte del rbol de
clases.
Ejemplo 18
public class Alumno extends Persona implements nombreEntidad{
private String matriculaNo;
public Alumno(String matriculaNo)
{
this.matriculaNo = matriculaNo;
} //constructor
public String getMatriculaNo()
{
return matriculaNo;
} //getMatriculaNo;
public boolean setMatriculaNo(String matriculaNo)
if (matriculaNo.compareTo("")==0)
Ingeniera en Computacin, Universidad de La Seren
165
{
this.matriculaNo = matriculaNo;
return true;
}
else
return false;
} //setMatriculaNo()
public String getNombre()
return nombre;
} //getNombre()
Numero:
"+this.getMatriculaNo()
);
} //toString()
public static void main(String[] args){
Alumno mario = new Alumno("0793022");
System.out.println( mario.getMatriculaNo() );
System.out.println("mario.toString()returns:
\n"+mario.toString() );
mario.setNombre("Mario Jorquera");
System.out.println("mario.toString()returns:
\n"+mario.toString() );
} //main()
} //end class Alumno
class Persona
{
String
nombre;
} //class Persona
interface nombreEntidad
{
String getNombre();
boolean setNombre(String newNombre);
} //interface nombreEntidad
166
Modelamiento UML
Persona
nombre: String
nombreEntidad
<<interface>>
getNombre( ) : String
setNombre(String newNombre): boolean
Alumno
matricN: String
getNombre: String
setNombre(String newNombre): boolean
getMatricN( ) : String
setMatricN(String newMN): boolean
Ahora si Ud. notan la clase Investigacion nos da una informacin extra sobre el curriculum
del Academico dentro de la organizacin o Colaboradores. Es as como es posible tener:
class Investigador extends Colaborador implements Academico {
byte titulo;
Investigador (String apellido, String nombre, int rut, boolean esFemenino,
int tarifa, byte titulo) {
super(apellido, nombre, rut, esFemenino, tarifa);
this.titulo = titulo;
}
void Ocupacion() {
System.out.println("Investigar");
}
// Implementar el mtodo abstracto
void titulo() {
switch(titulo) {
case MAGISTER:
167
Ingeniera en Computacin, Universidad de La Seren
case DOCTOR:
case PROFESOR:
System.out.println("Titulo o grado");
break;
case SIN_TITULO:
default:
System.out.println("Sin Titulo");
break;
}
}
}
Paquetes
Generalmente las clases e Interfaces en Java estn subordinadas a paquetes, de manera que
para utilizarlos significa darles en el encabezamiento del programa la ruta adecuada. Para
generar nuestros propios paquetes se deben declarar a travs de la declaracin
package NombrePaquete;
Con esto, se verifica que toda clase e interface contenida en el programa pertenece a
NombrePaquete.
// Declaracion de NombrePaquete
package AdministracindelPersonal
class Personal {
String apellido;
String nombre;
boolean esFemenino;
Personal () {
}
Personal (String apellido, String nombre, boolean esFemenino){
this.apellido = apellido;
this.nombre = nombre;
this.esFemenino = esFemenino;
}
}
Declaracin import
import NombrePaquete.Tiponombre;
import NombrePaquete.*;
La primera declaracin declara el paquete completo con todas sus clases e interfaces, de
manera que durante la ejecucin del programa el compilador deber examinar la clase o
paquete correspondiente y no todo su contenido, como se realiza en la segunda declaracin
// Declaracion de NombrePaquetes
package AdministracindelPersonal;
// Importando la clase java.lang.Object
// (Sin ms ni ms, siempre esta este paquete presente)
import java.lang.Object;
class Persona extends Object {
Ingeniera en Computacin, Universidad de La Seren
168
String apellido;
String nombre;
boolean esFemenino;
Persona () {
}
Persona(String apellido, String nombre, boolean esFemenino) {
this.apellido = apellido;
this.nombre = nombre;
this.esFemenino = esFemenino;
}
}
Java-Paquetes Estandar
Para Java existe un gran conjunto de paquetes estandares, en donde las clases e interfaces para
diferentes aplicaciones estn a disposicin.
169
orientada a objetos, la atencin se aleja de las funciones y se acerca a las cosas (objetos) que
componen el programa. Las diferencias bsicas entre la programacin orientada a objetos y el
enfoque de procesos pueden agruparse en cuatro principios bsicos: abstraccin, encapsulado,
herencia y polimorfismo.
La abstraccin es el proceso de ignorar temporalmente los detalles subyacentes al objeto, para
centrar la atencin en el problema u objeto y as extraer sus caractersticas esenciales. Por
ejemplo, si se consideran los neumticos de un auto, el neumtico abstracto puede tener una
marca, tamao precio y una cantidad ideal de aire. Estas caractersticas se aplican a todos los
neumticos. Al utilizar la abstraccin es posible centrar la atencin sobre estas caractersticas
cave (comunes), en lugar de hacerlo sobre los detalles de un tipo especfico de neumtico.
Encapsular es el proceso de agrupar la informacin abstrada del objeto con las operaciones
(mtodos) que un programa puede realizar sobre los datos. Por ejemplo, una clase es el
encapsulado de los datos y mtodos de un objeto.
La herencia es un marco en el cual se pueden crear clases nuevas al introducir nuevas
caractersticas o cambios a clases existentes. La herencia libera al programador de la tarea de
rescribir funciones cuando se deben hacer pequeos cambios.
Finalmente, el polimorfismo es la habilidad que tiene un objeto de tomar diferentes formas. El
prefijo poli significa muchas; morfismo formas. Por ejemplo, en un programa, un objeto
polimorfo que represente un telfono puede cambiar de forma para representar un telfono de
tonos, un telfono de pulsos o incluso un telfono celular.
Como puede notar algunos conceptos de la POO son anlogos a los mtodos de programacin
convencional, por ejemplo.
Un mtodo es como un procedimiento porque ambos contienen instrucciones
de
procesamiento. Las variables de clase y modelo se correlacionan a los datos de la
programacin tradicional. Los mtodos y datos son diferentes porque los procedimientos no
estn encapsulados normalmente con los datos que manipulan.
Una clase es como un tipo abstracto de datos, aunque para la POO, el proceso de escribir no se
revela fuera de la clase.
La herencia no tiene analoga inmediata en la programacin convencional.
El paso de mensajes reemplaza a las llamadas de funcin como mtodo principal de control
en los sistemas orientados a objeto. Con las llamadas de funciones, los valores se presentan y
el control regresa a la funcin que efecta la llamada. Por el contrario, los objetos entran en
accin gracias a los mensajes, y el control est distribuido.
En resumen, la orientacin a objetos se define por medio de un conjunto de mecanismos:
objetos, clases y modelos, mtodos y mensajes, y herencia. Estos mecanismos dan origen a
conceptos clave inherentes a los sistemas orientados a objetos: encapsulacin, abstraccin y
polimorfismo. Los mecanismos y conceptos de la orientacin a objetos llevan esencialmente a
Ingeniera en Computacin, Universidad de La Seren
170
los programadores a escribir cdigo en un nivel superior de abstraccin. Asimilar las ideas
orientadas a objetos significa aprender las diferencias as como las similitudes entre este
mtodo y la programacin convencional.
Un ejemplo practico.
Metas:
a) Recrear los conceptos de la POO, vistos hasta ahora.
b) Ganar habilidades en la creacin y uso de una jerarqua de clases.
una variable peso para el "peso" de la pregunta, adems de mtodos public getPeso() y
setPeso() para esta variable.
una variable text para el texto de la pregunta, adems de un mtodo public getText()
para esta variable. El texto de la pregunta deber ser "seteado" por constructores y
nunca cambiado, de manera que Ud. no necesita un mtodo set para ello.
un mtodo abstract buscar(), que pedir la pregunta, lee la respuesta del usuario y
return un resultado boolean indicando si el usuario la respondi correctamente.
Tambin deber imprimir un mensaje al usuario, llamando la atencin de que el
resultado a la pregunta fue correcto o no. Estudie la forma de definir las variables, es
decir protected, private, u otra.
171
/**
* Una clase que representa una pregunta de un examen.
*
*/
public abstract class Pregunta {
/**
* El n de puntos para las preguntas. Default es un punto.
* es private en vez de protected , as la subclase son forzadas a usar
* el metodo getPeso, y as prevenir pesos ilegales.
*/
private int peso = 1;
/**
* texto de la pregunta. Todas las preguntas tienen un texto; la diferencia
* esta en el tipo de respuesta y el mtodo de chequear la respuesta.
*/
protected String text;
/**
* Obtener el texto de esta pregunta.
*
* @return el texto de esta pregunta
*/
public String getText() {
return text;
} // end getText
/**
* obtener el peso de esta pregunta
*
* @return el peso
*/
public int getPeso() {
return peso;
} // end getPeso
/**
* setear el peso de esta pregunta
*
* @param wt el nuevo peso para esta pregunta. Debe ser mayor que cero, o el
metodo imprime un
* un mensaje de error y se sale el programa.
*/
public void setPeso(int wt) {
if (wt <= 0) {
System.out.println("Error: peso ilegal" + wt);
System.exit(1);
}
else {
peso = wt;
} // end if
} // end setPeso
/**
* Busca el usuario la pregunta y chequea para ver si la respuesta dada es
correcta
* El metodo depende del tipo de pregunta, por eso es un metodo abstract.
*
* @return true si el usuario responde correctamente
*/
public abstract boolean buscar();
Ingeniera en Computacin, Universidad de La Seren
172
un mtodo concreto buscar(). La respuesta "legal" es "t" o "T" para true, y "f" o "F"
para false. Si el usuario responde cualquier otro string que no sea lo antes dicho,
deber intentarlo otra vez, hasta cuando Ud. le diga Stop, y lo mande a estudiar, o bien
comience con un nuevo Examen. Para tal efecto podr importar otras clases para la
lectura de los datos, como lo visto con Console, con hsa o con SavitchIn
/**
* Constructor: crea una pregunta true/false dado un textopara la pregunta,
* la respuesta coorrecta, y el peso (n de puntos).
*
* @param pregunta el texto para la pregunta
* @param respuesta la respuesta correcta
* @param wt el peso
*/
public TFpregunta(String pregunta, boolean respuesta, int wt) {
text = pregunta;
correctResp = respuesta;
setPeso(wt);
} // end constructor
/**
* Busca el usuario la pregunta y chequea para ver si la respuesta dada es
correcta
* el usuario puede ingresar "t" o "T" para true, y
* "f" o "F" para false. Si el usuario ingresa una respuesta
* que no es ninguna de ellas este mtodo se mantendr hasta que de con ella
* obteniendo un true para la resp. legal o false en otro caso. Cuando el
usuario ingresa
* una respuestavlida, prints un message estableciendo que la respuesta es
correcta.
*
* @return true si el usuario responde correctamente
*/
Ingeniera en Computacin, Universidad de La Seren
173
Trate otra
un constructor, que crea una respuesta corta a la pregunta, dado el texto de la pregunta,
la respuesta correcta y el peso "peso".
/**
* Para responder en forma muy escueta ante una pregunta, para un examen.
* Este tipo de preguntas toma una respuesta que puede ser ingresada sobre una
linea de entrada
*
*/
public class Resp_Cortas_Pregunta extends Pregunta {
/**
* La respuesta correcta para esta pregunta. En este caso, la respuesta es
* un string -- el string exacto debe ser ingresado por el usuario.
*/
174
una variable para registrar la eleccin (un array de Strings) y la respuesta correcta (un
int -- es el index de la respuesta correcta en el array de elecciones).
175
/**
* preguntas de eleccin multiple para un examen. La respuesta puede
cualquier n de elecciones (al menos 2).
*
*/
public class Selec_Mul_Pregunta extends Pregunta {
/**
* La respuesta correcta para esta pregunta funciona como un
* index en el array de elecciones.
*/
private int correctResp;
tener
/**
* el array de elecciones.
*/
private String elec[];
/**
* Constructor: crea una pregunta de seleccin -multiple, con un peso dado.
*
*
* @param pregunta el texto de la pregunta
* @param eleArray un array de seleccion para la respuesta
* @param respuesta la respuesta correcta (debe ser un index en el array
anterior)
* @param wt el peso
*/
public Selec_Mul_Pregunta(String pregunta, String eleArray[], int respuesta,
int wt) {
// chequea parametros para validar
if (eleArray == null || eleArray.length < 2) {
System.out.println("Error: preguntas de seleccin multiple necesitan al
menos 2 elecciones");
System.exit(1);
}
else if (respuesta < 0 || respuesta >= eleArray.length) {
System.out.println("Error: respuesta para seleccin multiple deben ser un
index legal en el array de eleccin");
System.exit(1);
} // end if
text = pregunta;
correctResp = respuesta;
elec = eleArray;
setPeso(wt);
} // end constructor
/**
* Busca el usuario la pregunta y chequea para ver si la respuesta dada es
correcta.
* El usuario debe responder 'a', 'b', 'c', o 'd'. Si el usuario ingresa una
respuesta, que no esta
* este metodo le mandara un mensaje y lo intenta otra vez, hasta obtener la
respuesta legal.
* Cuando el usuario ingresa una respuesta valida prints un message
estableciendo que la respuesta es correcta.
*
* @return true si el usuario responde correctamente
*/
public boolean buscar() {
int numElec = elec.length; // n de elecciones para esta pregunta
Ingeniera en Computacin, Universidad de La Seren
176
System.out.println(text + "?");
for (int i = 0; i < numElec; i++) {
System.out.println("
" + (char)('a' + i) + ". " + elec[i]);
} // end for
System.out.print("ingrese la letra de su eleccion: ");
// obtener la respuesta del usuario y la traslada a mayuscula
String usuText = SavitchIn.readLine().toLowerCase();
if (usuText.length() != 1) {
System.out.println("Error: por favor ingrese un caracter simple");
return buscar(); // repetir
} // end if
// el usuario responde como un numero, con 'a' = 0, 'b' = 1, etc.
int respIndex = usuText.charAt(0) - 'a';
if (respIndex < 0 || respIndex >= numElec) {
System.out.println("Error: caracter ilegal");
return buscar(); // repetir
} // end if
if (respIndex == correctResp) {
System.out.println("correcta!");
return true;
}
else {
System.out.println("no, la respuesta es " + elec[correctResp]);
return false;
} // end if
} // end buscar
} // end class Selec_Mul_Pregunta
Exam.java: Es una clase que entrega una coleccin de preguntas para un examen dado. El
examen parte vaco (no existen preguntas), y proporciona un mtodo para agregar preguntas a
un examen. Esta clase deber contener:
Un mtodo agregaPregunta() , el que toma una pregunta (de cualquier tipo) como
argumento y la agrega al examen.
177
178
ExamDemo.java Es una clase testeadora capaz de ilustrar el trabajo de cada una de las clases
antes definidas, y al mismo tiempo administrar una propuesta de examen, con una solucin
final.
/**
* Un programa principal para testear.
*/
public class ExamDemo {
/**
* Este programa principal crea un pequeo examen y lo administra, tal como
se espera.
*/
public static void main(String args[]) {
// crea un examen con un total de 10 puntos: 8 preguntas de un punto y una
de dos puntos
Exam miExam = new Exam();
miExam.agregaPregunta(new TFpregunta("La capital de Chile es Santiago",
true, 1));
String santiagoElec[] = {"Santiago", "Valparaiso", "Concepcion",
"Magallanes", "Arica"};
miExam.agregaPregunta(new Selec_Mul_Pregunta("Cul es la capital de Region
Metropolitana", santiagoElec, 0, 1));
miExam.agregaPregunta(new Resp_Cortas_Pregunta("Cul es la capital de IV
Region", "Coquimbo", 1));
miExam.agregaPregunta(new TFpregunta("La capital de Alberta es Calgary",
false, 1));
String BCElec[] = {"Victoria", "Vancouver", "Nanaimo"};
miExam.agregaPregunta(new Selec_Mul_Pregunta("Cul es la capital de British
Columbia", BCElec, 0, 1));
miExam.agregaPregunta(new Resp_Cortas_Pregunta("Cul es la capital de
Argentina", "Buenos Aires", 1));
miExam.agregaPregunta(new Resp_Cortas_Pregunta("Cul es la capital de
Canada", "Ottawa", 2));
miExam.agregaPregunta(new TFpregunta("La capital de La Serena es Illapel",
false, 1));
String PElec[] = {"Brasilia", "Rio de Janeiro", "Sao Paulo", "Blumenau"};
miExam.agregaPregunta(new Selec_Mul_Pregunta("Cul es la capital de
Brasil?", PElec, 0, 1));
// give the exam and report the score
int puntaje = miExam.darExam();
System.out.println("su resultado es " + puntaje + "%");
} // end main
} // end class ExamDemo
179
Salida:
style y documentation:
propuesta.)
Mapa de clases con UML documentacin: 5 (Ir escogiendo alguna herramienta para el
modelamiento, por ejemplo, ArgoUML, Poseidon u otra.)
180
Capitulo 7: Eventos
CAPITULO 7
Eventos (Events)
La mayora de los programas o aplicaciones comerciales responden a una amplia gama de
acciones, tales como pulsar el mouse sobre un botn o pulsar una tecla de la consola. En todo
caso existen otras acciones ms sofisticadas, tales como cerrar windows, salvar un archivo etc.
a lo que el usuario las utiliza una despus de otra sin grandes dificultades. Ahora, el tipo de
programas que abordaremos esta relacionada con este tipo de aplicaciones, es decir aquellas
que son orientados al usuario. Java2 ofrece facilidades especiales para este propsito, en
particular veremos como escribir programas que sean capaces de realizar este tipo de eventos
o acciones, tales como presionar o pulsar el mouse sobre una porcin de la pantalla o sobre un
frame(marco), etc. Hoy en da existen herramientas que le facilitarn la vida, en trminos de
generar frames, textbox y otros, (por ejemplo, SUN One Studio, entre otros.), pero NO olvide
que jams podr sustituir lo que Ud. realmente desea de la aplicacin, a pesar de todo el
cdigo que pudo haber generado la herramienta. En resumen, siempre deber entrar a
manipular el cdigo generado por la herramienta CASE, esto le responde el porque hemos
empezado explicando y repasando los conceptos de POO, los que estn ntimamente
relacionados con los objetivos de manejar eventos.
Java proporciona una biblioteca de herramientas (o clases) denominada JFC (Java Foundation
Classes), con el fin de disear herramientas Graphic User Interface (GUI), interfaces grficas
(es decir, ventanas con componentes, tales como etiquetas, cajas de texto, botones, barras de
desplazamiento, etc.) Actualmente bajo esta denominacin se agrupan varias APIs:
Swing. Conjunto de componentes escritos en Java para disear interfaces grficas de usuario
que se ejecutan uniformemente en cualquier plataforma nativa que soporta la mquina virtual
de Java.
AWT (Abstract Window Toolkit - kit de herramientas de ventanas abstractas). Conjunto de
componentes para disear interfaces grficas de usuario comn a todas las plataformas
nativas. Este grupo ha sido sustituido en gran medida por el conjunto de componentes Swing;
muchos de stos heredan de sus correspondientes componentes AWT.
Java 2D. Permite incorporar en los programas, grficos 2D de alta calidad, texto e imgenes.
Drag and Drop. Soporte para arrastrar y colocar. Permite la transferencia de datos entre
aplicaciones mediante la simple operacin de arrastrarlos hasta el lugar de destino.
Swing o AWT?. La gran diferencia entre los componentes Swing y los componentes AWT es
que los primeros estn implementados absolutamente con cdigo no nativo lo que los hace
independientes de la plataforma, razn que justifica sobradamente su utilizacin. Adems
proporcionan ms capacidades que los componentes AWT. Los componentes Swing se pueden
identificar porque su nombre empieza por J; por ejemplo, el componente AWT Button tiene su
correspondiente componente Swing JButton. Los componentes AWT se localizan en el paquete
java.awt y los componentes Swing en el paquete javax.swing.
Ingeniera en Computacin, Universidad de La Seren
181
Capitulo 7: Eventos
Las herramientas para construir GUIs en Java pueden realizarse con Applets o a travs de las
aplicaciones, sin embargo los applets tienen serias rectricciones respecto del acceso al disco
para nombrar o rescribir un archivo. Notar un dato importante, todos los componentes Swing
son subclases de la clase JComponent.
Eventos
Para disear interfaces grficas (llmese ventanas con componentes, cajas de texto, botones,
barras de desplazamiento) java proporciona una biblioteca de clases llamada JFC (Java
Foundation Classes), que cobija a Swing, AWT, Java 2D y otras APIs. Swing o AWT?. La
gran diferencia entre los componentes es que los primeros estn implementados absolutamente
con cdigo no nativo lo que los hace independiente de la plataforma, adems proporciona ms
capacidades que AWT. Los componentes de AWT se ubican en java.awt, mientras que los
componentes de Swing se ubican en javax.swing. En todo caso todos los componentes
Swing son subclases de la clase JComponent. Los programas en Java pueden reaccionar a un
amplio rango de acciones orientadas al usuario. Por ejemplo, pulsar el mouse sobre la pantalla,
ajustar los bordes del window, tipear un key sobre la consola y muchas otras. Cada una de
estas acciones son llamados eventos.
Ejemplo 1
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class AplicacionSwing extends JFrame{
// Referencias a los componentes
private JLabel etiqueta;
private JButton botn;
// Otras referencias
private static String mensaje = "Hola mundo!!!";
private AplicacionSwing(String ttulo) { // constructor
super(ttulo); // ttulo de la ventana principal
iniciarComponentes();
// Ajustar el tamao de la ventana al mnimo
pack();
}
private void iniciarComponentes() {
// Crear una etiqueta con el texto centrado
etiqueta = new JLabel();
etiqueta.setHorizontalAlignment(JLabel.CENTER);
// Crear un botn
botn = new JButton("Haga clic aqu");
// Establecer como tecla aceleradora la C. Entonces, pulsar Alt+C
// ser equivalente ha hacer clic, sobre el botn.
botn.setMnemonic(KeyEvent.VK_C);
// Asignar al botn una descripcin abreviada
botn.setToolTipText("botn de pulsacin");
// Permitir que el botn responda a los eventos de accin
ActionListener al = new ActionListener()
{
// Este mtodo se ejecutar cuando se haga clic en "botn"
Ingeniera en Computacin, Universidad de La Seren
182
Capitulo 7: Eventos
183
Capitulo 7: Eventos
Marco
Panel
Etiqueta
Botn
Ud. puede observar que cuando pulsa el botn la etiqueta muestra el mensaje Hola
Mundo!!!, ms an, en ella se puede observar que el botn puede activarse, adems de un clic
sobre el mouse, puede utilizarse las teclas aceleradoras Alt+C, y que tiene asociada una breve
descripcin.
Ejemplo 2
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class ButtonPanel extends JPanel implements ActionListener {
public ButtonPanel() {
amaButton = new JButton("Amarillo");
azulButton = new JButton("Azul");
rojoButton = new JButton("Rojo");
add(amaButton);
add(azulButton);
add(rojoButton);
amaButton.addActionListener(this);
azulButton.addActionListener(this);
rojoButton.addActionListener(this);
}
public void actionPerformed(ActionEvent evt)
{ Object source = evt.getSource();
Color color = getBackground();
if (source == amaButton) color = Color.yellow;
else if (source == azulButton) color = Color.blue;
else if (source == rojoButton) color = Color.red;
Ingeniera en Computacin, Universidad de La Seren
184
Capitulo 7: Eventos
setBackground(color);
repaint();
}
private JButton amaButton;
private JButton azulButton;
private JButton rojoButton;
}
class ButtonFrame extends JFrame
{ public ButtonFrame()
{ setTitle("Y mas Botones...");
setSize(300, 200);
addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent e)
{ System.exit(0);
}
} );
Container contentPane = getContentPane();
contentPane.add(new ButtonPanel());
}
}
public class ButtonDemo
{ public static void main(String[] args)
{ JFrame frame = new ButtonFrame();
frame.show();
}
}
Cuando se crean eventos, Java crea un objeto evento para representarlo. El tipo de objeto
que es producido depende del orden del evento. Por ejemplo, el objeto evento que se crea para
cuando pulsa el mouse pertenece a la clase MouseEvent. Existen varias otras acciones que
producen objetos MouseEvent: el botn izquierdo del mouse ha sido presionado etc, o sobre el
teclado con keyEvent.
Una vez que ha creado el objeto de evento, Java lo pasar a un mtodo que ha sido escogido
para tratarlo como un tipo particular de evento. El mtodo se llama event listener, (mtodo
que escucha), este mtodo debe ser capaz de contestar apropiadamente la accin que el usuario
demanda o requiere, pero para eso debi haber escogido el o los mtodos apropiados. Los
Ingeniera en Computacin, Universidad de La Seren
185
Capitulo 7: Eventos
mtodos listener tienen nombres especiales que indican el tipo de evento a los que ellos
responden. Por ejemplo, un mtodo que escucha que se ha pulsado el mouse debe responder a
este evento llamado mouseClicked, si es una tecla el evento asociado es keyTyped, y as
sucesivamente. (Una lista completa de sus nombres aparece a la parte final de estas notas.)
Cada mtodo que escucha tiene un solo parmetro que es el objeto de evento que representa el
evento al que l est respondiendo. La vida de un programa interactivo simple, la dividiremos
en dos fases.
Fase de la estructuracin. Esto puede involucrar el crear una GUI para el programa, y
variables de inicializacin.
Fase interactiva. Durante esta fase, el programa est esperando por los eventos
comenzados por el usuario, de manera que en cuanto uno ocurra, el mtodo
correspondiente que escucha obedece. Si no hay ningn evento, el programa se sienta y
espera hasta que otro evento venga. En general esta fase se reconoce por estar
involucrados declaraciones del tipo
public class MiPanel extends JPanel implements ActionListener
Si un mtodo listener no completa su tarea lo bastante rpida, el prximo evento puede ocurrir
antes de que este ltimo haya terminado. Para manejar esta posibilidad, todos los objetos
eventos se agregan a una cola de prioridades, esto se llama cola de despacho de evento (event
dispatching queue). Apenas un mtodo listener ha terminado el proceso de un evento, el
prximo evento (si hay uno) en la cola se pasa al mtodo que escucha.
GUI Minimo-Minimorum:
Usualmente un programa GUI consiste de una Interface, event listener y cdigos de
aplicaciones. Nuestro primer programa GUI adolece de listener, pero esto no ser lo usual.
import java.awt.*; // import la clase AWT
public class ejGUI1 {
public static void main ( String[] args ) // usual start de una aplicacin y no de
un Applet!!
{
Frame frm = new Frame();//construye objeto Frame, no un Applet!
frm.setSize(
150, 100 );// setea a 150 pixeles ancho y 100 alto
frm.setVisible( true ); // lo hace visible, sino debe ser false.
}
}
Si Ud. lo ejecuto habr notado que no tiene un event listener, pues no responde por ejemplo
para cuando Ud. desea cerrar el frame, veremos como lograrlo a travs de una declaracin que
incluye una expresin del tipo frm.addWindowListener( wquit);. Ms simple an es el siguiente
programa, que en realidad no hace absolutamente nada, en realidad teoricamente crea un
window, pero nunca es posible de ver el screen.
import javax.swing.*; // import la clase swing
Ingeniera en Computacin, Universidad de La Seren
186
Capitulo 7: Eventos
Ms simple an a los programas anteriores es el siguiente, que en realidad muestra una barra
solamente, sin dimensin para el frame.
import javax.swing.*;
public class MiniSwing2 {
public static void main(String args[]) {
JFrame miFrame = new JFrame();
miFrame.setVisible(true);
} // end main
} // end class MiniSwing2
Como podr haber notado, hay que otorgarle un crdito al mtodo setSize, pues ayudo a
cambiar el tamao del frame sobre su pantalla, incluso durante su ejecucin, como lo muestra
el siguiente ejemplo, pero sigue siendo un problema que el frame aparezca en la esquina
superior-izquierda de su pantalla.
import java.awt.*;
public class ejGUI2
{
public static void main ( String[] args )
{
Frame frm = new Frame();
int ancho = 20;
int alto = 10;
frm.setVisible( true );
for ( int cont=1; cont<300; cont++ )
frm.setSize( ancho++, alto++ );
}
}
Otra gracia que presenta la POO como ya lo hemos adelantado es el de poder extender la clase
incorporandole nuevas propiedades, como por ejemplo, un mensaje. Notar que se incorpora el
mtodo paint(), la tarea de ste mtodo consiste en dar las medidas del rea de despliegue.
Ahora para lograrlo, hace uso de un objeto Graphics2D, que tiene su semejanza al System.out
para cuando se enviaban cadenas de caracteres a la pantalla de la consola. El objeto Graphics
tiene a su vez un mtodo llamado drawString(), que se usa para desplegar texto, como muestra
el siguiente ejemplo.
import java.awt.*;
class miFrame extends Frame {
public void paint ( Graphics g ) {
g.drawString("Un objeto MiFrame", 10, 50 );
//escribe un string en el Frame con x=10 y=50
}
}
public class ejGUI3 {
public static void main ( String[] args ) {
miFrame frm = new miFrame();
frm.setSize( 150, 100 );
frm.setVisible( true );
Ingeniera en Computacin, Universidad de La Seren
187
Capitulo 7: Eventos
}
}
Ud. habr notado que no le hemos puesto nombre al frame o a la barra del frame, ahora ver
una propuesta.
import javax.swing.*;
public class MiniSwing4 {
public static void main(String args[]) {
JFrame miFrame = new JFrame();
miFrame.setSize(200, 100);
miFrame.setTitle("Titulando los frames"); // lo nuevo.
miFrame.setVisible(true);
} // end main
} // end class MiniSwing4
Vamos a lo prometido, me refiero a tratar de cerrar el frame para cuando pulsemos el cierre de
ventana del frame que se ha creado, siendo este otro ejemplo de cuando realizar o gatillar un
evento.
import java.awt.*;
import java.awt.event.*;
class miFrame extends Frame {
public void paint ( Graphics g ) {
g.drawString("Click el boton de cierre", 10, 50 );
}
}
class WindowQuit extends WindowAdapter {
public void windowClosing( WindowEvent e )
{
System.exit( 0 ); // exit del programa
}
}
public class GUItester {
public static void main ( String[] args ) {
miFrame frm = new miFrame();
WindowQuit wquit = new WindowQuit();
// construye un listener para frame
frm.addWindowListener( wquit );
// registra el listener con el frame
frm.setSize( 150, 100 );
frm.setVisible( true );
}
}
188
Capitulo 7: Eventos
El evento de capturar el cierre de windows es uno de los tantos eventos que se analizarn,
dentro de un contexto de una estructura que pretende ser estandar.
Estuctura de una Aplicacin Swing.
Convengamos en que una aplicacin Swing que muestra una interfaz grfica para cuando se
ejecuta no es ms que un objeto de una clase derivada de JFrame. Basado en lo anterior, el
cdigo mostrado a continuacin puede ser una propuesta vlida para la mayora de las
aplicaciones que inician su ejecucin visualizando una ventana principal:
import javax.swing.*;
import java.awt.event.*;
public class estrucFrame extends JFrame {
public estrucFrame() {
super("Titulo de la Aplicacion");
// Aqu, agrega los componentes.
}
public static void main(String[] args) {
JFrame miframe = new estrucFrame();
WindowListener l = new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
};
miframe.addWindowListener(l);
miframe.pack();
miframe.setVisible(true);
}
}
A manera de comentario, digamos que esta aplicacin es una subclase de JFrame y todo el
trabajo involucrado en la creacin de la interfaz de usuario del frame(o marco) se realiza en el
mtodo constructor estrucFrame(). Con el mtodo super(cadena); se pretende
proporcionar el texto para la barra de ttulo del marco. Luego la interfaz de usuario deber
construirse dentro de este constructor; aqu se pueden agregar los componentes a los
contenedores, y estos ltimos al marco.
public estrucFrame() {
super("Titulo de la Aplicacion");
// Aqu, agrega los componentes.
}
189
Capitulo 7: Eventos
Dentro de main() se usa el constructor estrucFrame() para crear una nueva instancia que le
llame miframe, de la clase JFrame, la que ser la ventana principal de la aplicacin. Notar que
el nombre del archivo es estructFrame.java.
JFrame miframe = new estrucFrame();
Este cdigo es casi estandar dentro del manejo de eventos, y lo que hace es manejar la tarea de
cerrar la aplicacin para cuando se cierre el marco o pulse con el mouse sobre la porcin cierre
de ventana en el marco que se genero. Recordar que dentro del sistema de manejo de eventos
de Java2, si una clase desea responder a un evento de usuario debe implementar las
interfaces que maneja los eventos. Estas interfaces se llaman escuchadores de eventos, una de
ellas es WindowListener.
WindowListener l = new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
};
miframe.addWindowListener(l);
Ahora para darle el tamao que Ud. desee al windows, reemplace la lnea miframe.pack()
por miframe.setSize(400, 120); por ejemplo
Ingeniera en Computacin, Universidad de La Seren
190
Capitulo 7: Eventos
Notar la importancia de la POO y su aplicacin a los eventos. Esto es, la aplicacin se ejecuta
y queda a la espera de las acciones que pueda emprender el usuario de la misma. En el ejemplo
tan simple que acabamos de presentar, la nica accin que puede tomar el usuario es cerrar la
ventana, por ejemplo, haciendo clic en el botn cerrar, lo que origina el evento
correspondiente Cmo responde Java a este evento? Ejecutando el mtodo windowClosing
asociado con l de forma predeterminada. Por lo tanto, nosotros podemos redefinir este
mtodo y programar las acciones a tomar; en este caso, salir del sistema con
System.exit(0). Es evidente, que se pueden producir otros eventos; por ejemplo: la ventana
se abre, se minimiza, vuelve a su estado normal, etc. Lo que tiene que saber es que Java
siempre responder a cada evento invocando a su mtodo asociado. Lgicamente esa tarea
hay que programarla y para poder hacerlo hay que saber cmo manejar ese evento. Segn ha
podido ver anteriormente, los eventos se manejan a travs de un conjunto de mtodos
predeterminados en todos los componentes, que pueden ser frame, panel, etiquetas, botn y
otros. Pero para que un componente pueda responder a los eventos que sobre l pueden
ocurrir, tiene que tener asociado el manejador o escuchador de esos eventos. Java 2
proporciona varios manejadores o escuchadores de eventos, como se muestran en la tabla.
191
Capitulo 7: Eventos
Metodos
actionPerformed
Parametros/Accesos
ActionEvent
Eventos generados
por
Button
ActionListener
getActionCommand
getModifiers
AdjustamentListener adjustmentValueChan AdjustmentEvent
ged
getAdjustable
getAdjustmentType
getValue
ItemListener
itemStateChanged
ItemEvent
getItem
getItemSelectable
getStateChange
TextListener
textValueChanged
TextEvent
ComponentListener
List
MenuItem
TexField
Scrollbar
Checkbox
CheckboxMenuItem
Choice
List
TextComponent
componentMoved
componentHidden
componentResized
componentShown
conponentAdded
ComponentEvent
getComponent
Component
ContainerEvent
Container
componentRemoved
getChild
getContainer
FocusListener
focusGained
focusLost
FocusEvent
isTemporary
KeyListener
keyPressed
keyReleased
keyTyped
KeyEvent
Component
getKeyChar
getKeyCode
getKeyModifiersText
getKeyText
isActionKey
MouseListener
mousePressed
mouseReleased
mouseEntered
mouseExited
mouseClicked
MouseEvent
getClickCount
getX
getY
getPoint
translatePoint
isPopupTrigger
Component
MouseMotionListener mouseDragged
mouseMoved
MouseEvent
Component
WindowListener
WindowEvent
getWindow
Window
ContainerListener
windowClosing
windowOpened
windowIconified
windowDeiconified
windowClosed
windowActivated
windowDeactivated
Component
192
Capitulo 7: Eventos
193
Capitulo 7: Eventos
Significado
mouseClicked
mouseEntered
mouseExited
mousePressed
mouseReleased
ActionListener.
Permite a una ventana responder a las acciones que ocurren sobre ella; por
ejemplo, minimizarla, abrirla, moverla, etc. Este manejador se puede asociar con componentes
JFrame y JWindow, invocando al mtodo addWindowListener.
En el siguiente programa se ejemplifica en detalle cada uno de los mtodos, usando window
listener que captura y reporta sobre todos los eventos del window.
194
Capitulo 7: Eventos
Interface
WindowListener
Metodos
windowClosing
windowOpened
windowIconified
windowDeiconified
windowClosed
windowActivated
windowDeactivated
Parametros/Accesos
WindowEvent
getWindow
Como ya se ha mencionado, en Java cualquier clase que implementa una interface, por
ejemplo WindowListener debe implementar TODOS los mtodos. En este caso, se deben
implementar los 7-mtodos.
Instrumentalizando la interface WindowListener
import javax.swing.*;
import java.awt.event.*;
public class MiniSwing5 {
public static void main(String args[]) {
JFrame miFrame = new JFrame();
miFrame.setSize(200, 100);
miFrame.setTitle("Programa de Reporte");
miFrame.addWindowListener(new WindowReporter()); // nuevo
miFrame.setVisible(true);
} // end main
} // end class MiniSwing5
/**
* Un window listener que reporta todos los eventos window a la consola.
*/
class WindowReporter implements WindowListener {
/* Esta clase implement todos los metodos requeridos por la interface
WindowListener. Todo metodo trata un tipo de window event.
Todo metodo toma un
parametro, el cual es un objeto que contiene informacion sobre el evento. Notar que
no se usan eventos como Objetos, que tambin son factibles de implementar.*/
/* Llama al evento window que se muestra por primera vez.
* parametro e es un objeto con informacion sobre el evento
*/
public void windowOpened(WindowEvent e) {
System.out.println("window fue abierto por primera vez.");
} // end windowOpened
/*
* Llamada al evento en respuesta a un requerimiento del usuario con respecto a cerrar el window.
* parametro e es un objeto con informacion sobre el evento.
*/
public void windowClosing(WindowEvent e) {
System.out.println("usuario solicita un requerimiento, cerrar window.");
System.exit(0);
Ingeniera en Computacin, Universidad de La Seren
195
Capitulo 7: Eventos
} // end windowClosing
/*
* Llamada al evento despus que el requerimiento del usuario con respecto a
cerrar el window se ha cumplido. */
public void windowClosed(WindowEvent e) {
System.out.println("window ha sido cerrado.");
} // end windowClosed
/*
* Llamada al evento para cuando window es minimizado.
* parametro e es un objeto con informacion sobre el evento.
*/
public void windowIconified(WindowEvent e) {
System.out.println("window ha sido minimizado.");
} // end windowIconified
/*
* Llamada al evento en respuesta a un requerimiento del usuario con respecto a
restaurar el window, luego de haber sido minimizado.
* parametro e es un objeto con informacion sobre el evento.
*/
public void windowDeiconified(WindowEvent e) {
System.out.println("window ha sido restaurado.");
} // end windowDeiconified
/*
* Llamada al evento en respuesta a un requerimiento del usuario con respecto a
que window, sea activado.
* parametro e es un objeto con informacion sobre el evento.
*/
public void windowActivated(WindowEvent e) {
System.out.println("window ha sido activado.");
} // end windowActivated
/*
* Llamada al evento en respuesta a un requerimiento del usuario con respecto a
desactivar window.
* parametro e es un objeto con informacion sobre el evento.
*/
public void windowDeactivated(WindowEvent e) {
System.out.println("window ha sido desactivado.");
} // end windowDeactivated
} // end class WindowReporter
Pero no debera este programa llamarlo a confusin, pues si Ud. desea solamente terminar el
programa, debera hacer algo como sigue:
class WindowReporter implements WindowListener {
public void windowOpened(WindowEvent e) {}
public void windowClosing(WindowEvent e) {System.exit(0);}
public void windowClosed(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
} // end class WindowReporter
Ingeniera en Computacin, Universidad de La Seren
196
Capitulo 7: Eventos
KeyListener,
Listener por
Otra tcnica que puede ser til es proceder en funcin de la clase del componente. Por
ejemplo:
public void actionPerformed (ActionEvent e) {
Object obj = e.getSource(); // objeto que produjo el evento e.
if (obj instanceof JButton) //por ejemplo.
mostrarMensaje(e);
else if (obj instanceof JTextField)
//hacer otra cosa.
}
Si ahora, por ejemplo, escribimos un mtodo mouseClicked() que queremos sea obedecido
cuando el ratn pulse el botn en una rea particular de la pantalla, debemos asegurarnos que:
a. Este asociado con un objeto listener. Podemos escoger cualquier objeto que desee
como el objeto que escucha con tal de que ste instrumente la interface de
MouseListener. Esto significa que debe tener los cinco mtodos: mouseClicked,
mouseEntered, mouseExited, mousePressed y mouseReleased.
197
Capitulo 7: Eventos
b.
Se identifique la fuente del evento. Esto es, que el objeto que maneja el componente de
la interface el ratn pulse sobre el botn. En todos nuestros ejemplos, la fuente de
cada evento ser una componente de la interface de algn tipo.
c.
La declaracin tiene que ser incluida en la parte de la estructura del programa que
registra el objeto que escucha con el objeto fuente. Si c es el componente que es la
fuente del evento, y l es el objeto listener entonces la declaracin es
c.addMouseListener(l);
Una vez que esta declaracin se ha realizado, cualquier evento del ratn causado por pulsar el
botn en componente c se pasar al objeto l, y su mtodo mouseClicked obedecer. Los
objetos e sern pasados a cada objetos cada vez. Por ejemplo, si definimos un objeto
MouseListener para contener el mtodo mouseClicked que reaccionar al click sobre el
mouse, este objeto debe tener los 5-mtodos de la interface MouseListener listados
anteriormente. As debemos definir no solamente mouseClicked, sino tambin
mousePressed, mouseReleased, aunque no se ocupen. Cmo hacer esto?. Muy similar a lo
planteado antes, ya sea declarar
public void mousePressed(MouseEvent e) { }
El nombre MiMouseListener puede ser cualquier nombre que Ud. proponga. Los otros
nombres deben ser como los que se muestran - MouseAdapter, mouseClicked y MouseEvent,
por estar as definidos en la clase.
Como Ud. habr observado los ejemplos vistos han implementado una sola interface, pero esto
es posible de generalizarlo, es decir, poder a travs de una declaracin manejar eventos de
accin y de texto, por ejemplo, tal como se muestra a continuacin.
public class Suspenso extends JFrame
implements ActionListener, TextListener
198
Capitulo 7: Eventos
Para concluir este segmento, veamos algunas herramientas que ofrece Java. Como Ud. habr
notado siempre el frame aparece por defecto en la posicin esquina superior-izquierda de su
pantalla, pero esto puede cambiar. Si Ud. se da cuenta el centrado es dependiente del sistema,
pues la resolucin de la pantalla es una informacin que el sistema posee. En Java se tiene una
clase Toolkit que posee un mtodo llamado getScreenSize() que retorna el tamao del
screen como un objeto Dimension, en el programa llamado d, con variables instanciadas
d.height y d.width.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class CentroFrame extends Jframe {
public CentroFrame() {
setTitle("Frame Centrado");
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
} );
//fragmento usado para obtener el tamao de la pantalla(screen)
Toolkit tk = Toolkit.getDefaultToolkit();
Dimension d = tk.getScreenSize();
int pantallaHeight = d.height;
int pantallaWidth = d.width;
setSize(pantallaWidth / 2, pantallaHeight / 2);
setLocation(pantallaWidth / 4, pantallaHeight / 4);
}
}
public class CentrarFrame {
public static void main(String[] args) {
JFrame frame = new CentroFrame();
frame.show();
}
}
Y por ltimo, Ud. habr observado que en los ejemplos vistos en la barra del frame siempre
aparece por defecto la taza de caf, propio de Java, que tambin se puede cambiar. Basta
incluir la declaracin
/*reemplazamos el icono de defecto por algun.gif,dado que
dependiente del sistema se usa tk,para incrustar el icono.*/
tambin
es
Como Ud. habr observado en la Tabla Resumen de trato a los Eventos aparece en la columna
Eventos generados por, el concepto de Component y Container , estos se refieren a que un
Component es un elemento de la Interface de usuario, tales como Button, Text field, o
scrollbar, mientras que Container es un rea de la pantalla o componente que puede contener
Ingeniera en Computacin, Universidad de La Seren
199
Capitulo 7: Eventos
componentes, tales como windows o un panel. En general digamos que todos los componentes
Swing son subclases de la clase JComponent.
Como Ud. podr recordar, a la clase estrucFrame, luego de ralizada su ejecucin se obtuvo
una simple ventana con su ttulo, esto es porque no tena ningn componente, como Button o
algn otro que se pudiera haber incrustado
TIPOS DE EVENTOS
Los eventos se catalogan por su naturaleza, que se indicar en el miembro id de su estructura.
Los grandes grupos de eventos son:
Eventos de Ventana
Son los que se generan en respuesta a los cambios de una ventana un frame o un dialogo.
WINDOW_DESTROY
WINDOW_EXPOSE
WINDOW_ICONIFY
WINDOW_DEICONIFY
WINDOW_MOVED
Eventos de Teclado
Son generados en respuesta a cuando el usuario pulsa y suelta una tecla mientras un
Componente tiene el foco de entrada.
KEY_PRESS
KEY_RELEASE
KEY_ACTION
KEY_ACTION_RELEASE
/**
* keyDemo, para visualizar el uso de
KEY_PRESS
KEY_RELEASE
KEY_ACTION
KEY_ACTION_RELEASE
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class keyDemoPanel extends JPanel
implements KeyListener
{ public keyDemoPanel()
{ addKeyListener(this);
}
public void keyPressed(KeyEvent evt)
{ int keyCode = evt.getKeyCode();
int d;
if (evt.isShiftDown())
d = 5;
Ingeniera en Computacin, Universidad de La Seren
200
Capitulo 7: Eventos
else
d = 1;
if (keyCode == KeyEvent.VK_LEFT) add(-d, 0);
else if (keyCode == KeyEvent.VK_RIGHT) add(d, 0);
else if (keyCode == KeyEvent.VK_UP) add(0, -d);
else if (keyCode == KeyEvent.VK_DOWN) add(0, d);
}
public void keyReleased(KeyEvent evt)
{}
public void keyTyped(KeyEvent evt)
{ char keyChar = evt.getKeyChar();
int d;
if (Character.isUpperCase(keyChar))
{ d = 5;
keyChar = Character.toLowerCase(keyChar);
}
else
d = 1;
if (keyChar == 'h') add(-d, 0);
else if (keyChar == 'l') add(d, 0);
else if (keyChar == 'k') add(0, -d);
else if (keyChar == 'j') add(0, d);
}
public boolean isFocusTraversable() { return true; }
public void add(int dx, int dy)
{ end.x += dx;
end.y += dy;
Graphics g = getGraphics();
g.drawLine(start.x, start.y, end.x, end.y);
g.dispose();
start.x = end.x;
start.y = end.y;
}
private Point start = new Point(0, 0);
private Point end = new Point(0, 0);
}
class keyDemoFrame extends JFrame
{ public keyDemoFrame()
{ setTitle("keyDemo");
setSize(300, 200);
addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent e)
{ System.exit(0);
}
} );
Container contenPane = getContentPane();
contenPane.add(new keyDemoPanel());
}
}
public class keyDemo
{ public static void main(String[] args)
{ JFrame frame = new keyDemoFrame();
frame.show();
}
}
201
Capitulo 7: Eventos
Eventos de Ratn
Son los eventos generados por acciones sobre el ratn dentro de los lmites de un Componente.
MOUSE_DOWN
MOUSE_UP
MOUSE_MOVE
MOUSE_ENTER
MOUSE_EXIT
MOUSE_DRAG
Eventos de Barras
Son los eventos generados como respuesta a la manipulacin de barras de desplazamiento
(scrollbars).
SCROLL_LINE_UP
SCROLL_LINE_DOWN
SCROLL_PAGE_UP
SCROLL_PAGE_DOWN
SCROLL_ABSOLUTE
Eventos de Lista
Son los eventos generados al seleccionar elementos de una lista.
LIST_SELECT
LIST_DESELECT
Eventos Varios
Son los eventos generados en funcin de diversas acciones.
ACTION_EVENT
LOAD_FILE
SAVE_FILE
GOT_FOCUS
LOST_FOCUS
202
Captulo 8: Swing
C A P T U L O 8.
Swing
Digamos que muchos de los componentes Swing estn basados en un patrn de diseo
denominado MVC, "Modelo-Vista-Controlador", o en ingls (Model -View-Controller). El
concepto de este patrn de diseo se basa en tres elementos:
Una fcil manera de entender MVC, es considererar: el modelo como los datos, el view es el
window sobre la pantalla, y el controller es la relacin entre los dos. No es menester de este
tutorial explicar todo el funcionamiento de este nuevo diseo, pero si se quiere profundizar en
l consulte [Morgan, 1999].
En el Cap. 7 se dieron los pasos preliminares para entender la filosofa que estaba detrs de los
eventos, con la tarea especfica de cerrar la ventana para cuando el usuario pulse, el icono
respectivo. La idea es ahora estructurar la forma de cmo trabajar con Swing respecto al
diseo de una interfaz de usuario. Recordemos que todos los elementos de Swing son parte del
paquete javax.swing, y como tal se debe utilizar el encabezado import javax.swing.*;.
La forma de utilizar un componente Swing no difiere en nada de cmo se hizo con un objeto
de cualquier otra clase. Es decir, se crea el componente invocando al constructor de su clase,
luego se establece que deber realizar, para finalmente aadirlo a un contenedor.
Por ejemplo, se desea crear un botn de pulsacin, luego se establece que la tecla aceleradora
es la C, adems de una descripcin abreviada. Esto se visualiza as.
//crear un botn
MiBoton = new JButton(Pulse aqu);
//Pulsar Alt+C ser equivalente a pulsar el botn.
MiBoton.setMnemonic(KeyEvent.VK_C);
//asignarle una descripcin
MiBoton.setTollTipText(botn de pulsacin.);
Los componentes ms comunes son las llamadas: etiquetas, botones, campo de texto de una
lnea o de varias, casillas de verificacin, botones de opcin, listas, barras de desplazamiento,
cuadros de dilogo estndar y otros.
Para relacionarlo con el cap. 7, digamos que el siguiente segmento de programa, asocia al
componente de la clase JButton, un manejador de eventos de accin. De esta forma el botn
podr responder al evento click, mediante el mtodo actionPerformed.
Ingeniera en Computacin, Universidad de La Seren
203
Captulo 8: Swing
Otra tcnica que puede ser til es proceder en funcin de la clase del componente. Por
ejemplo:
public void actionPerformed (ActionEvent e) {
Object obj = e.getSource(); // objeto que produjo el evento e.
if (obj instanceof JButton) //por ejemplo.
mostrarMensaje(e);
else if (obj instanceof JTextField)
//hacer otra cosa.
}
Como Ud. habr observado en Cap.7 aparece en Tabla Resumen de trato a los Eventos la
columna Eventos generados por, el concepto de Component y Container , estos se refieren a
que un Component es un elemento de la Interface de usuario, tales como Button, Text field, o
scrollbar, mientras que Container es un rea de la pantalla o componente que puede contener
componentes, tales como windows o un panel. En general digamos que todos los componentes
Swing son subclases de la clase JComponent. Como Ud. podr recordar, a la clase
estrucFrame, luego de ralizada su ejecucin se obtuvo una simple ventana con su ttulo, esto
es porque no tena ningn componente, como Button o algn otro que se pudiera haber
incrustado.
Los contenedores son componentes Swing utilizados para ubicar otros componentes. En
general, se tiene una jerarqua de contenedores, ellos son contenedores de nivel intermedio, de
nivel superior y controles. La siguiente figura nos muestra algo al respecto, en donde se tiene
un marco, con un panel
204
Captulo 8: Swing
Marco(Frame)
Panel
Marco(Frame)
Panel
Botn
Etiqueta
En general, para agregar a un marco los componentes que hemos denominado controles, como
son la etiqueta y el botn, hay que utilizar un contenedor intermedio. La figura anterior
muestra que realmente existe una jerarqua de contenedores que nos ayudar a colocar
adecuadamente los controles. La raz de esa jerarqua es el contenedor de nivel superior
definido por el marco de la ventana. Analizando esa figura se observa:
205
Captulo 8: Swing
Una etiqueta (objeto de la clase JLabel) y un botn (objeto de la clase JButton). Esta clase de
componentes es lo que genricamente llamamos controles. Cada uno de ellos realiza una
operacin especfica cara al usuario. Anteriormente, en este mismo captulo, ya vimos cmo
crearlos. Para aadirlos a un panel, utilizaremos el mtodo add. Por ejemplo:
panel.add(botn) ;
Para organizar los controles que se aaden a un contenedor, Java proporciona los llamados
administradores de diseo. Un administrador de diseo est pensado para mostrar varios
componentes a la vez en un orden preestablecido. De forma predeterminada cada contenedor
tiene asignado un administrador de diseo. Swing proporciona seis administradores de diseo,
sin embargo se tienen tambin componentes predefinidas como las que se muestran:
206
Captulo 8: Swing
207
Captulo 8: Swing
CardLayout. Diseo por paneles. Este diseador permite colocar en el contenedor grupos
diferentes de componentes en instantes diferentes de la ejecucin (similar a los paneles con
pestaas).
208
Captulo 8: Swing
BoxLayout. Diseo en caja. Coloca los componentes en el contenedor en una nica fila o
columna, ajustndose al espacio que haya.
Un JFrame est subdividido en varios paneles diferentes, el panel principal con el que trabaja
es el panel de contenido, que representa toda el rea de un marco al que se pueden agregar
componentes. Para agregar componentes debemos hacer lo siguiente:
209
Captulo 8: Swing
Ejemplo
import java.awt.GridLayout;
import java.awt.event.*;
import javax.swing.*;
public class Swinger extends JFrame {
public Swinger() {
super("Swinger");
String nota = "Interactue conmigo.";
JButton miButton = new JButton(nota);
JPanel pane = new JPanel();
pane.add(miButton);
setContentPane(pane);
}
//este segmento es casi estandar, para cerrar la aplicacin.
public static void main(String[] args) {
JFrame frame = new Swinger();
WindowListener l = new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
};
frame.addWindowListener(l);
frame.pack();
frame.setVisible(true);
}
}
210
Captulo 8: Swing
Como ya se di cuenta los botones de Swing forman parte del cuerpo de la clase JButton. Los
cuales pueden tener una etiqueta o rtulo de texto, como AWT, una etiqueta de icono o una
combinacin de ambos. En el caso de icono, basta considerar en el programa base
Swinger.java, en donde reemplaza lo bold por esto.
ImageIcon miIcon= new ImageIcon(hola.gif);
JButton miButton = new JButton(miIcon);
JPanel pane = new JPanel();
pane.add(miButton);
SetContentPane(pane)
No olvidar que en Java se tiene una clase Toolkit que posee un mtodo llamado
getScreenSize() que retorna el tamao del screen como un objeto Dimension, en el
programa llamado d, con variables instanciadas d.height y d.width, con el fin de centrar la
aplicacin.
Notar que el botn interactua conmigo, no gatilla ningn evento, es decir, NO se le ha
asociado ningn evento que pueda realizar para cuando el usuario pulse el botn. Veamos que
esto puede cambiar.
Hasta el momento, podra esperarse, el de continuar dando ejemplos con las distintas
herramientas etiquetas, botones, campo de texto de una lnea o de varias, casillas de
verificacin, botones de opcin, listas, barras de desplazamiento, cuadros de dilogo estndar
y otros., pero lo que deseo es, lograr la comunin entre los eventos, vistos en Cap. 7 y los
componentes y controles, que de alguna forma se han mencionado y ejemplificado con
JButton, aqu en Cap. 8. No obstante al final de esta seccin daremos ms ejemplos que
resumen muchas de las componentes aqu mencionadas.
Se sabe que dentro del sistema de manejo de eventos de Java2, si una clase desea responder a
un evento de usuario debe implementar la interfaces que maneja los eventos, estas interfaces
se llaman escuchadores de eventos o listener. Existe una lista de ellos dada en Cap. 7. Por
ejemplo, ActionListener() es un evento que se genera cuando un usuario realiza una accin
sobre un componente, por ejemplo, pulsar sobre un botn. Existen varias otras, y la idea es
aplicarla en algunas aplicaciones concretas. El paquete java.awt.event contiene todos los
escuchadores de eventos bsicos, para utilizarlos basta declarar
Ingeniera en Computacin, Universidad de La Seren
211
Captulo 8: Swing
import java.awt.event.*;
Adems, es posible declarar eventos que puedan manejar eventos de accin y de texto, lo que
se logra al considerar,
public class Suspenso extends Jframe
implements ActionListener, TextListener
{
//...
}
Componentes Listener
Al convertir una clase en un escuchador de eventos, establece un tipo especfico de evento
para ser escuchado por esa clase, aunque esto ltimo puede que jams suceda si no agrega al
componente un escuchador de evento coincidente. A lo que ese escuchador de evento generar
los eventos cada vez que se use el componente. Por eso despus de crear un componente, para
asociarle un listener deber llamar a alguno de los siguientes mtodos del componente. Por
ejemplo, addActionListener() para los componentes de JButton, JCheckBox,
JComboBox, JTextField y JRadioButton.
Note que todos los mtodos agregados toman un argumento: A saber, el objeto escuchador de
evento de esa clase. Por medio de this Ud. indica que la clase actual es el escuchador de
evento.
Mtodos Manejadores de Eventos
Cuando Ud. asocia una interfaz a una clase, la clase debe manejar todos los eventos
contenidos en la interfaz. En el caso de los escuchadores de eventos, cuando tiene lugar el
evento de usuario correspondiente, el sistema de ventanas llama a cada mtodo en forma
automtica. La interface ActionListener tiene un solo mtodo. Todas las clases que
ActionListener implementa deben tener un mtodo con una estructura como la siguiente:
public void actionPerformed(ActionEvent evt)
{
//...maneje el evento en este sector
}
212
Captulo 8: Swing
El siguiente ejemplo instrumentaliza al botn de manera que cada vez que se pulse el botn
respectivo, se cambiar el titulo del frame por el nombre del botn pulsado.
Ejemplo
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
public class tuBoton extends Jframe implements ActionListener {
JButton b1 = new JButton("Eric");
JButton b2 = new JButton("Jeltsch");
public tuBoton() {
super("Super Botn");
//escuchadores de eventos de accin a los botones
b1.addActionListener(this);
b2.addActionListener(this);
JPanel pane = new JPanel();
pane.add(b1);
pane.add(b2);
setContentPane(pane);
}
public static void main(String[] args) {
JFrame frame = new tuBoton();
WindowListener l = new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
};
frame.addWindowListener(l);
frame.pack();
frame.setVisible(true);
}
//la instrumentalizacin del evento asociado al boton.
public void actionPerformed(ActionEvent evt) {
Object fuente = evt.getSource();
if (fuente == b1)
setTitle("Eric");
else if (fuente == b2)
setTitle("Jeltsch");
repaint();
}
}
En la ejecucin Ud. podr apreciar que cada vez que pulse algunos de los botones, se le
asociar el nombre del mismo al nombre del frame.
Tras de pulsar, Eric
213
Captulo 8: Swing
El mtodo getSource() del objeto evt se usa para determinar la fuente del evento, el que
procede a llamar a repaint() para dibujar nuevamente el marco. Otro mtodo que sirve es
getActionCommand() en el objeto ActionEvent. Si en el ejemplo anterior, reemplaza
setTitle("Eric"); por System.exit(0); notara que al pulsar Eric la aplicacin se cierra.
Si en el ejemplo anterior, reemplaza la siguiente declaracin
JOptionPane.showMessageDialog(null,"Ud.presiono:"+ evt.getActionCommand());
por setTitle("Eric"); obtendr el siguiente mensaje
Otra aplicacin asociada a pintar el panel de algn color de su preferencia, luego de pulsado el
boton correspondiente, se puede apreciar en el ejemplo siguiente.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class ButtonPanel extends JPanel implements ActionListener {
public ButtonPanel() {
amaButton = new JButton("Amarillo");
azulButton = new JButton("Azul");
rojoButton = new JButton("Rojo");
add(amaButton);
add(azulButton);
add(rojoButton);
amaButton.addActionListener(this);
azulButton.addActionListener(this);
rojoButton.addActionListener(this);
}
public void actionPerformed(ActionEvent evt)
{ Object source = evt.getSource();
Color color = getBackground();
if (source == amaButton) color = Color.yellow;
Ingeniera en Computacin, Universidad de La Seren
214
Captulo 8: Swing
Como ya hemos adelantado, con los mtodos existen una serie de eventos entre ellos: Eventos
de Accin, Eventos de Ajuste, Eventos de Enfoque, Eventos de Elemento, Eventos de
Tecla, Eventos de Ratn, Eventos de Movimiento de Ratn, Eventos de Ventana, los
cuales no son excluyentes, es decir existen Eventos que pueden ser de Accin como de
Elemento al mismo tiempo. Veremos a continuacin algunos de ellos.
Eventos de Accin: Estos eventos ocurren cuando un usuario termina una accin por medio
de uno de los siguientes componentes(JButton, JCheckBox, JComboBox, JTextField,
JRadioButton). Para poder manejar estos eventos, se tiene que implementar la interfaz
ActionListener, que por lo general la hemos declarado en ya sea de una clase
TextFieldTrato o CheckBoxTrato, que estn asociados a como tratar los eventos. Adems
se debe llamar al mtodo addActionListener() de cada componente que genere un evento
de accin, a no ser que quiera ignorar los eventos de accin de ese componente.
215
Captulo 8: Swing
JTextField y JPasswordField
Ejemplo.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TextFieldDemo extends JFrame {
private JTextField text1, text2, text3;
private JPasswordField password;
public TextFieldDemo() {
super( "Demo de JTextField y JPasswordField" );
Container c = getContentPane();
c.setLayout( new FlowLayout() );
// construccin de textfield de tamao fijo
text1 = new JTextField( 10 );
c.add( text1 );
// construccin de textfield con texto fijo
text2 = new JTextField( "Ingrese el texto" );
c.add( text2 );
// construccin de textfield con texto fijo de 20
//elementos visibles y ningn evento a la vista.
text3 = new JTextField( "text field no editable", 20 );
text3.setEditable( false );
c.add( text3 );
// construccin de textfield texto fijo
password = new JPasswordField( "Texto Oculto" );
c.add( password );
TextFieldTrato tra = new TextFieldTrato();
text1.addActionListener( tra );
text2.addActionListener( tra );
text3.addActionListener( tra );
password.addActionListener( tra );
setSize( 325, 100 );
show();
}
public static void main( String args[] )
{
TextFieldDemo app = new TextFieldDemo();
app.addWindowListener(
new WindowAdapter() {
public void windowClosing( WindowEvent e )
{
System.exit( 0 );
}
}
);
}
// clase interna para tratar los eventos
private class TextFieldTrato implements ActionListener {
Ingeniera en Computacin, Universidad de La Seren
216
Captulo 8: Swing
{
if ( e.getSource() == text1 )
s = "text1: " + e.getActionCommand();
else if ( e.getSource() == text2 )
s = "text2: " + e.getActionCommand();
else if ( e.getSource() == text3 )
s = "text3: " + e.getActionCommand();
else if ( e.getSource() == password ) {
JPasswordField pwd =
(JPasswordField) e.getSource();
s = "password: " +
new String( pwd.getPassword() );
}
JOptionPane.showMessageDialog( null, s );
}
}
}
JCheckBox
Ejemplo.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class CheckBoxDemo extends JFrame {
private JTextField t;
private JCheckBox bold, italic;
public CheckBoxDemo() {
super( "JCheckBox Demo" );
Container c = getContentPane();
c.setLayout(new FlowLayout());
t = new JTextField( "Mire el cambio de estilo", 20 );
t.setFont( new Font( "TimesRoman", Font.PLAIN, 14 ) );
c.add( t );
// crea objeto checkbox
bold = new JCheckBox( "Bold" );
c.add( bold );
italic = new JCheckBox( "Italic" );
c.add( italic );
CheckBoxTrato tra = new CheckBoxTrato();
bold.addItemListener( tra );
italic.addItemListener( tra );
setSize( 275, 100 );
show();
}
Ingeniera en Computacin, Universidad de La Seren
217
Captulo 8: Swing
Este ejemplo tambin se considera tambin como Evento de Elemento, pues este tipo de
eventos suceden cuando se selecciona o no un elemento en cualquiera de los siguientes
componentes JButton, JCheckBox, JComboBox, JTextField, JRadioButton. La
diferencia radica en que para poder manejar estos eventos se tiene que implementar la interfaz
ItemListener desde una clase, tal como se hizo en el ejemplo recin visto. La interfaz
ItemListener tiene un solo mtodo llamado itemStateChanged() y para determinar el
elemento en el que ocurri el evento se debe llamar al mtodo getItem() en el objeto
ItemEvent, tambin puede usar el mtodo getStateChange().
Eventos de Ajuste
Los eventos de ajuste se dan cuando se mueve un componente JScrollBar por medio de las
flechas de la barra, el cuadro de desplazamiento o haciando click en cualquier parte de la
barra. Para manejar estos eventos, una clase debe implementar la interfaz
Ingeniera en Computacin, Universidad de La Seren
218
Captulo 8: Swing
AdjustmentListener(),
219
Captulo 8: Swing
En setText() las comillas vacas se denomina cadena null, y estn concatenadas al entero
nuevoValor para convertir el argumento en una cadena. Como podr recordar, si concatena
una cadena con un tipo diferente, Java siempre manejar el resultado como cadena, la cadena
null es un mtodo abreviado para cuando se quiera desplegar algo que todava no es una
cadena.
220
Captulo 9:
CAPTULO 9
Swing: Eventos de Ratn y Movimientos del Ratn
Los eventos de Ratn se generan por diferentes interacciones del usuario, es decir, un click
del ratn, un ratn entrando al rea de los componentes, o saliendo del rea. Cualquier
componente puede generar estos eventos, los que se implementan desde una clase por medio
de la interfaces MouseListener, la cual tiene 5-mtodos. A saber mouseCliked(),
mouseEntered(), mouseExited(), mousePressed(), mouseReleased(). Cada uno de
ellos toma la forma, por ejemplo
public void mouseReleased(MouseEvent e) {
//..
}
Por otra parte, los eventos de movimiento de ratn, ocurren cada vez que se mueve el ratn
en un componente, y como cualquier evento necesita de un soporte, se debe entonces de
implementar la interfaces MouseMotionListener desde una clase. En esta interfaces hay 2mtodos mouseDragged() y mouseMoved(). Donde toman la forma, por ejemplo
public void mouseDragged(MouseEvent e) {
//..
}
A diferencia de las otras interfaces escuchadoras de eventos que ha manejado hasta ahora, la
interfaces MouseMotionListener no tiene mtodos propios de manera que puede utilizar los
mismos mtodos anteriores.
Ejemplo:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MouseDemo extends JFrame
implements MouseListener, MouseMotionListener {
private JLabel statusBar;
public MouseDemo() {
super( "Demo para Eventos del Mouse" );
statusBar = new JLabel();
getContentPane().add( statusBar, BorderLayout.SOUTH );
// aplicacion listener para los eventos propios del mouse.
addMouseListener( this );
addMouseMotionListener( this );
setSize( 275, 100 );
show();
Ingeniera en Computacin, Universidad de La Seren
221
Captulo 9:
}
// tratar los eventos en MouseListener.
public void mouseClicked( MouseEvent e )
{
statusBar.setText("Click en [" + e.getX() + ", " + e.getY() + "]");
}
public void mousePressed( MouseEvent e )
{
statusBar.setText("Presiono en [" + e.getX() +", " + e.getY() + "]" );
}
public void mouseReleased( MouseEvent e )
{
statusBar.setText( "Soltado en [" + e.getX() + ", " + e.getY() + "]" );
}
public void mouseEntered( MouseEvent e )
{
statusBar.setText( "Mouse en window" );
}
public void mouseExited( MouseEvent e )
{
statusBar.setText( "Mouse fuera de window" );
}
// tratar los eventos de MouseMotionListener.
public void mouseDragged( MouseEvent e )
{
statusBar.setText( "Arrastrar a [" + e.getX() +", " + e.getY() + "]" );
}
public void mouseMoved( MouseEvent e )
{
statusBar.setText( "Movido a [" + e.getX() + ", " + e.getY() + "]" );
}
public static void main( String args[] )
{
MouseDemo app = new MouseDemo();
app.addWindowListener(
new WindowAdapter() {
public void windowClosing( WindowEvent e )
{
System.exit( 0 );
}
}
);
}
}
222
Captulo 9:
Notar que:
statusBar = new JLabel();
getContentPane().add( statusBar, BorderLayout.SOUTH );
223
Captulo 9:
}
}
*
Utilizar esta misma idea para detectar cuando se ha pulsado el botn izquierdo , derecho o centro. Los mtodos
asociados al evento son isMetaDown() y isAltDown().
Eventos de Tecla
Los eventos de tecla ocurren cuando se presiona una tecla sobre el teclado. Cualquier
componente puede generar estos eventos, y para dar soporte a los eventos, se tiene que
implementar la interfaces KeyListener desde una clase. En la interfaces KeyListener hay tres
eventos: keyPressed(), keyReleased() y keyTyped() que toman la forma usual, por ejemplo
public void keyReleased(keyEvent evt)
{
//...
}
224
Captulo 9:
Eventos de Ventana
Los eventos de Ventana suceden cuando un usuario abre o cierra un objeto de Ventana tal
como un JFrame o JWindow. Cualquier componente puede generar estos eventos y se tiene que
implementar la interfaces WindowListener, desde una clase, para dar soporte a los eventos.
Existen 7-mtodos en esta interfaces. A saber, windowActivated(), windowClosed(), windowClosing(),
windowDeactivated(), windowDeiconified(), windowIconified(), windowOpened(), los que toman la forma
por ejemplo,
225
Captulo 9:
Los mtodos windowClosing(), windowClosed() son semejantes, pero se llama uno al cerrar la
Ventana, y al otro una vez cerrada. De hecho para detener el cierre de una Ventana puede
utilizar un mtodo windowClosing().
LAYOUT MANAGERS
Por lo general los Layout Managers estn considerados para arreglar componentes GUI desde
el punto de vista diseo, es decir ofrece herramientas o capacidades que son de uso para
determinar la posicin exacta y tamao de todo componente GUI. Algunos de los ms bsicos
son FlowLayout, BorderLayout y GridLayout, pero hay otros como ya se menciono en Cap. 8.
FlowLayout situa los elementos en forma secuencial de izquierda a derecha, en el orden que
ellos fueron agregados.
BorderLayout dispone los componentes en cinco reas: Norte, Sur, Este, Oeste y Centro.
GridLayout dispone los componentes en filas y columnas.
En el siguiente ejemplo mostraremos la disposicin de 3- objetos botones tras la aplicacin de
FlowLayout. Cada boton tiene un evento propio que es definido al interior de la clase que
implementa ActionListener. La estructura es muy simple, se definen los botones y seteamos el
label asociado a cada uno de ellos,
izq = new JButton( "Izq" );
centro = new JButton( "Centro" );
der = new JButton( "Der" );
luego agregamos o incrustamos al panel o contenedor c a cada uno de ellos, por ejemplo,
c.add( izq );
Ejemplo:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
226
Captulo 9:
227
Captulo 9:
}
public static void main( String args[] ) {
FlowLayoutDemo app = new FlowLayoutDemo();
app.addWindowListener(
new WindowAdapter() {
public void windowClosing( WindowEvent e ) {
System.exit( 0 );
}
}
);
}
}
BorderLayout dispone los componentes en cinco reas: Norte, Sur, Este, Oeste y Centro.
Ejemplo:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class BorderLayoutDemo extends JFrame
implements ActionListener {
private JButton b[];
private String nombres[] =
{ "Norte", " Sur", "Este",
" Oeste", " Centro" };
private BorderLayout layout;
public BorderLayoutDemo()
{
super( "Demo para BorderLayout" );
//especifica el nmero de pixeles de distancia entre los //componentes
layout = new BorderLayout( 5, 5 );
Container c = getContentPane();
c.setLayout( layout );
// instancia para objeto JButton
b = new JButton[ nombres.length ];
for ( int i = 0; i < nombres.length; i++ ) {
b[ i ] = new JButton( nombres[ i ] );
b[ i ].addActionListener( this );
}
// orden no interesa, pero notar la forma de accesar al //contenedor c
c.add( b[ 0 ], BorderLayout.NORTH );
// North posiciones
c.add( b[ 1 ], BorderLayout.SOUTH ); // South "
c.add( b[ 2 ], BorderLayout.EAST ); // East "
c.add( b[ 3 ], BorderLayout.WEST ); // West "
c.add( b[ 4 ], BorderLayout.CENTER ); // Center "
setSize( 300, 200 );
show();
}
Ingeniera en Computacin, Universidad de La Seren
228
Captulo 9:
229
Captulo 9:
Panel
Complejos GUI requieren que cada componente sea situado en una posicin determinada, esto
a manudo se soluciona disponiendo de un layout especfico con mltiples paneles. Los paneles
son creados con JPanel que es una subclase de JComponent. Por otra parte notar que la clase
JComponent hereda la clase java.awt.Container, de manera que JPanel es un Container para todos los
efectos, es decir puede tener componentes incluyendo otros paneles, accesados a ellos. En el
siguiente ejemplo se define un objeto botonPanel de JPanel que setea un GridLayout de una fila y
cinco columnas, notar que los botones estn situados al sur del mundo. JPanel se adecua a las
componentes, redimensione el window para ver como el layout manager afecta afecta al
tamao de JButton, por ejemplo.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
230
Captulo 9:
231
Captulo 10:
C A P I T U L O 10
GUI Avanzado (con Swing)
En las lecturas 7-8-9 se entregaron los pasos preliminares para entender la filosofa que estaba
detrs de las apariencias grficas en el diseo de una interfaz de usuario. Convengamos en que
el proceso de generar una interfaz de usuario, se puede realizar con herramientas de
java.awt.* o de javax.swing.*. Para tal efecto, veamos la relacin entre las clases que lo
componen, para formarse una idea de su interrelacin entre las clases.
Un JFrame est subdividido en varios paneles diferentes, el panel principal con el que trabaja
es el panel de contenido, que representa toda el rea de un marco al que se pueden agregar
componentes. Para agregar componentes debemos hacer lo siguiente:
Complejos GUI requieren que cada componente sea situado en una posicin determinada, esto
a menudo se soluciona disponiendo de un layout especfico con mltiples paneles. Los paneles
son creados con JPanel que es una subclase de JComponent. Por otra parte notar que la clase
JComponent hereda la clase java.awt.Container, de manera que JPanel es un Container para todos los
Ingeniera en Computacin, Universidad de La Seren
232
Captulo 10:
efectos, es decir puede tener componentes incluyendo otros paneles, accesados a ellos. En el
siguiente ejemplo se define un objeto botonPanel de JPanel que declara un GridLayout de una fila y
cinco columnas, notar que los botones estn situados al sur del mundo. JPanel adecua a las
componentes, redimensionando el window para ver como el layout manager afecta al tamao
de JButton. Una forma tpica de incorporar botones en un JPanel es como sigue.
Container contenidoPanel= getContentPane();
JPanel miPanel= new JPanel();
miPanel.add(Boton_Amarillo);
miPanel.add(Boton_Verde);
miPanel.add(Boton_Azul);
contenidoPanel.add(miPanel, South)
La idea ahora es incorporarle otras cualidades sobre el panel, que actua como pizarra para
cuando Ud. gatille un evento al presionar algn botn. En el ejemplo siguiente consideramos
una estructura de manera que al presionar un botn rotulado genere una figura geomtrica tan
sofisticada como nosotros queramos, es decir, crearemos una subclase de JPanel.En general la
idea es usar JPanel como una pizarra, es decir un rea dedicada para dibujar, la que puede
recibir eventos del mouse y a menudo extenderla para crear nuevos componentes. La idea es
evitar o entregar otra alternativa en la situacin de combinar componentes Swing GUI y el
pintado sobre una misma ventana o applet, que usualmente genera conflictos en el despliegue
de la figura. Entonces con la creacin de esta subclase de JPanel podremos incrustar figuras que
en el despliegue de la ventana no se van a entorpecer. Una estructura de este tipo de pizarra
debera usar el mtodo paintComponent().Se visualiza as:
public void paintComponent(Graphics g)
{ super.paintComponent(g);
// su cdigo de pintado ad-doc
}
233
paintComponent(). De
utiliza repaint().
import java.awt.*;
import javax.swing.*;
Captulo 10:
234
Captulo 10:
{
miPanel.draw( Pizarra.CUADRADO );
}
}
);
circulo = new JButton( "Circulo" );
circulo.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e )
{
miPanel.draw( Pizarra.CIRCULO );
}
}
);
buttonPanel = new JPanel();
buttonPanel.setLayout( new GridLayout( 1, 2 ) );
buttonPanel.add( circulo );
buttonPanel.add( cuadrado );
Container c = getContentPane();
c.add( miPanel, BorderLayout.CENTER );
c.add( buttonPanel, BorderLayout.SOUTH );
setSize( 300, 150 );
show();
}
public static void main( String args[] ) {
PizarraTest app = new PizarraTest();
app.addWindowListener(
new WindowAdapter() {
public void windowClosing( WindowEvent e )
{
System.exit( 0 );
}
}
);
}
}
235
Captulo 10:
En Swing el rea de texto no tiene una barra de desplazamiento(scrollbar), sin embargo eso no
es dificultoso, basta insertar miAreadeTexto dentro del panel asociado a la barra llamado
ScrollPane. Esta API se encuentra en javax.swing.JScrollPane.
miAreadeTexto=new JTexArea(8, 40);
JScrollPane miscrollPane= new JScrollPane(miAreadeTexto);
getContentPane().add(miAreadeTexto);
Ejemplo
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class TextAreaFrame extends JFrame implements ActionListener {
public TextAreaFrame() {
JPanel p = new JPanel();
botonInsercion = new JButton("Insercion");
Ingeniera en Computacin, Universidad de La Seren
236
Captulo 10:
p.add(botonInsercion);
botonInsercion.addActionListener(this);
botonToken = new JButton("Token");
p.add(botonToken);
botonToken.addActionListener(this);
botonNoToken = new JButton("No Token");
p.add(botonNoToken);
botonNoToken.addActionListener(this);
getContentPane().add(p, "South");
miTextArea = new JTextArea(8, 40);
miScrollPane = new JScrollPane(miTextArea);
getContentPane().add(miScrollPane, "Center");
setTitle("TextArea Demo");
setSize(300, 300);
addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent e)
{ System.exit(0);
}
} );
}
public void actionPerformed(ActionEvent evt) {
Object fuente = evt.getSource();
if (fuente == botonInsercion)
//void append(String nuevoText), pega el texto ingresado al
//final del texto real en el rea de texto.
miTextArea.append("Hola amigos, nos vemos!!. ");
else if (fuente == botonToken)
//void setLineWrap(boolean b), tokenizador si es true.
{ miTextArea.setLineWrap(true);
//validate() recomputa el tamao y el Layout de sus
//componentes en un Container
miScrollPane.validate();
}
else if (fuente == botonNoToken)
{ miTextArea.setLineWrap(false);
miScrollPane.validate();
}
}
//declaracin obligada, en caso contrario no reconoce las
//variables .
private JButton botonInsercion;
private JButton botonToken;
private JButton botonNoToken;
private JTextArea miTextArea;
private JScrollPane miScrollPane;
}
public class TextAreaTest {
public static void main(String[] args)
{ JFrame f = new TextAreaFrame();
Ingeniera en Computacin, Universidad de La Seren
237
Captulo 10:
f.show();
}
}
Ejemplo
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class TextEditFrame extends JFrame{
public TextEditFrame() {
setTitle("TextEditTest");
setSize(400, 400);
addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent e)
{ System.exit(0);
}
} );
Container contPanel = getContentPane();
JPanel miPanel = new JPanel();
JButton botonReemplazo = new JButton("Reemplazo");
miPanel.add(botonReemplazo);
botonReemplazo.addActionListener(new ActionListener()
{ public void actionPerformed(ActionEvent evt)
{ String f = desde.getText();
int n = miTextArea.getText().indexOf(f);
Ingeniera en Computacin, Universidad de La Seren
238
Captulo 10:
Border
Sobre el panel es posible de incorporar una forma de bordes, lo que hace, que la distribucin
del panel o las secciones del mismo sean delimitadas. Swing ofrece una herramienta llamada
border para este propsito. Ud. lo encuentra en java.awt.swing.border que proporciona la
interfaces Border . Ahora veremos algunos usos comunes para esta herramienta, llamando al
mtodo static BorderFactory(). Existe una variedad de formas y estilos, algunos de ellos son:
Lowered bevel, Raised bevel, Etched, Line, Matte y Empty(que es para crear un espacio en blanco
alrededor del componente.) Una estructura tpica de declaracin de cmo agregar un borde
etched con un titulo al panel es:
Border etched = BorderFactory.createEtchedBorder();
Border titulo=BorderFactory.createTitledBorder(etched,mi Titulo);
MiPanel = setBorder(titulo);
Ingeniera en Computacin, Universidad de La Seren
239
Captulo 10:
Ejemplo
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
class BorderFrame extends JFrame implements ActionListener{
public BorderFrame() {
JPanel botonesPanel = new JPanel();
grupo = new ButtonGroup();
addRadioButton(botonesPanel, grupo, "Lowered bevel", true);
addRadioButton(botonesPanel, grupo, "Raised bevel", false);
addRadioButton(botonesPanel, grupo, "Etched", false);
addRadioButton(botonesPanel, grupo, "Line", false);
addRadioButton(botonesPanel, grupo, "Matte", false);
addRadioButton(botonesPanel, grupo, "Empty", false);
Border etched = BorderFactory.createEtchedBorder();
Border titulo = BorderFactory.createTitledBorder(etched,"Tipos de Borde");
botonesPanel.setBorder(titulo);
getContentPane().add(botonesPanel, "South");
setDemoPanel();
setTitle("Demo para Bordes");
setSize(600, 200);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
} );
}
public void addRadioButton(JPanel botonesPanel,
ButtonGroup g, String botonNombre, boolean v)
{JRadioButton button = new JRadioButton(botonNombre, v);
button.addActionListener(this);
g.add(button);
botonesPanel.add(button);
button.setActionCommand(botonNombre);
}
public void actionPerformed(ActionEvent evt) {
setDemoPanel();
}
public void setDemoPanel() {
JPanel miPanel = new JPanel();
Border bordes = null;
String comando = grupo.getSelection().getActionCommand();
if (comando.equals("Lowered bevel"))
bordes = BorderFactory.createLoweredBevelBorder();
else if (comando.equals("Raised bevel"))
bordes = BorderFactory.createRaisedBevelBorder();
else if (comando.equals("Etched"))
bordes = BorderFactory.createEtchedBorder();
else if (comando.equals("Line"))
bordes
= BorderFactory.createLineBorder(Color.blue);
else if (comando.equals("Matte"))
bordes = BorderFactory.createMatteBorder(10, 10,
10, 10, Color.blue);
else if (comando.equals("Empty"))
bordes = BorderFactory.createEmptyBorder();
miPanel.setBorder(bordes);
Ingeniera en Computacin, Universidad de La Seren
240
Captulo 10:
getContentPane().add(miPanel, "Center");
validate();
}
private JPanel miPanel;
private ButtonGroup grupo;
}
public class BorderTest
{ public static void main(String[] args)
{ JFrame frame = new BorderFrame();
frame.show();
}
}
241
Captulo 10:
242
Captulo 10:
243
Captulo 10:
void setEditable(boolean b)
void setText(String t)
class JTextField
constantes: LEFT, CENTER, RIGHT
constructores:
JTextField()
JTextField(int columns)
JTextField(String text)
JTextField(String text, int columns)
void setHorizontalAlignment(int alinear)
interface LayoutManager
metodos para usar internamente para cuando se implementan layout managers
class Window
void addWindowListener(WindowListener l)
void pack()
244
Captulo 11:
C A P T U L O 11
GUI Avanzado (con Swing)
En las lecturas 7-8-9-10, se entregaron los pasos preliminares para entender la filosofa que
estaba detrs de las apariencias grficas en el diseo de una interfaz de usuario. Convengamos
en que el proceso de generar una interfaz de usuario, se puede realizar con herramientas de
java.awt.* o de javax.swing.*. Para tal efecto, veamos la relacin entre las clases que lo
componen, para formarse una idea de su interrelacin entre las clases. No obstante se trabaja
con javax.swing, por una serie de ventajas que esta ofrece.
Menu
Una observacin importante es que la clase JFrame ampla la clase Frame de AWT, de manera
que JFrame, JWindow y JDialog difieren de sus homlogos del AWT en que utilizan un panel de
contenido separado para agregar y disear componentes GUI, este panel es un objeto Container
al que se accede a travs del mtodo getContentPane(), mtodo que lo hemos visto en accin en
varios ejemplos hasta ahora. Los mens de Swing, al igual que las ventanas de Swing, son
anlogos a los AWT la diferencia fundamental es que las clases JMenuBar, JMenu, JMenuItem,
JCheckBoxMenuItem y JRadioButtonMenuItem son todas ellas subclases de JComponent y por tanto de
la clase Component, esto significa que los mens de Swing constituyen componentes que se
pueden usar por cualquiera de las clases Container. Otra caracterstica interesante de los mens
Ingeniera en Computacin, Universidad de La Seren
245
Captulo 11:
La barra de menu que podemos apreciar contiene una variedad de menus, la que se encuentra
al tope de la pantalla en Windows. Toda barra de menu tiene uno o ms menus, organizados
por tpicos, en donde los archivos en este caso son: Archivo, Editar, Otro, etc. Por otra parte,
al interior de cada uno de los menu se realizan acciones individuales tales como: Abrir,
Imprimir, Cortar y Copiar, los que son mostrados para cuando Ud. activa el menu apropiado.
En este caso se aprecia un SubMenu, Chequear, Radio1, Radio2 y Planta, la que a su vez
tiene incorporado un archivo .gif para hacerlo ms didctico. Estas son algunas de las ventajas
que ofrece Swing para trabajar con Menu, situacin ltima que en AWT no es factible, no
obstante, se puede trabajar de la misma manera en AWT, salvo restricciones, como las que se
han comentado. Ya en la version Java 1.1 fue AWT totalmente elaborada incluyendo los
(event handling,). JDK-Version 1.1 fue una segunda Biblioteca para programar interfaces
grficas presentada como: SWING. La que se realiza sobre AWT
Para usar menus en su aplicacin Ud. necesita agregar las instancias de las tres clases, una
para MenuBar con uno o ms Menus, todos con varios MenuItems.
Ingeniera en Computacin, Universidad de La Seren
246
Captulo 11:
247
Captulo 11:
Dentro de un MenuBar pueden ser organizados muchos MenuItem. Cada objeto Menu
corresponde a la clase Menu de AWT. Por ejemplo, aqu se describe un sistema, del cual se
puede apreciar como se correlacionan las actividades con las clases respectivas.
MenuBar
Menu
Hola
Window
Diga Hola
MenuItem
Help
Mover
instance Of
Menu
MenuItem
abajo
Luz(on/off)
CheckboxMenuItem
Creando Menus
Es fcil construir un menu, el orden tpico es
1.Crear un nuevo MenuBar.
2.Crear un nuevo Menu.
3.Agregar items al Menu.
4.Si es necesario repita etapas 2 y 3.
5.Agregar el MenuBar al Frame.
Los constructores que Ud. necesita son muy simples. Por ejemplo, para crear un objeto nuevo
MenuBar, basta con declarar:
MenuBar miMenubar = new MenuBar();
Para crear un nuevo Menu use el constructor Menu(String titulo). Pasando el titulo al
menu que Ud, desee. Por ejemplo, para crear los menus Archivo y Editar, basta con declarar,
Menu miArchivoMenu = new Menu("Archivo");
Menu miEditarMenu = new Menu("Editar");
Ingeniera en Computacin, Universidad de La Seren
248
Captulo 11:
MenuItems
Tambin puede crear MenuItems al interior de los menus, por ejemplo: Cortar, Copiar, Pegar,
Limpiar y seleccionar todos los MenuItems:
Menu editMenu = new Menu("Edit");
editMenu.add(new MenuItem("Cortar"));
editMenu.add(new MenuItem("Copiar"));
editMenu.add(new MenuItem("Pegar"));
editMenu.add(new MenuItem("Limpiar"));
editMenu.addSeparator();
editMenu.add(new MenuItem("Seleccionar Todos"));
El mtodo addSeparator() agrega una lnea horizontal al menu. Esto es usado para separar
logicamente las funciones del menu. Luego podr incorporar al Menu, las barras del Menu
usando MenuBares(Menu m), por ejemplo,:
miMenubar.add(ArchivoMenu);
miMenubar.add(EditarMenu);
Finalmente, para cuando la barra de menu estime que esta copada, se procede a incorporarla al
Frame usando el mtodo frame setMenuBar(MenuBar mb).
Dado un Frame f , este es un ejemplo: f.setMenuBar(miMenuBar);
Ejemplos
import java.awt.Frame;
public class AWT_Ej1 {
public static void main(String[] args) {
Frame wnd = new Frame("Simple Ventana");
wnd.setSize(400,300);
wnd.setVisible(true);
} //end main()
} //class AWT_Ej1, genera una ventana simple sin la posibilidad de cerrar.
import
import
import
import
java.awt.Frame;
java.awt.Window;
java.awt.event.WindowAdapter;
java.awt.event.WindowEvent;
249
Captulo 11:
El efecto de seleccionar un men, significa que se gatilla una accin representada por los
eventos, por eso que se necesita instalar un escuchador o listener para cada men items. Algo
parecido a, ArchivoNew.addActionListener(this), si Ud. se da cuenta esta forma de construccin
para cuando se tienen varios mens y submens es muy tedioso, de ah que es recomendable
Ingeniera en Computacin, Universidad de La Seren
250
Captulo 11:
usar un procedimiento que lo realice. Nosotros mostramos dos modalidades. En este ejemplo
se muestra la primera modalidad en donde se realiza:
Ejemplo:
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class MenuTest extends JFrame {
private Color colorValor[]={Color.black,Color.blue,Color.red,Color.green};
private JRadioButtonMenuItem colorItems[], fonts[];
private JCheckBoxMenuItem estiloItems[];
private JLabel desplegar;
private ButtonGroup miFontGroup, miColorGroup;
private int estilo;
public MenuTest() {
super( "Usando JMenus" );
JMenuBar miBar = new JMenuBar(); // crea menubar
setJMenuBar( miBar );// setea el menubar para JFrame
// crea los archivos del Menu , entre ellos Sobre y
//Exit como menu item
JMenu miFileMenu = new JMenu( "Archivo" );
JMenuItem sobreItem = new JMenuItem( "Sobre..." );
sobreItem.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e )
{
JOptionPane.showMessageDialog( MenuTest.this,
"Este es un ejemplo\nde usos de menus",
"Sobre", JOptionPane.PLAIN_MESSAGE );
}
}
);
miFileMenu.add( sobreItem );
JMenuItem exitItem = new JMenuItem( "Exit" );
exitItem.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e )
{
Ingeniera en Computacin, Universidad de La Seren
251
Captulo 11:
System.exit( 0 );
}
}
);
miFileMenu.add( exitItem );
miBar.add( miFileMenu ); // los agrega al File menu
// crea el otro segmento de menu, y sus submenus como menu
//items.
JMenu formatMenu = new JMenu( "Formato" );
// crea Color como submenu, inicializando colores.
String colores[] = { "Black", "Blue", "Red", "Green" };
JMenu colorMenu = new JMenu( "Color" );
colorItems = new JRadioButtonMenuItem[ colores.length ];
miColorGroup = new ButtonGroup();
ItemTrato itemTrato = new ItemTrato();
for ( int i = 0; i < colores.length; i++ ) {
colorItems[ i ] = new JRadioButtonMenuItem( colores[ i ] );
colorMenu.add( colorItems[ i ] );
miColorGroup.add( colorItems[ i ] );
colorItems[ i ].addActionListener( itemTrato );
}
colorItems[ 0 ].setSelected( true );
formatMenu.add( colorMenu );
formatMenu.addSeparator();
// crea Font como submenu, inicializando fuentes.
String fontNombres[] = { "TimesRoman", "Courier", "Helvetica" };
JMenu fontMenu = new JMenu( "Fuentes" );
fonts = new JRadioButtonMenuItem[ fontNombres.length ];
miFontGroup = new ButtonGroup();
for ( int i = 0; i < fonts.length; i++ ) {
fonts[ i ] = new JRadioButtonMenuItem( fontNombres[ i ] );
fontMenu.add( fonts[ i ] );
miFontGroup.add( fonts[ i ] );
fonts[ i ].addActionListener( itemTrato );
}
fonts[ 0 ].setSelected( true );
fontMenu.addSeparator();
String estiloNombres[] = { "Bold", "Italic" };
estiloItems = new JCheckBoxMenuItem[ estiloNombres.length ];
EstiloTrato estiloTrato = new EstiloTrato();
for ( int i = 0; i < estiloNombres.length; i++ ) {
estiloItems[ i ] = new JCheckBoxMenuItem( estiloNombres[ i ] );
fontMenu.add( estiloItems[ i ] );
estiloItems[ i ].addItemListener( estiloTrato );
}
formatMenu.add( fontMenu );
miBar.add( formatMenu ); // agrega formato al menu
Ingeniera en Computacin, Universidad de La Seren
252
Captulo 11:
253
Captulo 11:
repaint();
}
}
}
Como otra forma de construir mens he considerado, setupEventos(), que es una estructura en
donde depsito todos los eventos, tal como se muestran en el siguiente ejemplo. Existe otra
forma, ms elegante en el texto de Core Java2 de Hortsmann, pg 489, de cmo organizar los
mens y submens.
Ejemplo
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class SwingWin extends JFrame {
public static int WIDTH = 300;
public static int HEIGHT = 300;
public static String TITULO = "SwingWin";
Container miframeContainer;
// Swing componentes
JTextField miTextField = new JTextField(50);
JMenuBar miMenuBar = new JMenuBar();
Ingeniera en Computacin, Universidad de La Seren
254
Captulo 11:
255
Captulo 11:
void setupEventos() {
addWindowListener(new WindowTrato());
archivoNew.addActionListener(new MenuItemTrato());
archivoOpen.addActionListener(new MenuItemTrato());
archivoSave.addActionListener(new MenuItemTrato());
archivoExit.addActionListener(new MenuItemTrato());
editarCut.addActionListener(new MenuItemTrato());
editarCopy.addActionListener(new MenuItemTrato());
editarPaste.addActionListener(new MenuItemTrato());
especialCheck1.addItemListener(new ItemTrato());
especialCheck2.addItemListener(new ItemTrato());
especialRadio1.addItemListener(new ItemTrato());
especialRadio2.addItemListener(new ItemTrato());
}
public static void main(String[] args) {
SwingWin app = new SwingWin();
}
public class WindowTrato extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
public class MenuItemTrato implements ActionListener {
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
if(cmd.equals("Exit")) System.exit(0);
else miTextField.setText(cmd);
}
}
public class ItemTrato implements ItemListener {
public void itemStateChanged(ItemEvent e) {
AbstractButton boton = (AbstractButton) e.getItem();
String miLabel = boton.getText();
if(boton.isSelected()) miLabel += " true";
else miLabel += " false";
miTextField.setText(miLabel);
}
}
}
256
Captulo 11:
Como ya lo han visto Swing puede considerar label como rotulos en los mens, pero esto no
es todo pues tambin considera iconos o ambos, basta con declarar una expresin del tipo,
JMenuItem editarItem = new JMenuItem(Cut, new ImageIcon(cut.gif)); otras interfaces posibles de
generar son
257
Captulo 11:
258
Captulo 11:
item.addActionListener(this);
subMenu.add(item = new JMenuItem("Extra 1"));
item.addActionListener(this);
subMenu.add(subMenu2);
// Ensamblar Otro Menu en si mismo
otroMenu.add(subMenu);
otroMenu.add(item = new JCheckBoxMenuItem("Chequear"));
item.addActionListener(this);
otroMenu.addSeparator();
ButtonGroup buttonGroup = new ButtonGroup();
otroMenu.add(item = new JRadioButtonMenuItem("Radio 1"));
item.addActionListener(this);
buttonGroup.add(item);
otroMenu.add(item = new JRadioButtonMenuItem("Radio 2"));
item.addActionListener(this);
buttonGroup.add(item);
otroMenu.addSeparator();
otroMenu.add(item = new JMenuItem("Planta",
new ImageIcon("image.gif")));
item.addActionListener(this);
// Finalmente agrega todos los mens al menubar
add(archivoMenu);
add(editarMenu);
add(otroMenu);
}
public void actionPerformed(ActionEvent event) {
System.out.println("Menu item [" + event.getActionCommand() +
"] fue presionado.");
}
public static void main(String s[]) {
JFrame frame = new JFrame("Un Simple Menu");
//frame.addWindowListener(new BasicWindowMonitor());
frame.setJMenuBar(new miMenuSimple());
frame.pack();
frame.setVisible(true);
}
}
Para concluir al menos en esta parte les mostrare el ltimo ejemplo en el mismo contexto de lo
tratado hasta ahora, la nica novedad es la herramienta llamada Look andFeel, que es capaz de
simular interfaces de Motif, Windows que son interfaces grficas de sistemas propietarios.
Al archivo le he llamado SwingLF.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;
import com.sun.java.swing.plaf.motif.*;
import javax.swing.plaf.metal.*;
import com.sun.java.swing.plaf.windows.*;
public class SwingLF extends JFrame {
public static int WIDTH = 450;
public static int HEIGHT = 450;
Ingeniera en Computacin, Universidad de La Seren
259
Captulo 11:
260
Captulo 11:
editarMenu.add(editarCortar);
editarMenu.add(editarCopiar);
editarMenu.add(editarPegar);
miMenuBar.add(editarMenu);
setJMenuBar(miMenuBar);
}
public void layoutComponentes() {
for(int i=0;i<paneles.length;++i)
paneles[i] = new JPanel();
paneles[0].setBorder(new TitledBorder("Checkboxes"));
paneles[0].setLayout(new GridLayout(3,1));
paneles[0].add(checkbox1);
paneles[0].add(checkbox2);
paneles[0].add(checkbox3);
paneles[1].setBorder(new TitledBorder("Radio Buttons"));
paneles[1].setLayout(new GridLayout(3,1));
paneles[1].add(radioButton1);
paneles[1].add(radioButton2);
paneles[1].add(radioButton3);
paneles[2].setBorder(new TitledBorder("Text Fields"));
paneles[2].add(textField1);
paneles[2].add(textField2);
paneles[3].setBorder(new TitledBorder("Sliders"));
paneles[3].add(slider1);
paneles[3].add(slider2);
paneles[4].setLayout(new GridLayout(3,1));
paneles[4].add(metalButton);
paneles[4].add(motifButton);
paneles[4].add(windowsButton);
miframeContainer = getContentPane();
miframeContainer.setLayout(new GridLayout(3,2)); for(inti=0;i<paneles.length;++i) miframeContainer.add(paneles[i]);
}
void setupEventos() {
addWindowListener(new WindowTrato());
archivoSalir.addActionListener(new MenuItemTrato());
metalButton.addActionListener(new ButtonTrato());
motifButton.addActionListener(new ButtonTrato());
windowsButton.addActionListener(new ButtonTrato());
}
public static void main(String[] args) {
SwingLF app = new SwingLF();
}
public class WindowTrato extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
public class MenuItemTrato implements ActionListener {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
}
public class ButtonTrato implements ActionListener {
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
if(cmd.equals("Motif")) {
try {
Ingeniera en Computacin, Universidad de La Seren
261
Captulo 11:
UIManager.setLookAndFeel(motifLF);
SwingUtilities.updateComponentTreeUI(SwingLF.this);
}catch(Exception ex){
System.out.println(ex);
}
}else if(cmd.equals("Metal")) {
try {
UIManager.setLookAndFeel(metalLF);
SwingUtilities.updateComponentTreeUI(SwingLF.this);
}catch(Exception ex){
System.out.println(ex);
}
}else if(cmd.equals("Windows")) {
try {
UIManager.setLookAndFeel(windowsLF);
SwingUtilities.updateComponentTreeUI(SwingLF.this);
}catch(Exception ex){
System.out.println(ex);
}
}
}
}
}
262
Captulo 11:
Actividades on-line:
Qu cambios debera darle al cdigo para que la interfaz se viese as?
263
Captulo 11:
JSlider
Una declaracin ms o menos tpica de JSlider son estructuras del tipo,
JSlider miJSlider = new JSlider( SwingConstants. HORIZONTAL, 0, 200, 10);
indica que cada tick marcado representa 10 como valor en el rango de valores soportado por
JSlider,
miJSlider.setMajorTickSpacing(10);
Ejemplo
JSlider slider = new JSlider(JSlider.VERTICAL, 0, 50, 25);//10
slider.setMinorTickSpacing(4);//3
slider.setMajorTickSpacing(20);//10
slider.setPaintTicks(true);
slider.setPaintLabels(true);
slider.setLabelTable(slider.createStandardLabels(10));
add(slider, BorderLayout.CENTER);
Ingeniera en Computacin, Universidad de La Seren
264
Captulo 11:
265