0% encontró este documento útil (0 votos)
319 vistas

Manual JAVA

Este documento presenta una introducción a Java, incluyendo sus antecedentes y orígenes. Java fue creado originalmente en 1990 por James Gosling para dispositivos electrónicos, pero luego fue adaptado para la World Wide Web. El lenguaje fue diseñado para ser sencillo, fiable y capaz de ejecutarse en múltiples plataformas. Tras varios proyectos iniciales, Bill Joy promovió el uso de Java en Internet, lo que llevó a su presentación pública en 1995.

Cargado por

aegoavl
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Formatos disponibles
Descarga como DOC, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
319 vistas

Manual JAVA

Este documento presenta una introducción a Java, incluyendo sus antecedentes y orígenes. Java fue creado originalmente en 1990 por James Gosling para dispositivos electrónicos, pero luego fue adaptado para la World Wide Web. El lenguaje fue diseñado para ser sencillo, fiable y capaz de ejecutarse en múltiples plataformas. Tras varios proyectos iniciales, Bill Joy promovió el uso de Java en Internet, lo que llevó a su presentación pública en 1995.

Cargado por

aegoavl
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Formatos disponibles
Descarga como DOC, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 273

Elaborado por: Ing.

Jess Pando Barrn


Versin 1.0
Elabor: Ing. Jess Pando Barrn(Mocis)
Excelencia Tecnolgica, Fortaleza de Mxico
1
INDICE
Temas Subtemas Pgina
Introduccin 5
1. Generalidades
1.1 Antecedentes 6
1.2 Pasos para la
instalacin y
configuracin del
kit J2SE
9
2.Programacin
Orientada a Objetos
2.1 Entorno de Java 11
2.2 Tipos primitivos 13
2.3 Estructuras bsicas
de control en Java
2.3.1 Estructuras
secuenciales
16
2.3.2 Estructuras
alternativas
19
2.3.3 Estructuras
repetitivas
20
2.4 Conceptos de
Programacin Orientada
a Objetos
24
2.4.1 Una
introduccin al
alcance de datos
36
2.4.2 Manejo de
datos privados
37
2.4.3 Mtodos
constructores
38
2.4.4 Mtodos
mutadores (set) y
accesores (get)
39
2.4.5 Sobrecarga de
mtodos
41
2.4.6 Sobrecarga de
mtodos
constructores
45
2.4.7 Una
introduccin a la
palabra clave this
47
2.4.8 Control de
acceso a los
miembros de clase
51
2.4.9 Static 53
2.4.10 Paquetes 56
2.4.11 Arreglos 61
2.4.12 Herencia 72
2.4.12.1 otro punto de
vista de la herencia
74
Elabor: Ing. Jess Pando Barrn(Mocis)
2
2.4.12.2 Ejemplos de
herencia
77
2.4.12.3 Composicin 86
2.4.12.4 Herencia y
composicin
87
2.4.12.5 Clases y mtodos
abstractos
89
2.4.12.6 Interfaces 91
2.4.12.7 Simulacin de la
herencia mltiple
92
2.4.12.8 Herencia
mltiple con una clase
abstracta
93
2.4.12.9 Polimorfismo 96
2.4.12.10 Clases internas 104
3. Manejo de
excepciones
105
3.1 Ejemplos 109
4. Interfaz Grfica de
Usuario (GUI) Parte I.
AWT
117
4.1 Frames 118
4.2 Panels 122
4.3 Dialogs 124
4.4 Tipos de Layout
Managers
127
4.4.1 El
administrador
BorderLayout
127
4.4.2 El
administrador
FlowLayout
131
4.4.3 El
administrador
GridLayout
133
4.4.4 Ejemplos
varios
134
5. Manejo de eventos 139
5.1 Categoras de los
eventos
144
5.2 Clases adaptadoras 149
5.3 Manejando eventos
con una clase interna
150
5.4 Ejemplos 154
5.5 posicionamiento
absoluto
165
5.6 Checkbox 172
5.7 Choice y List 174
5.8 Componentes de
texto
178
5.9 Componentes
canvas y ScrollPane
184
5.10 Componentes 193
Elabor: Ing. Jess Pando Barrn(Mocis)
3
Menu
5.11Controlando
colores y fuentes
196
6. Interfaz Grfica de
Usuario (GUI). Parte II.
Swing
201
6.1 Campos y etiquetas 203
6.2 Botones 206
6.3 CheckBox y
RadioButton
208
6.4 JcomboBox
implementado con una
clase interna annima
212
6.5 JList 214
6.6 Eventos del mouse 218
6.7 Manejo de eventos
de teclas
224
6.8 JTextArea 226
6.9 Panel personalizado 228
6.10 Mens 230
6.11 JPopupMenu 235
6.12 Apariencia visual 238
6.13 Interfaz de
mltiples documentos
(MDI)
242
6.14 Administradores
de esquemas BoxLayout
y GridBagLayout
246
7.0 Proyecto Cliente-
Servidor
255
8.0 Bibliografa 270
Elabor: Ing. Jess Pando Barrn(Mocis)
4
INTRODUCCION
El presente manual es una recopilacin de diversas fuentes que rene los aspectos
ms relevantes del lenguaje Java que tanta inquietud ha causado entre los programadores y
tambin mucha confusin en cul es la fuente idnea para aprender dicha tecnologa, cada
libro o manual tiene su propia e interesante aportacin, lo novedoso que se presenta en esta
documentacin es que extrae lo mejor de cada fuente bibliogrfica relacionando los
contenidos con los los parmetros que establece Sun y los planes de estudio del rea de
Informtica y Sistemas. El manual es un soporte para el catedrtico y el estudiante ya que
incluye una diversidad de ejemplos por cada tema centrndose en la sencillez de los mismos
y dejando la complejidad de elementos distractores, de esta manera, los programas
desarrollados sirven como plantilla y gua para entender el concepto y que va a permitir a los
estudiantes conformar aplicaciones ms elaboradas.
Adicionalmente ofrece la facilidad de entender y desarrollar aplicaciones en el
lenguaje Java basado en la potencialidad que ofrece la Programacin Orientada a Objetos
haciendo hincapi en los aspectos primarios de un lenguaje orientado a objetos como son:
Abstraccin
Encapsulamiento
Modularidad
Jerarqua
Esta documentacin inicia con los antecedentes de Java y profundiza en los temas de
la POO, arreglos, herencia e Interfaz Grfica de Usuario para culminar con el manejo de
eventos posponiendo para una segunda entrega los temas de Redes y conectividad con bases
de datos bajo el estndar J2EE.
Elabor: Ing. Jess Pando Barrn(Mocis)
5
Java
1. Generalidades
1.1. Antecedentes
1
Java fue diseado en 1990 por James Gosling, de Sun Microsystems, como software para
dispositivos electrnicos de consumo. Curiosamente, todo este lenguaje fue diseado antes de que diese
comienzo la era World Wide Web, puesto que fue diseado para dispositivos electrnicos como calculadoras,
microondas y la televisin interactiva.
En los primeros aos de la dcada de los noventa, Sun Microsystems decidi intentar introducirse en
el mercado de la electrnica de consumo y desarrollar programas para pequeos dispositivos electrnicos.
Tras unos comienzos dudosos, Sun decidi crear una filial, denominada FirstPerson Inc., para dar margen de
maniobra al equipo responsable del proyecto.
Inicialmente Java se llam Oak (roble en ingls), aunque tuvo que cambiar de denominacin, debido a que
dicho nombre ya estaba registrado por otra empresa. Se dice que este nombre se le puso debido a la existencia
de tal rbol en los alrededores del lugar de trabajo de los promotores del lenguaje.
Tres de las principales razones que llevaron a crear Java son:
1. Creciente necesidad de interfaces mucho ms cmodas e intuitivas que los sistemas de ventanas que
proliferaban hasta el momento.
2. Fiabilidad del cdigo y facilidad de desarrollo. Gosling observ que muchas de las caractersticas
que ofrecan C o C++ aumentaban de forma alarmante el gran coste de pruebas y depuracin. Por
ello en sus ratos libres cre un lenguaje de programacin donde intentaba solucionar los fallos que
encontraba en C++.
3. Enorme diversidad de controladores electrnicos. Los dispositivos electrnicos se controlan
mediante la utilizacin de microprocesadores de bajo precio y reducidas prestaciones, que varan
cada poco tiempo y que utilizan diversos conjuntos de instrucciones. Java permite escribir un cdigo
comn para todos los dispositivos.
Por todo ello, en lugar de tratar nicamente de optimizar las tcnicas de desarrollo y dar por sentada
la utilizacin de C o C++, el equipo de Gosling se plante que tal vez los lenguajes existentes eran demasiado
complicados como para conseguir reducir de forma apreciable la complejidad de desarrollo asociada a ese
campo. Por este motivo, su primera propuesta fue idear un nuevo lenguaje de programacin lo ms sencillo
posible, con el objeto de que se pudiese adaptar con facilidad a cualquier entorno de ejecucin.
Basndose en el conocimiento y estudio de gran cantidad de lenguajes, este grupo decidi recoger las
caractersticas esenciales que deba tener un lenguaje de programacin moderno y potente, pero eliminando
todas aquellas funciones que no eran absolutamente imprescindibles.
El proyecto Green fue el primero en el que se aplic Java, y consista en un sistema de control
completo de los aparatos electrnicos y el entorno de un hogar. Con este fin se construy un ordenador
experimental denominado *7 (Star Seven). El sistema presentaba una interfaz basada en la representacin de
la casa de forma animada y el control se llevaba a cabo mediante una pantalla sensible al tacto. En el sistema
apareca ya Duke, la actual mascota de Java.
1
http://pisuerga.inf.ubu.es/lsi/Invest/Java/Tuto/I_2.htm
Elabor: Ing. Jess Pando Barrn(Mocis)
6
Ms tarde Java se aplic a otro proyecto denominado VOD (Video On Demand) en el que se
empleaba como interfaz para la televisin interactiva que se pensaba iba a ser el principal campo de
aplicacin de Java. Ninguno de estos proyectos se convirti nunca en un sistema comercial, pero fueron
desarrollados enteramente en un Java primitivo.
Una vez que en Sun se dieron cuenta de que a corto plazo la televisin interactiva no iba a ser un
gran xito, instaron a FirstPerson a desarrollar nuevas estrategias que produjeran beneficios. Entre ellas se
encontraba la aplicacin de Java a Internet, la cual no se consider productiva en ese momento.
Aunque muchas de las fuentes consultadas sealan que Java no lleg a caer en un olvido, lo cierto es
que tuvo que ser Bill Joy (cofundador de Sun y uno de los desarrolladores principales del sistema operativo
Unix de Berckley) el que sac a Java del letargo en que estaba sumido. Joy juzg que Internet podra llegar a
ser el campo adecuado para disputar a Microsoft su supremaca en el terreno del software, y vio en Oak el
instrumento idneo para llevar a cabo estos planes.
Para poder presentarlo en sociedad se tuvo que modificar el nombre de este lenguaje de
programacin y se tuvo que realizar una serie de modificaciones de diseo para poderlo adaptar al propsito
mencionado. As Java fue presentado en sociedad en agosto de 1995.
Algunas de las razones que llevaron a Bill Joy a pensar que Java podra llegar a ser rentable son:
Java es un lenguaje orientado a objetos: Esto es lo que facilita abordar la resolucin de cualquier tipo
de problema.
Es un lenguaje sencillo, aunque sin duda potente.
La ejecucin del cdigo Java es segura y fiable: Los programas no acceden directamente a la
memoria del ordenador, siendo imposible que un programa escrito en Java pueda acceder a los
recursos del ordenador sin que esta operacin le sea permitida de forma explcita. De este modo, los
datos del usuario quedan a salvo de la existencia de virus escritos en Java. La ejecucin segura y
controlada del cdigo Java es una caracterstica nica, que no puede encontrarse en ninguna otra
tecnologa.
Es totalmente multiplataforma: Es un lenguaje sencillo, por lo que el entorno necesario para su
ejecucin es de pequeo tamao y puede adaptarse incluso al interior de un navegador.
Existen muchas crticas a Java debido a su lenta velocidad de ejecucin, aproximadamente unos 20
veces ms lentos que un programa en lenguaje C. Sun est trabajando intensamente en crear versiones de Java
con una velocidad mayor.
El problema fundamental de Java es que utiliza una representacin intermedia denominada cdigo de
byte para solventar los problemas de portabilidad. Los cdigos de byte posteriormente se tendrn que
transformar en cdigo mquina en cada mquina en que son utilizados, lo que ralentiza considerablemente el
proceso de ejecucin.
La solucin que se deriva de esto parece bastante obvia: fabricar ordenadores capaces de comprender
directamente los cdigos de byte. stas seran unas mquinas que utilizaran Java como sistema operativo y
que no requeriran en principio de disco duro porque obtendran sus recursos de la red.
A los ordenadores que utilizan Java como sistema operativo se les llama Network Computer, WebPC
o WebTop. La primera gran empresa que ha apostado por este tipo de mquinas ha sido Oracle, que en enero
de 1996 present en Japn su primer NC (Network Computer), basado en un procesador RISC con 8
Megabytes de RAM. Tras Oracle, han sido compaas del tamao de Sun, Apple e IBM las que han
anunciado desarrollos similares.
Elabor: Ing. Jess Pando Barrn(Mocis)
7
La principal empresa en el mundo del software, Microsoft, que en los comienzos de Java no estaba a
favor de su utilizacin, ha licenciado Java, lo ha incluido en Internet Explorer (versin 3.0 y posteriores), y ha
lanzado un entorno de desarrollo para Java, que se denomina Visual J++.
El nico problema aparente es la seguridad para que Java se pueda utilizar para transacciones
crticas. Sun va a apostar por firmas digitales, que sern clave en el desarrollo no slo de Java, sino de
Internet.
Versiones de Java
2
Java 1
o Java 1.0 (Enero 1996) - 8 paquetes, 212 clases - Primera versin pblica. La presin hizo
que se hiciera pblica demasiado pronto, lo cual significa que el diseo del lenguaje no es
demasiado bueno y hay muchos errores. Respecto a seguridad, es restrictivo por defecto.
o Java 1.1 (Marzo 1997) - 23 paquetes, 504 clases - mejoras de rendimiento en la JVM, nuevo
modelo de eventos en AWT, clases anidadas, serializacin de objetos, API de JavaBeans,
archivos jar, internacionalizacin, API Reflection (Reflexin), JDBC (Java Data base
Connectivity), RMI (Remote Method Invocation). Se aade la firma del cdigo y la
autentificacin. Es la primera versin lo suficientemente estable y robusta.
Java 2
o Java 1.2 (Diciembre 1998 ) - 59 paquetes, 1520 clases - JFC (Swing), Drag and Drop,
Java2D, Corba, API Collections. Se producen notables mejoras a todos los niveles. Para
enfatizar esto Sun lo renombra como Java 2. El JDK (Java Development Kit) se renombra
como SDK (Software Development Kit). Se divide en J2SE, J2EE y J2ME.
o Java 1.3 (Abril 2000) - 77 paquetes, 1595 clases - Orientada sobre todo a la resolucin de
errores y a la mejora del rendimiento; se producen algunos cambios menores como la
inclusin de JNDI (Java Naming and Directory Interface) y la API Java Sound. Tambin
incluye un nuevo compilador de alto rendimiento JIT (Just In Time).
o Java 1.4 (2002) - 103 paquetes, 2175 clases - Tambin conocido como Merlin, es la versin
actual. Mejora notablemente el rendimiento y aade entre otros soporte de expresiones
regulares, una nueva API de entrada/salida de bajo nivel (NIO, New I/O), clases para el
trabajo con Collections, procesado de XML; y mejoras de seguridad como el soporte para la
criptografa mediante las Java Cryptography Extension (JCE), la inclusin de la Java Secure
Socket Extension (JSSE) y el Java Authentication and Authorization Service (JAAS).
o Java 1.5 (Octubre 2004) - 131 paquetes, 2656 clases - Tambin conocido como Tiger,
renombrado por motivos de marketing como Java 5.0. Incluye como principales novedades:
tipos genricos (generics)
autoboxing/unboxing conversiones impliticas entre tipos primitivos y los wrappers
correspondientes.
Enumerados
Bucles simplificados
printf
Funciones con nmero de parmetros variable
Metadatos en clases y mtodos.
2
http://www.javahispano.org/news.item.action?id=987142393
Elabor: Ing. Jess Pando Barrn(Mocis)
8
1.2 Pasos para la instalacin y configuracin del kit J2SE
Configuracin del Path en Windows XP
a) Se activa el Panel de Control
b) Se selecciona Sistema
c) Se selecciona Opciones avanzadas
Elabor: Ing. Jess Pando Barrn(Mocis)
9
c) Se selecciona Variables de entorno
d) Se selecciona en Variables del sistema la variable Path y despus se elige el botn Modificar
e) Se escribe la ruta correcta en donde qued instalado el software de Java
Por ejemplo:
c:\archivos de programa\java\jdk1.5.0_06\bin (iniciando con un punto y coma para separar la configuracin
anterior)
Elabor: Ing. Jess Pando Barrn(Mocis)
10
2. Programacin Orientada a Objetos
2.1. Entorno de Java
Programa1.java
class Programa1
{
public static void main(String args[])
{
System.out.println("Esta es una prueba");
}
}
Salida:
Comentarios:
Todo programa en Java consiste de, cuando menos, una declaracin de clase que el programador debe de
definir. Estas clases se conocen como clases definidas por el programador o clases definidas por el
usuario. La palabra clave class introduce una declaracin de clase en Java, la cual debe ir seguida
inmediatamente por el nombre de la clase.
La lnea.
public static void main(String args[])
Es el punto de inicio de toda aplicacin en Java. Los parntesis despus de main indican que ste es
un bloque de construccin del programa, al cual se le llama mtodo. Las declaraciones de clases en Java
generalmente contienen no o ms mtodos. En una aplicacin en Java, slo uno de esos mtodos debe
llamarse main y debe definirse como lo muestra el primer programa, de no ser as, el intrprete java no
ejecutar la aplicacin. La palabra clave void indica que este mtodo realizar una tarea pero no devolver
ningn tipo de informacin cuando complete su tarea.
System.out se conoce como el objeto de salida estndar, permite a las aplicaciones en Java mostrar
conjuntos de caracteres en la ventana de comandos, desde la cual se ejecuta la aplicacin en Java.
Compilacin y ejecucin de una aplicacin en Java
javac Programa1.java Esta instruccin compila el archivo de texto .java
Si el programa no contiene errores de sintaxis, el comando anterior crea un nuevo archivo llamado
Programa1.class, el cual contiene los cdigos de bytes de Java que representan la aplicacin. Estos cdigos de
bytes sern interpretados por Java cuando se le indique que debe ejecutar el programa.
java Programa1 Esta instruccin ejecuta el programa
Elabor: Ing. Jess Pando Barrn(Mocis)
11
Programa2.java
class Programa2
{
public static void main(String args[])
{
System.out.println(args[0]);
}
}
Salida:
Comentarios:
El argumento de main recibe un vector de tipo objeto cadena desde la consola, en este caso recibe la
palabra Bienvenidos en la localidad 0 del vector, si existen otras cadenas (palabras) separadas por un
espacio, las tomar en la localidad 1, 2, etc.
Programa3.java
class Programa3
{
public static void main(String []vector)
{
System.out.println(vector[0]);
}
}
La salida es la misma que el programa anterior, ste cdigo nos demuestra que el vector args el cual almacena
un arreglo de tipo cadena puede llamarse como sea y el orden de los corchetes puede cambiar con base a la
sintaxis de los arreglos.
Programa4.java
class Programa4
{
public static void main(String []vector)
{
System.out.println(vector[0]+" "+vector[1]+" "+vector[2]+" "+vector[3]);
}
}
Salida:
Elabor: Ing. Jess Pando Barrn(Mocis)
12
Programa5.java
class Programa5
{
public static void main(String args[])
{
String a=args[0];
System.out.println(a);
}
}
Programa6.java
class Programa6
{
public static void main(String args[])
{
System.out.println(args[0]);
}
}
2.2. Tipos Primitivos
La siguiente tabla muestra los 8 tipos primitivos en Java. Al igual que sus lenguajes antecesores C y
C++, Java requiere que todas las variables tengan un tipo. Es por esta razn que Java se conoce como un
lenguaje fuertemente tipificado.
Cuando se declaran variables de alguno de los tipos primitivos fuera de un mtodo, se les asignan
automticamente valores predeterminados, a menos que se inicialicen en forma explcita. Las variables de los
tipos char, byte, short, int, long, flota y double reciben el valor de 0 de manera predeterminada. Las variables
de tipo bolean reciben el valor de false de manera predeterminada.
Tipo Tamao en bits Valores
boolean true o false
Char 16 0 hasta 65535
Byte 8 -128 a +127
Short 16 -32768 a 32767
Int 32 -2147483648 hasta +2147483647
long 64 -9223372036854775808 hasta +9223372036854775807
Float 32 Rango negativo:
-3.4028234663852886E+38 hasta -1.40129846432481707E-45
Rango positivo:
1.40129846432481707E-45 hasta
3.4028234663852886E+38
Double 64 Rango negativo:
-1.7976931348623157E+308 hasta -4.94065645841246544E-324
Rango positivo:
4.94065645841246544E-324 hasta 1.7976931348623157E+308
Elabor: Ing. Jess Pando Barrn(Mocis)
13
Programa7.java
class Programa7
{
public static void main(String args[])
{
int a=10;
int b=30;
int c=a+b;
System.out.println("c="+c);
//una alternativa a este cdigo es
/* int a,b,c;
a=10;
b=30;
c=a+b;
System.out.println("c="+c);
*/
}
}
Programa8.java
class Programa8
{
public static void main(String args[])
{
int a=7;
int b=3;
int s,r,m,d,modulo;
s=a+b;
r=a-b;
m=a*b;
d=a/b;
modulo=a%b;
System.out.println("La suma es="+s);
System.out.println("La resta es="+r);
System.out.println("La multiplicacion es="+m);
System.out.println("La division es="+d);
System.out.println("El residuo es="+modulo);
}
}
Salida:
Elabor: Ing. Jess Pando Barrn(Mocis)
14
Programa9.java
class Programa9
{
public static void main(String args[])
{
double a=7.453;
double b=3.567;
double s,r,m,d;
s=a+b;
r=a-b;
m=a*b;
d=a/b;
System.out.println("La suma es="+s);
System.out.println("La resta es="+r);
System.out.println("La multiplicacion es="+m);
System.out.println("La division es="+d);
}
}
Salida:
Programa10.java
class Programa10
{
public static void main(String args[])
{
String a="Java";
int b=10;
double c=3.1416;
float d1=5.6F;
float d2=(float)4.2;
byte e=35;
boolean f=true;
char g='a';
short h=100;
System.out.println("a="+a+" b="+b+" c="+c);
System.out.println("d1="+d1+" d2="+d2);
System.out.println("e="+e+" f="+f+" g="+g+" h="+h);
}
}
Salida:
Elabor: Ing. Jess Pando Barrn(Mocis)
15
2.3. Estructuras bsicas de control en Java
2.3.1 Estructuras secuenciales
1) Ecuacin 1
m y
Ec1.java
class Ec1
{
public static void main(String args[])
{
double y;
double m;
m=Double.parseDouble(args[0]);
y=Math.sqrt(m);
System.out.println("y="+y);
}
}
Comentarios:
Los mtodos estticos parseInt, parseDouble, parseByte, parseBoolean, etc. de las clases respectivas
convierten su argumento String en el tipo de datos deseado.
2) Ecuacin 2
3
3
d b
a
z
+

Ec2.java
class Ec2
{
public static void main(String args[])
{
double a=Double.parseDouble(args[0]);
double b=Double.parseDouble(args[1]);
double d=Double.parseDouble(args[2]);
double v1,v2,v3,z;
v1=Math.pow(a,3);
v2=b+2;
v3=Math.pow(v2,1.0/3.0);
z=v1/v2;
System.out.println("z="+z);
Elabor: Ing. Jess Pando Barrn(Mocis)
16
}
}
3) Ecuacin 3
{ }
b
a
e
b a
a
p
ab
b
c

'

) ln(
) ln(
Ec3.java
class Ec3
{
public static void main(String args[])
{
double a=Double.parseDouble(args[0]);
double b=Double.parseDouble(args[1]);
pdouble c=Double.parseDouble(args[2]);
double t1,t2,t3,t4,t5,t6,t7,t8,p;
t1=Math.pow(b,c);
t2=Math.pow(a,t1);
t3=Math.log(a+b);
t4=t2/t3;
t5=Math.log(a*b);
t6=Math.exp(t5);
t7=t4*t6;
t8=Math.sqrt(a/b);
p=t7-t8;
System.out.println("p="+p);
}
}
Ejercicios:
1. Escriba una aplicacin que reciba tres enteros del usuario y evalu la siguiente ecuacin:
2
) * ( c b a z +
2. Escriba una aplicacin que reciba del usuario el radio de un crculo como un float y que imprima
el dimetro, circunferencia y rea de ese crculo. Utilice la constante predefinida Math.PI para el
valor de p.
Dimetro=2r
Circunferencia = 2pr
Area = pr
2
Operadores.java
importjavax.swing.JOptionPane;
public class Operadores
{
Elabor: Ing. Jess Pando Barrn(Mocis)
17
public static void main(String rgs[])
{
int c,d;
c=10;
d=c++;
System.out.println(c); // 11
System.out.println(d); // 10
c=10;
d=++c;
System.out.println(c); // 11
System.out.println(d); // 11
c=10;
d=c--;
System.out.println(c); // 9
System.out.println(d); // 10
c=10;
d=--c;
System.out.println(c); // 9
System.out.println(d); // 9
c=10;
c+=5;
System.out.println(c); // 15
c=10;
c-=5;
System.out.println(c); // 5
c=10;
c*=5;
System.out.println(c); // 50
c=10;
c/=5;
System.out.println(c); // 2
c=10;
c%=5;
System.out.println(c); // 0
}
}
Elabor: Ing. Jess Pando Barrn(Mocis)
18
2.3.2 Estructuras alternativas
Simple
DecSimple.java
class DecSimple
{
public static void main(String args[])
{
int n=Integer.parseInt(args[0]);
if(n>0)
System.out.println("positivo");
}
}
Doble
DecDoble.java
class DecDoble
{
public static void main(String args[])
{
int n=Integer.parseInt(args[0]);
if(n>0)
System.out.println("positivo");
else
System.out.println("negativo");
System.out.println("fin del programa");
}
}
Mltiple
DecMultiple.java
class DecMultiple
{
public static void main(String args[])
{
int n=Integer.parseInt(args[0]);
switch(n)
{
case 1:
System.out.println("uno");
break;
case 2:
System.out.println("dos");
break;
case 3:
System.out.println("tres");
break;
Elabor: Ing. Jess Pando Barrn(Mocis)
19
default:
System.out.println("otra opcion");
break;
}
}}
2.3.3 Estructuras repetitivas
Do while
EstDoWhile.java
class EstDoWhile
{
public static void main(String args[])
{
int n=Integer.parseInt(args[0]);
int c=0;
do
{
c=c+1;
System.out.println(c);
}
while(c<n);
}
}
While do
EstWhile.java
class EstWhile
{
public static void main(String args[])
{
int n=Integer.parseInt(args[0]);
int c=0;
while(c<n)
{
c=c+1;
System.out.println(c);
}
}
}
Implementacin de un contador y sumador
ContSumador.java
class ContSumador
{
public static void main(String args[])
{
Elabor: Ing. Jess Pando Barrn(Mocis)
20
int n=Integer.parseInt(args[0]);
int c=0;
int s=0;
do
{
c=c+1;
s=s+c;
}
while(c<n);
System.out.println(s);
}
}
Ejercicios de series
1) + + + + + + ...
5
1
4
1
3
1
2
1
1 no. de trminos
2) ,...,
10
25
,
8
20
,
6
15
,
4
10
,
2
5
no. de trminos
3)
+ + + + + .... 8 6 4 2
2 2 2 2
no. de trminos
4) + +
,
_

+
,
_

+
,
_

....
9
6
6
4
3
2
5 3 1
no. de trminos
5) + + + + ....
12
15
8
10
4
5
6
3
4
2
2
1
no. de trminos
6) + +

,
_

,
_

,
_

...
06 .
03 .
04 .
2 . 0
02 .
1 . 0
9
6
6
4
3
2
no. de trminos
Elabor: Ing. Jess Pando Barrn(Mocis)
21
Ciclo For
EstFor.java
class EstFor
{
public static void main(String args[])
{
int n=Integer.parseInt(args[0]);
for(int c=1;c<=n;c=c+1)
System.out.println(c);
}
}
7)
+ + + + + .... 8 6 4 2
4 3 2 1
no. de trminos
8) 1 x 2 x 3 x 4 x .x no. de trminos
9) + + + + ....
! 3
3
! 2
2
! 1
1
no. de trminos
2.3.4 Ejercicios adicionales de Estructuras de Control
1. Escribe una aplicacin que calcule el factorial de un nmero n.
2. Escribe una aplicacin que estime el valor de la constante matemtica e, utilizando la frmula
...
! 3
1
! 2
1
! 1
1
1 + + + + e
3. Escribe una aplicacin que calcule el valor de e
x
, utilizando la frmula
...
! 3 ! 2 ! 1
1
3 2
+ + + +
x x x
e
x
4. Escribe una aplicacin que calcule el producto de los enteros impares del a al 15 y que muestre los
resultados en un cuadro de dilogo de mensaje.
5. Un almacn de pedidos por correo vende cinco productos cuyos precios de venta son los siguientes:
a. Producto 1 $2.98
b. Producto 2 $4.50
Elabor: Ing. Jess Pando Barrn(Mocis)
22
c. Producto 3 $9.98
d. Producto 4 $4.49
e. Producto 5 $6.87
Escribe una aplicacin que lea una serie de pares de nmeros, como se muestra a continuacin:
i. Nmero del producto
ii. Cantidad vendida
El programa debe utilizar una instruccin switch para determinar el precio de venta de cada
producto. Use un ciclo controlado por centinela para determinar cundo debe el programa dejar de iterar para
mostrar los resultados.
6. Disea una aplicacin que pueda demostrar las tablas de verdad de los operadores AND (&&), OR
(||), NOT (!) y XOR (^), de acuerdo a la siguiente referencia.
Operador AND
Expresin 1 Expresin 2 Resultado
1 1 1
1 0 0
0 1 0
0 0 0
Operador OR
Expresin 1 Expresin 2 Resultado
1 1 1
1 0 1
0 1 1
0 0 0
Operador XOR
Expresin 1 Expresin 2 Resultado
1 1 0
1 0 1
0 1 1
0 0 0
Operador NOT
Expresin 1 Resultado
1 0
0 1
7.
Desarrolla una aplicacin para calcular el valor de a partir de la serie infinita
...
11
4
9
4
7
4
5
4
3
4
4 + + +
Visualiza una tabla que permita observar la evaluacin de cada trmino hasta n.
Elabor: Ing. Jess Pando Barrn(Mocis)
23
2.4. Conceptos de Programacin Orientada a Objetos
EJPoo1.java
class EjPoo1
{
public int y=20;
}
PruebaEJPoo1.java
class PruebaEjPoo1
{
public static void main(String args[])
{
EjPoo1 obj=new EjPoo1();
System.out.println("y="+obj.y);
}
}
Salida:
Elabor: Ing. Jess Pando Barrn(Mocis)
24
EjPoo2.java
class EjPoo2
{
void metodo1()
{
int y=20;
System.out.println("y="+y);
}
}
PruebaEjPoo2.java
class PruebaEjPoo2
{
public static void main(String args[])
{
EjPoo2 obj=new EjPoo2();
obj.metodo1();
}
}
EjPoo3.java
class EjPoo3
{
int metodo1()
{
int y=20;
return y;
}
}
PruebaEjPoo3.java
class PruebaEjPoo3
{
public static void main(String args[])
{
EjPoo3 obj=new EjPoo3();
System.out.println(obj.metodo1());
}
}
EjPoo4.java
class EjPoo4
Elabor: Ing. Jess Pando Barrn(Mocis)
25
{
int metodo1(int y)
{
return y;
}
}
PruebaEjPoo4.java
class PruebaEjPoo4
{
public static void main(String args[])
{
EjPoo4 obj=new EjPoo4();
System.out.println(obj.metodo1(20));
}
}
EjPoo5.java
class EjPoo5
{
void metodo1(int y)
{
System.out.println("y="+y);
}
}
PruebaEjPoo5.java
class PruebaEjPoo5
{
public static void main(String args[])
{
EjPoo5 obj=new EjPoo5();
obj.metodo1(20);
}
}
Una caracterstica importante de las llamadas a mtodos es la promocin de argumentos (o coercin de
argumentos); es decir, forzar a que se pasen argumentos del tipo apropiado a un mtodo.
Las reglas de promocin se aplican a las expresiones que contienen valores de dos o ms tipos
primitivos (tambin conocidos como expresiones de tipo mixto) y a los valores de tipos primitivos que se
pasan como argumentos a los mtodos. La siguiente tabla muestra los tipos primitivos y los tipos a los que
puede promoverse cada uno de ellos.
Tipo Promociones vlidas
Double Ninguna
Float Double
Long float o double
Int long,float o double
Char int, long, float o double
Short int, long, float o double
Elabor: Ing. Jess Pando Barrn(Mocis)
26
Byte short, int, long, float o double
boolean Ninguno
Los siguientes ejemplos muestran la validez de las promociones
Demo.java
public class Demo
{
public static void main(String args[])
{
float x=3.14;
System.out.println(x);
}
}
Salida:
Comentarios:
Se puede observar que por default el valor de x que es 3.14 lo toma como double y por lo tanto la x
que est declarada como float no puede almacenar el valor.
Si se agrega la letra F despus del nmero se est obligando a convertir el dato en flotante y por lo
tanto ya no marca error en la compilacin, tal como lo muestra el siguiente ejemplo.
Demo.java
public class Demo
{
public static void main(String args[])
{
float x=3.14F;
System.out.println(x);
}
}
Salida:
Tambin se puede realizar de la siguiente forma:
Elabor: Ing. Jess Pando Barrn(Mocis)
27
public class Demo
{
public static void main(String args[])
{
float x=(float)3.14;
System.out.println(x);
}
}
Salida:
EjPoo6.java
class EjPoo6
{
void metodo1(int y)
{
System.out.println("y="+y);
}
double metodo2(int a, float b)
{
return a*b;
}
String metodo3(String g)
{
return "prueba"+g;
}
}
PruebaEjPoo6.java
class PruebaEjPoo6
{
public static void main(String args[])
{
EjPoo6 obj1=new EjPoo6();
obj1.metodo1(20);
System.out.println(obj1.metodo2(100, 4.5F));
System.out.println(obj1.metodo3("valor"));
}
}
EjPoo7.java
class EjPoo7
{
void metodo1(int y)
{
System.out.println("y="+y);
Elabor: Ing. Jess Pando Barrn(Mocis)
28
}
double metodo2(int a, float b)
{
return a*b;
}
String metodo3(String g)
{
return "prueba"+g;
}
}
PruebaEjPoo7.java
class PruebaEjPoo7
{
public static void main(String args[])
{
EjPoo7 obj1=new EjPoo7();
obj1.metodo1(20);
System.out.println(obj1.metodo2(100, 4.5F));
System.out.println(obj1.metodo3("valor"));
EjPoo7 obj2=new EjPoo7();
obj1.metodo1(40);
System.out.println(obj1.metodo2(200, 4.5F));
System.out.println(obj1.metodo3("valor"));
}
}
Un Ejemplo alternativo Orientado a Objetos
Se disear una clase que encapsule informacin acerca de vehculos como autos, camionetas y
camiones. Esta clase se llama Vehiculo y almacenar tres elementos de informacin acerca del vehculo: el
nmero de pasajeros que puede llevar, su capacidad de combustible y su promedio de consumo de
combustible.
Vehiculo.java
class Vehiculo
{
int Pasajeros;
int CapacidadCombustible;
int ConsumoCombustible;
}
PruebaVehiculo.java
class PruebaVehiculo
{
public static void main(String args[])
{
Vehiculo minivan=new Vehiculo();
int rango;
minivan.Pasajeros=7;
minivan.CapacidadCombustible=16;
minivan.ConsumoCombustible=21;
Elabor: Ing. Jess Pando Barrn(Mocis)
29
rango=minivan.CapacidadCombustible*minivan.ConsumoCombustible;
System.out.println("La Minivan puede llevar: "+minivan.Pasajeros+" Con un alcance de: "+rango);
}
}
Comentarios:
La clase Vehiculo define tres variables de instancia, esta clase no contiene ningn mtodo (por el
momento), as como est construida, es una clase de datos. Esta clase crea un nuevo tipo de datos
llamado Vehiculo, este nombre se usar para declarar objetos de tipo Vehiculo. Esta clase es slo una
descripcin, no crea un objeto real.
La lnea:
Vehiculo minivan=new Vehiculo();
De la clase PruebaVehiculo crea un objeto minivan que es una instancia de Vehiculo. De esta
manera, tendr realidad fsica.
Cada vez que se cree una instancia de una clase, se estar creando un objeto con su propia copia de
cada variable de instancia definida por la clase. As, cada objeto de tipo Vehiculo contendr sus propias
copias de las variables de instancia: Pasajeros, CapacidadCombustible y ConsumoCombustible. Para acceder
a estas variables se usar el operador de punto. Este operador enlaza el nombre de un objeto con el nombre de
un miembro. El objeto se especifica a la izquierda y el miembro se coloca a la derecha.
En general se puede usar el operador de punto para acceder a las variables de instancia y a los
mtodos
Clase3.java
class Clase3
{
int x;
int y;
int z;
}
InterfazClase3.java
class InterfazClase3
{
public static void main(String args[])
{
Clase3 obj1=new Clase3();
Clase3 obj2=new Clase3();
obj1.x=20;
obj1.y=30;
obj1.z=40;
obj2.x=1;
obj2.y=2;
obj2.z=3;
System.out.println("x="+obj1.x+" y="+obj1.y+" z="+obj1.z);
System.out.println("x="+obj2.x+" y="+obj2.y+" z="+obj2.z);
}
}
Modificacin de la interfaz para instanciar los dos objetos en una sola lnea
Elabor: Ing. Jess Pando Barrn(Mocis)
30
class InterfazClase3Mod
{
public static void main(String args[])
{
Clase3 obj1=new Clase3(), obj2=new Clase3();
obj1.x=20;
obj1.y=30;
obj1.z=40;
obj2.x=1;
obj2.y=2;
obj2.z=3;
System.out.println("x="+obj1.x+" y="+obj1.y+" z="+obj1.z);
System.out.println("x="+obj2.x+" y="+obj2.y+" z="+obj2.z);
}
}
Ejemplo 6. Creacin de dos objetos tipo Vehiculo.
Vehiculo.java
class Vehiculo
{
int Pasajeros;
int CapacidadCombustible;
int ConsumoCombustible;
}
DosVehiculos.java
class DosVehiculos
{
public static void main(String args[])
{
int rango1,rango2;
Vehiculo minivan=new Vehiculo();
Vehiculo CarroDeportivo=new Vehiculo();

minivan.Pasajeros=7;
minivan.CapacidadCombustible=16;
minivan.ConsumoCombustible=21;

CarroDeportivo.Pasajeros=2;
CarroDeportivo.CapacidadCombustible=14;
CarroDeportivo.ConsumoCombustible=12;
rango1=minivan.CapacidadCombustible*minivan.ConsumoCombustible;
rango2=CarroDeportivo.CapacidadCombustible*CarroDeportivo.ConsumoCombustible;
System.out.println("La Minivan puede llevar :"+ minivan.Pasajeros + " con un alcance de : "+ rango1);
System.out.println("El carro sport puede llevar:"+ CarroDeportivo.Pasajeros + " con un alcance de : "+
rango2);

}
Elabor: Ing. Jess Pando Barrn(Mocis)
31
}
Comentarios:
La lnea:
Vehiculo minivan=new Vehiculo();
Desempea dos funciones: Primero, declara una variable de nombre minivan del tipo de clase
Vehiculo. Esta variable no define un objeto, en cambio es simplemente una variable que puede referirse a un
objeto. Segundo, la declaracin crea una copia fsica del objeto y asigna a minivan una referencia a ese objeto.
Esto se hace usando el operador new.
El operador new asigna dinmicamente memoria (asignada en tiempo de ejecucin) para un objeto y
le devuelve una referencia a ste. Esta referencia es almacenada en una variable. As, en Java, todos los
objetos clase son asignados dinmicamente.
La combinacin de los dos pasos en el enunciado anterior se puede reescribir para mostrar cada paso
individualmente como sigue:
Vehiculo minivan; // declara referencia al objeto
minivan = new Vehiculo(); // asigna un objeto Vehiculo
La primera lnea declara a minivan como una referencia a un objeto de tipo Vehiculo. De este modo,
minivan es una variable que puede referirse a un objeto, pero no es un objeto por s misma. En este momento
minivan contiene el valor de null, que significa que no se refiere a un objeto. La segunda lnea crea un nuevo
objeto Vehiculo y asigna una referencia para minivan. Ahora, minivan se enlaza con un objeto.
El primer ejemplo se puede redisear para que la referencia al objeto est en dos lneas:
Variables de referencia y asignacin
Clase4.java
class Clase4
{
int a;
}
InterfazClase4.java
class InterfazClase4
{
public static void main(String args[])
{
Clase4 obj1=new Clase4();
obj1.a=10;
Clase4 obj2=obj1;
System.out.println("obj1.a="+obj1.a);
System.out.println("obj2.a="+obj2.a);
Clase4 obj3=new Clase4();
obj2=obj3;
System.out.println("obj3.a="+obj3.a);
System.out.println("obj2.a="+obj2.a);
obj3=obj1;
System.out.println("obj1.a="+obj1.a);
System.out.println("obj3.a="+obj3.a);
}
Elabor: Ing. Jess Pando Barrn(Mocis)
32
}
Salida:
Variables de referencia y asignacin con la clase Vehiculo
PruebaVehiculo5.java
class PruebaVehiculo5
{
public static void main(String args[])
{
Vehiculo carro1=new Vehiculo();
Vehiculo carro2=carro1;
carro1.Pasajeros=7;

System.out.println(carro1.Pasajeros); // 7
System.out.println(carro2.Pasajeros); // 7
Vehiculo carro3 = new Vehiculo();
carro2=carro3;
carro3.Pasajeros=10;
System.out.println(carro3.Pasajeros); // 10
System.out.println(carro2.Pasajeros); // 10
carro1=carro3;
System.out.println(carro1.Pasajeros); // 10
System.out.println(carro2.Pasajeros); // 10
System.out.println(carro3.Pasajeros); // 10
System.exit(0);
}
}
Comentarios:
En una operacin de asignacin, las variables con referencia a objetos actan diferente a como lo hacen
las variables de tipo simple, como int. Cuando se asigna una variable de tipo simple a otra, la situacin
es sencilla. La variable a la izquierda recibe una copia del valor de la variable de la derecha. Cuando se
asigna una variable de referencia de un objeto a otro, se est cambiando el objeto al que se refiere la
variable de referencia. En este ejemplo carro1 y carro2 se refieren a los mismos objetos, la asignacin de
carro1 a carro2 simplemente hace que carro2 se refiera al mismo objeto de carro1.
Elabor: Ing. Jess Pando Barrn(Mocis)
33
Uso de un mtodo con la clase Vehiculo
Vehiculo.java
class Vehiculo
{
int Pasajeros;
int CapacidadCombustible;
int ConsumoCombustible;
void rango()
{
System.out.println("El rango es: "+CapacidadCombustible*ConsumoCombustible);
}
}
Comentarios
La lnea:
void rango()
Declara un mtodo de nombre rango sin parmetros. Su tipo de retorno es void. De este modo,
rango() no retorna un valor a quien lo llama.
UsoMetodosVehiculo.java
class UsoMetodosVehiculo
{
public static void main(String args[])
{
Vehiculo minivan=new Vehiculo();
Vehiculo CarroDeportivo=new Vehiculo();
minivan.Pasajeros=7;
minivan.CapacidadCombustible=16;
minivan.ConsumoCombustible=21;
CarroDeportivo.Pasajeros=2;
CarroDeportivo.CapacidadCombustible=4;
CarroDeportivo.ConsumoCombustible=12;
System.out.println("La minivan puede llevar : " + minivan.Pasajeros);
minivan.rango();
Elabor: Ing. Jess Pando Barrn(Mocis)
34

System.out.println("El carro Deportivo puede llevar : " + CarroDeportivo.Pasajeros);
CarroDeportivo.rango();
System.exit(0);
}
}
Comentarios
La lnea:
minivan.rango();
Invoca el mtodo rango() de minivan. Es decir, llama al mtodo rango() relativo al objeto minivan,
usando el nombre del objeto seguido por el operador de punto. Cuando un mtodo es llamado, el control del
programa se transfiere al mtodo; cuando el mtodo termina, el control se transfiere a quien lo llama y se
reanuda la ejecucin de la lnea de cdigo siguiente al llamado.
Una introduccin al alcance de datos
Clase8.java
class Clase8
{
public int a=15;
public int metodo1(int b, int c)
{
return b+c;
}
}
InterfazClase8.java
class InterfazClase8
{
public static void main(String args[])
{
int x,y,z;
Clase8 obj = new Clase8();
obj.a=10;
x=obj.a;
y=20;
z=obj.metodo1(x,y);
System.out.println("z ="+z);
}
}
Comentarios:
Elabor: Ing. Jess Pando Barrn(Mocis)
35
No existe variaicin en la salida porque explcitamente e implcitamente son de alcance pblicos
2.4.1 Una introduccin al alcance de datos
Clase9.java
class Clase9
{
private int a=15;
public int metodo1(int b, int c)
{
return b+c;
}
}
InterfazClase9.java
class InterfazClase9
{
public static void main(String args[])
{
int x,y,z;
Clase9 obj = new Clase9();
obj.a=10;
x=obj.a;
y=20;
z=obj.metodo1(x,y);
System.out.println("z ="+z);
}
}
Salida:
Comentarios:
Marca un error por el acceso de la variable(miembro) a de tipo private
Elabor: Ing. Jess Pando Barrn(Mocis)
36
Manejo de datos privados
Clase10.java
class Clase10
{
private int a=15;
public int metodo1(int c)
{
return a+c;
}
}
InterfazClase10.java
class InterfazClase10
{
public static void main(String args[])
{
int y,z;
Clase10 obj = new Clase10();
y=20;
z=obj.metodo1(y);
System.out.println("z ="+z); // z=35
}
}
Clase11.java
class Clase11
{
private int a=15;
private int metodo1(int c)
{
return a+c;
}
}
InterfazClase11.java
class InterfazClase11
{
public static void main(String args[])
{
int y,z;
Clase11 obj = new Clase11();
Elabor: Ing. Jess Pando Barrn(Mocis)
37
y=20;
z=obj.metodo1(y);
System.out.println("z ="+z);
}
}
Salida:
Mtodos Constructores
MetConst1.java
class MetConst1
{
MetConst1()
{
System.out.println("Dentro del metodo constructor");
}
}
PruebaMetConst1.java
class PruebaMetConst1
{
public static void main(String args[])
{
MetConst1 obj = new MetConst1();
}
}
Salida:
MetConst2.java
class MetConst2
{
MetConst2(int a, int b)
{
System.out.println("a="+a+" b="+b);
}
}
PruebaMetConst2.java
class PruebaMetConst2
{
public static void main(String args[])
{
MetConst2 obj = new MetConst2(100,200);
Elabor: Ing. Jess Pando Barrn(Mocis)
38
}
}
Salida:
Mtodos Mutadores(set) y Accesotes(get)
Las clases a menudo proporcionan mtodos public para permitir a los clientes establecer (es decir, asignar
valores a ) u obtener (es decir, recibir los valores de) variables de instancia private. No es necesario llamar a
estos mtodos establecer y obtener pero a menudo as sucede.
Como ejemplo de nomenclatura, un mtodo para establecer la variable de instancia tasaInteres se
llamara tpicamente establecerTasaInteres, y un mtodo para obtener la tasaDeInteres se llamara
tpicamente obtenerTasaInteres. Los mtodos establecer tambin se conocen comnmente como mtodos
mutadores (set) (porque generalmente cambian un valor). Los mtodos obtener tambin se conocen como
mtodos de acceso (get) o (mtodos de consulta).
Parece ser que propocionar herramientas para establecer y obtener es esencialmente lo mismo que
hacer que las variables de instancia pblicas. sta es una sutileza de Java que hace del lenguaje algo tan
deseable para la ingeniera de software. Si una variable de instancia se declara como public, cualquier mtodo
que tenga una referencia a un objeto de la clase en la que se declare esta variable de instancia podr leer o
escribir en ella. Si una variable de instancia se declara como private, un mtodo obtener public eviden temente
parece permitir a otros mtodos el acceso a la variable; sin embargo, el mtodo obtener controla la manera en
que el cliente puede tener acceso a la variable.
SetGet1.java
class SetGet1
{
private int x;
SetGet1(int a)
{
set(a);
}
void set(int a)
{
if(a>0)
x=a;
else
x=0;
}
int get()
{
return x;
}
}
PruebaSetGet1.java
Elabor: Ing. Jess Pando Barrn(Mocis)
39
class PruebaSetGet1
{
public static void main(String args[])
{
SetGet1 obj1 = new SetGet1(10);
System.out.println(obj1.get());
SetGet1 obj2 = new SetGet1(-10);
System.out.println(obj2.get());
}
}
SetGet2.java
class SetGet2
{
private int x,y;
SetGet2(int a, int b)
{
set(a,b);
}
void set(int a, int b)
{
if(a>0)
x=a;
else
x=0;
if(b>0)
y=b;
else
y=0;
}
int getX()
{
return x;
}
int getY()
{
return y;
}
}
PruebaSetGet2.java
class PruebaSetGet2
{
public static void main(String args[])
{
SetGet2 obj1 = new SetGet2(10,20);
System.out.println(obj1.getX()+" "+obj1.getY());
SetGet2 obj2 = new SetGet2(-10,20);
System.out.println(obj2.getX()+" "+obj2.getY());
SetGet2 obj3 = new SetGet2(10,-20);
Elabor: Ing. Jess Pando Barrn(Mocis)
40
System.out.println(obj3.getX()+" "+obj3.getY());
SetGet2 obj4 = new SetGet2(-10,-20);
System.out.println(obj4.getX()+" "+obj4.getY());
}
}
Salida:
Sobrecarga de mtodos
En Java, dos o ms mtodos, dentro de la misma clase, pueden compartir el mismo nombre, con la condicin
de que sus declaraciones de parmetro sean diferentes. Cuando este sea el caso, se dice que los mtodos son
sobrecargados y el proceso se refiere a sobrecarga de mtodos. Un mtodo sobrecargado es una de las
maneras cmo Java implementa el polimorfismo.
En general, para sobrecargar un mtodo simplemente se declaran versiones diferentes de l, ya que el
compilador se encarga del resto. Se debe observar una restriccin importante: el tipo y/o nmero de los
parmetros de cada mtodo sobrecargado debe diferir. No es suficiente que dos mtodos que difieran slo en
sus tipos de retornos. (Los tipos de retornos en todos los casos no dan suficiente informacin para que Java
decida cul mtodo usar). El mtodo sobrecargado puede tambin diferir en sus tipos de retornos. Cuando se
llama un mtodo sobrecargado, se ejecuta la versin del mtodo cuyos parmetros coincidan con los
argumentos.
Ejemplo 1. uso de mtodos sobrecargados
DemoSobrecarga.java
class DemoSobrecarga
{
void Demo1()
{
System.out.println("Sin parmetros ");
}
void Demo1(int a)
{
System.out.println("Un parmetro: "+a);
}
int Demo1(int a, int b)
{
System.out.println("Dos parmetros :"+a+" "+b);
return a+b;
}
double Demo1(double a, double b)
{
System.out.println("Dos parmetros doubles : "+a+" "+b);
return a+b;
}
}
PruebaDemoSobrecarga.java
class PruebaDemoSobrecarga
{
public static void main(String args[])
Elabor: Ing. Jess Pando Barrn(Mocis)
41
{
DemoSobrecarga ob =new DemoSobrecarga();
int res1;
double res2;
ob.Demo1();
ob.Demo1(2);
res1=ob.Demo1(4,6);
System.out.println("El resultado de ob.Demo1(4,6) es: "+res1);
res2=ob.Demo1(1.1, 2.32);
System.out.println("El resultado de ob.Demo1(1.1,2.32) es: "+res2);
}
}
Comentarios:
El Mtodo Demo1 es cuatro veces sobrecargado. La primera versin no lleva parmetros; la segunda
lleva un parmetro entero; la tercera, dos parmetros enteros y la cuarta, dos parmetros double. Se
observa que las dos primeras versiones de Demo1 no retornan un valor y las dos siguientes retornan
un valor. Esto es perfectamente vlido, la sobrecarga no afecta de ninguna manera por el tipo de
retorno de un mtodo.
La diferencia en los tipos de retorno es una diferencia insuficiente para los propsitos de la
sobrecarga.
Ejemplo 2. Los tipos de conversin automtica pueden afectar la resolucin de un mtodo sobrecargado.
DemoSobrecarga2.java
class DemoSobrecarga2
{
void Metodo1(int x)
{
System.out.println("Dentro de Metodo1(int x): "+x);
}
void Metodo1(double x)
{
System.out.println("Dentro de Metodo1(double x): "+x);
}
}
PruebaDemoSobrecarga2.java
class PruebaDemoSobrecarga2
{
public static void main(String args[])
{
DemoSobrecarga2 ob =new DemoSobrecarga2();
int i=10;
double d=10.1;
byte b=99;
short s=10;
float f=11.5F;
ob.Metodo1(i);
ob.Metodo1(d);
ob.Metodo1(b);
ob.Metodo1(s);
ob.Metodo1(f);
Elabor: Ing. Jess Pando Barrn(Mocis)
42
}
}
Salida:
Comentarios:
En este ejemplo, slo dos versiones de Mtodo1() estn definidas: una que tiene un parmetro int y
otra con un parmetro double. Sin embargo, es posible pasar Mtodo1() a un valor byte, short o float.
En el caso de byte y short, Java automticamente las convierte a int. De modo que Mtodo1(int) es
invocada. En el caso de float, el valor se convierte a double y Mtodo(double) es llamada.
Ejemplo 3. Agregar un mtodo byte
DemoSobrecarga3.java
class DemoSobrecarga3
{
void Metodo1(byte x)
{
System.out.println("Dentro de Metodo1(byte): "+x);
}
void Metodo1(int x)
{
System.out.println("Dentro de Metodo1(int): "+x);
}
void Metodo1(double x)
{
System.out.println("Dentro de Metodo1(double): "+x);
}
}
PruebaDemoSobrecarga3.java
class PruebaDemoSobrecarga3
{
public static void main(String args[])
{
DemoSobrecarga3 ob =new DemoSobrecarga3();
int i=10;
double d=10.1;
byte b=99;
short s=10;
float f=11.5F;
Elabor: Ing. Jess Pando Barrn(Mocis)
43
ob.Metodo1(i);
ob.Metodo1(d);
ob.Metodo1(b);
ob.Metodo1(s);
ob.Metodo1(f);
}
}
Salida:
Comentarios:
Las conversiones automticas se aplican slo si no hay coincidencia directa entre un parmetro y un
argumento. El anterior programa se adiciona un mtodo que especifica un parmetro byte. Puesto
que hay una versin de Mtodo1 que tiene un argumento byte, cuando Mtodo1 se llama con un
argumento byte, Mtodo1(byte) se invoca y no ocurre la conversin automtica a int.
Elabor: Ing. Jess Pando Barrn(Mocis)
44
Sobrecarga de mtodos constructores
Los constructores de una clase pueden sobrecargarse. Los constructores sobrecargados permiten a los objetos
de una clase inicializarse de distintas formas. Para sobrecargar constructores simplemente hay que
proporcionar varias declaraciones del constructor con distintas lneas de parmetros.
Ejemplo 1
SobreCargaConstructores.java
class SobreCargaConstructores
{
SobreCargaConstructores()
{
System.out.println("Metodo constructor sin parametros");
}
SobreCargaConstructores(int a)
{
System.out.println("Metodo constructor con un parametro");
System.out.println("a="+a);
}
SobreCargaConstructores(int a, float b)
{
System.out.println("Metodo constructor con dos parametros");
System.out.println("a="+a+" "+"b="+b);
}
SobreCargaConstructores(Double a, String x, char z)
{
System.out.println("Metodo constructor con tres parametros");
System.out.println("a="+a+" "+"x="+x+"z="+z);
}
}
PruebaSobreCargaConstructores.java
public class PruebaSobreCargaConstructores
{
public static void main(String args[])
{
SobreCargaConstructores obj1 = new SobreCargaConstructores();
SobreCargaConstructores obj2 = new SobreCargaConstructores(100);
SobreCargaConstructores obj3 = new SobreCargaConstructores(30,60.9F);
SobreCargaConstructores obj4 = new SobreCargaConstructores(5.8,"cadena1",'x');
Elabor: Ing. Jess Pando Barrn(Mocis)
45
}
}
Salida:
Ejemplo 2. Inicializacin de un objeto con otro.
DemoInicializacionObjetos.java
class DemoInicializacionObjetos
{
int suma;
DemoInicializacionObjetos (int num)
{
suma=0;
for(int i=1; i<=num;i++)
suma+=1;
}
DemoInicializacionObjetos (DemoInicializacionObjetos ob)
{
suma=ob.suma;
}
}
PruebaInicializacionObjetos.java
class PruebaInicializacionObjetos
{
public static void main(String args[])
{
DemoInicializacionObjetos s1 = new DemoInicializacionObjetos(5);
DemoInicializacionObjetos s2 = new DemoInicializacionObjetos(s1);
System.out.println("s1.suma: "+s1.suma);
System.out.println("s2.suma: "+s2.suma);
}
}
Salida:
Comentarios:
Una de las razones ms comunes para que los constructores sean sobrecargados es permitir que un
objeto inicialice a otro. Como se puede ver en el anterior ejemplo, una ventaja de proporcionar un
constructor que usa un objeto para inicializar a otro es eficiencia. En este caso, cuando s2 es
construida, no es necesario volver a calcular la suma.
Elabor: Ing. Jess Pando Barrn(Mocis)
46
Una introduccin a la palabra clave this
Cuando se llama un mtodo, automticamente se pasa un argumento implcito que es la referencia al objeto
invocado (esto es, el objeto en el cual el mtodo se llama). Esta referencia se llama this. En otras palabras, si
se tiene dos objetos del mismo tipo llamados a y b, se puede preguntar cmo es que se puede invocar un
mtodo f() para ambos objetos:
Ejemplo:
ImpMetodosThis1.java
class ImpMetodosThis1
{
void f(int x)
{
System.out.println("dentro del mtodo f");
System.out.println("x="+x);
}
}
IntMetodosThis1.java
class IntMetodosThis1
{
public static void main(String args[])
{
ImpMetodosThis1 a=new ImpMetodosThis1(), b=new ImpMetodosThis1();
a.f(10);
b.f(10);
}
}
En el ejemplo anterior, si slo hay un mtodo llamado f(). Cmo puede este mtodo saber si est siendo
invocado para el objeto a o b?.
Para permitir la escritura de cdigo con una sintaxis adecuada orientada a objetos en la que se envia
un mensaje a un objeto, el compilador se encarga del cdigo clandestino. Hay un primer parmetro secreto
que se pasa al mtodo f(), y ese parmetro es la referencia al objeto que est siendo manipulado. Por tanto, las
dos llamadas a los mtodos anteriores, se convierten en algo parecido a:
ImpMetodosThis1.f(a,10);
ImpMetodosThis1.f(b,10);
Elabor: Ing. Jess Pando Barrn(Mocis)
47
Esto es interno y uno no puede escribir estas expresiones y hacer que el compilador las acepte, pero
da una idea de lo que est corriendo.
Supngase que uno est dentro de un mtodo y que se desea conseguir la referencia al objeto actual.
Dado que esa referencia se pasa de forma secreta al compilador, no hay un identificador para l. Sin embargo,
para este propsito hay una palabra clave: this. Esta palabra clave que puede usarse slo dentro de un
mtodo- produce la referencia al objeto por el que se ha invocado al mtodo. Se puede tratar esta referencia
como cualquier otra referencia a un objeto. Por consiguiente se puede modificar el programa anterior a:
ImpMetodosThis2.java
class ImpMetodosThis2
{
int x;
ImpMetodosThis2(int i)
{
x=i;
}
int obtener()
{
System.out.println("x= "+x);
System.out.println("this.x= "+this.x);
return this.x;
}
}
IntMetodosThis2.java
class IntMetodosThis2
{
public static void main(String args[])
{
ImpMetodosThis2 a=new ImpMetodosThis2(10), b=new ImpMetodosThis2(10);
System.out.println(a.obtener());
System.out.println(b.obtener());
}
}
Salida:
Ejemplo. Sin la utilizacin del this
DemoThis.java
class DemoThis
{
int x;
Elabor: Ing. Jess Pando Barrn(Mocis)
48
DemoThis(int i)
{
x=i;
}
int get()
{
return x;
}
}
PruebaThis.java
class PruebaThis
{
public static void main(String args[])
{
DemoThis obj1=new DemoThis(10);
System.out.println(obj1.get());
}
}
Ejemplo con la utilizacin de this
DemoThis.java
class DemoThis
{
int x;
DemoThis(int i)
{
x=i;
}
int get()
{
System.out.println("x= "+x);
System.out.println("this.x= "+this.x);
return this.x;
}
}
PruebaThis.java
class PruebaThis
{
public static void main(String args[])
{
DemoThis obj1=new DemoThis(10);
DemoThis obj2=new DemoThis(20);
System.out.println(obj1.get());
System.out.println(obj2.get());
}
Elabor: Ing. Jess Pando Barrn(Mocis)
49
}
Ejemplo 2. Uso de this para diferenciar a las variables de instancia y los parmetros
DemoThis2.java
class DemoThis2
{
int x,y;
DemoThis2(int x, int y)
{
/* x=x; esta linea confunde */
this.x=x;
this.y=y;
}
int get1()
{
System.out.println("this.x = "+ this.x);
System.out.println("x = "+ x);
return this.x;
}
int get2()
{
System.out.println("this.y = "+ this.y);
System.out.println("y = "+ y);
return this.y;
}
}
PruebaThis2.java
class PruebaThis2
{
public static void main(String args[])
{
DemoThis2 obj1=new DemoThis2(10,20);
System.out.println(obj1.get1()+" "+obj1.get2());
}
}
Elabor: Ing. Jess Pando Barrn(Mocis)
50
Control de acceso a los miembros de clase
En el soporte para encapsulacin , la clase provee dos beneficios importantes. Primero enlaza los
datos con el cdigo que maneja. Segundo, provee los medios por los que el acceso a los miembros se puede
controlar.
Aunque el enfoque de Java es un poco ms sofisticado, en esencia, hay dos tipos bsicos de
miembros de clase: pblico y privado. Se puede tener acceso a un miembro pblico por un cdigo definido
fuera de su clase y se puede tener acceso a un miembro privado slo por otros mtodos que defina su clase. Se
hace a travs del uso de miembros privados donde se controla el acceso.
Una parte fundamental de la programacin orientada a objetos es el acceso restringido de los
miembros a una clase, esto ayuda a prevenir el mal uso de un objeto. Si se permite el acceso a datos privados
slo a travs de un conjunto bien definido de mtodos, se podra evitar que valores impropios se asignen a
esos datos, por ejemplo, llevar a cabo un control de rango. Para cdigos externos a la clase no es posible fijar
directamente el valor de un miembro privado. Tambin se puede controlar con precisin dnde y cundo se
usan los datos dentro de un objeto. De manera que cuando se ejecuta correctamente, una clase crea una caja
negra que puede usarse, pero el funcionamiento interior no est disponible para manipularlo.
Java provee un acceso fijo por defecto, en el que los miembros de una clase estn libremente
disponibles para el otro cdigo en el programa. (El acceso fijo por defecto es esencialmente pblico). Aunque
es conveniente para clases simples, este acceso fijo por defecto no es apropiado para muchas situaciones en el
mundo real.
El control de acceso a miembros se consigue a travs del uso de tres especificadores de acceso:
public, private y protected.
Cuando un miembro de una clase se modifica mediante el especificador public, se puede tener acceso
a ese miembro por cualquier otro cdigo en el programa. Esto incluye mtodos definidos dentro de otras
clases.
Cuando un miembro de una clase se especifica como private, se puede tener acceso a ese miembro
slo mediante otro miembro de su misma clase. As, mtodos en otras clases no pueden acceder a miembros
private de otra clase.
Ejemplo. Accesos pblicos vs. Accesos privados
Accesos.java
class Accesos
{
private int alfa; // acceso privado
public int beta; // acceso pblico
int gamma; // acceso por defecto es pblico
void setAlfa(int a)
{
alfa=a;
Elabor: Ing. Jess Pando Barrn(Mocis)
51
}
int getAlfa()
{
return alfa;
}
int getBeta()
{
return beta;
}
int getGamma()
{
return gamma;
}}
PruebaAccesos.java
class PruebaAccesos
{
public static void main(String args[])
{
Accesos obj1=new Accesos();
obj1.setAlfa(100);
System.out.println(obj1.getAlfa());
// obj1.alfa=200; Marca error en la compilacin
obj1.beta=300;
obj1.gamma=500;
System.out.println(obj1.getBeta());
System.out.println(obj1.getGamma());
}
}
Comentarios:
Como se puede ver en la clase Accesos, alfa se especifica como private, beta como public y gamma
pblica por defecto. Como alfa es privada, no se puede tener acceso a ella mediante cdigo fuera de
su clase. Por lo tanto, dentro de la clase PruebaAccesos, alfa no se puede usar directamente, se debe
tener acceso a travs de sus mtodos de acceso pblicos: setAlfa() y getAlfa().
Aunque el acceso a alfa por un cdigo fuera de Accesos no se permite, los mtodos definidos dentro
de la clase Accesos pueden acceso libremente, como se puede apreciar con los mtodos setAlfa() y getAlfa().
Conclusin: un miembro privado puede libremente ser usado por otros miembros de su clase, pero
no puede tener acceso a ella mediante un cdigo fuera de su clase.
Elabor: Ing. Jess Pando Barrn(Mocis)
52
Static
Cuando un miembro se declara static, se puede tener acceso a este antes de crear algunos objetos de
su clase y sin referencia a ningn objeto. Se puede declarar los mtodos y las variables como static. El
ejemplo ms comn de un miembro static es main(). Este mtodo se declara como static porque debe ser
llamado por el sistema operativo cuando inicia una aplicacin en Java.
Ejemplo 1.
ImpDemoStatic1.java
class ImpDemoStatic1
{
static int y;
}
IntDemoStatic1.java
class IntDemoStatic1
{
public static void main(String args[])
{
ImpDemoStatic1.y=20;
System.out.println(ImpDemoStatic1.y);
}
}
Como se observa para usar un miembro static se necesita solamente especificar el nombre de la clase,
seguido del operador punto, no se necesita crear un objeto.
Las variables declaradas como static son esencialmente variables globales.
La diferencia entre un mtodo static y un mtodo normal consiste en que el mtodo static puede ser
llamado mediante su nombre de clase, sin haber creado ningn objeto de esa clase. Como un ejemplo se tiene
el mtodo sqrt(), que es un mtodo static dentro de la clase estndar Math de Java.
Ejemplo 2.
MetodoEstatico.java
class MetodoEstatico
{
Elabor: Ing. Jess Pando Barrn(Mocis)
53
static int valor = 100;
static int Dividir()
{
return valor/2;
}
}
DemoMetodoEstatico.java
class DemoMetodoEstatico
{
public static void main(String args[])
{
System.out.println("El valor es "+MetodoEstatico.valor);
System.out.println("Valor del metodo "+ MetodoEstatico.Dividir());
MetodoEstatico.valor=200;
System.out.println("El valor es "+MetodoEstatico.valor);
System.out.println("Valor del metodo "+ MetodoEstatico.Dividir());
}
}
Salida:
Los mtodos declarados como static tienen varias restricciones:
1. Pueden llamar slo a otros mtodos static
2. Deben acceder slo a datos static
3. No tienen una referencia this
Ejemplo 3. Error por la declaracin de un dato static y public
class MetodoEstatico
{
static int valor = 100;
int d=2;
static int Dividir()
{
return valor/d;
}
}
Salida al compilar:
Elabor: Ing. Jess Pando Barrn(Mocis)
54
Algunas veces una clase requiere algunos tipos de inicializacin antes de estar lista para crear
objetos. Por ejemplo, si se necesita establecer una conexin a un sitio remoto o inicializar ciertas variables
static antes de que cualquier mtodo de clase static sea usado.
Para manejar este tipo de situaciones, Java permite declarar un bloque static. Un bloque static es
ejecutado cuando la clase se carga por primera vez. De este modo es ejecutado antes de que la clase pueda
usarse para cualquier otro propsito.
Ejemplo 4. Demostracin de la ejecucin de un bloque static
BloqueEstatico.java
class BloqueEstatico
{
static double raiz2;
static double raiz3;
// metodo constructor
BloqueEstatico (String msg)
{
System.out.println(msg);
}
static
{
System.out.println("Dentro de un bloque static");
raiz2=Math.sqrt(2.0);
raiz3=Math.sqrt(3.0);
}
}
DemoBloqueEstatico.java
class DemoBloqueEstatico
{
public static void main(String args[])
{
BloqueEstatico objeto=new BloqueEstatico("Dentro del constructor");
System.out.println("Raiz cuadrada de 2 ="+BloqueEstatico.raiz2);
System.out.println("Raiz cuadrada de 3 ="+BloqueEstatico.raiz3);
}
}
Salida:
Elabor: Ing. Jess Pando Barrn(Mocis)
55
Paquetes
Cada clase e interfaz en la API de Java pertenece a un paquete que contiene un grupo de clases e
interfaces relacionadas. A medida que las aplicaciones se vuelven ms complejas, los paquetes ayudan a los
programadores a manejar la complejidad de lo componentes de las aplicaciones. Los paquetes tambin
facilitan la reutilizacin de software al permitir que los programas importen clases de otros paquetes. Otro
beneficio de los paquetes es que proporcionan una convencin para nombres de clase nicos.
Los pasos para crear una clase reutilizable son:
1. Se declara una clase como public. Si la clase no es public, slo podr ser utilizada por otras
clases dentro del mismo paquete.
2. Se elije el nombre del paquete y se agrega una declaracin package al archivo de cdigo fuente
para la declaracin de la clase reutilizable. Slo puede haber una declaracin package en un
archivo de cdigo fuente en Java, y sta debe ir antes de cualquier otra declaracin o instruccin
en el archivo.
3. Se compila la clase, de manera que se coloquen en la estructura de directorio del paquete
apropiado.
4. Se importa la clase reutilizable en un programa y se utiliza.
Un paquete es lo que se obtiene al utilizar la palabra clave import para importar una biblioteca
completa, como en:
import java.util.*;
Esto trae la biblioteca de utilidades entera, que es parte de la distribucin estndar de Java.
Ejemplo 1.
Creacin del paquete
EjemploPaquete.java
package paquetes;
public class EjemploPaquete
{
private int x;
private int y;
private int z;
public EjemploPaquete()
{
Elabor: Ing. Jess Pando Barrn(Mocis)
56
establecerVariables( 0, 0, 0 );
}
public void establecerVariables( int a, int b, int c )
{
x = ( ( a >= 0 && a <=5 ) ? a : 0 );
y = ( ( b >= 0 && b <=10 ) ? b : 0 );
z = ( ( c >= 0 && c <=15) ? c : 0 );
}
public int obtenerVariables()
{
return x+y+z;
}
}
Compilacin:
Si es exitosa la compilacin se crea un subdirectorio paquetes
Dentro de esta carpeta se encuentra el archivo EjemploPaquete.class. Despus se codifica la interfaz (la
clase que va a usar el paquete).
UsoEjemploPaquete.java
import paquetes.EjemploPaquete;
public class UsoEjemploPaquete
{
public static void main( String args[] )
{
EjemploPaquete objeto = new EjemploPaquete();
objeto.establecerVariables( 2,5,7 );
System.out.println(objeto.obtenerVariables());
objeto.establecerVariables( -5,12,20 );
System.out.println(objeto.obtenerVariables());
System.exit( 0 );
}
}
Esta clase se compila normalmente con javac, al ejecutarlo se obtiene la siguiente salida:
Elabor: Ing. Jess Pando Barrn(Mocis)
57
Comentarios:
Al colocar una declaracin package al principio de un archivo de cdigo fuente en Java, se indica
que la clase (o clases) declarada(s) en el archivo forma(n) parte del paquete especificado.
Slo las declaraciones package, las declaraciones import y los comentarios pueden aparecer fuera de
las llaves de la declaracin de una clase.
Un archivo de cdigo fuente en Java tiene el siguiente orden: primero una declaracin package (si la
hay), luego las declaraciones import (si las hay), y despus las declaraciones de clase. Slo una de
las declaraciones de clase en un archivo puede ser pblica. Las dems clases en el archivo se colocan
tambin en el paquete, pero son reutilizables desde cualquier otra clase en ese paquete; no pueden
importarse en clases de otros paquetes. Se encuentran en el paquete para dar soporte a la clase
reutilizable del archivo.
En un esfuerzo por proporcionar nombres nicos para cada paquete, Sun Microsystems especifica
una convencin para nombrar paquetes, que deben seguir todos los programadores en Java. Todos
los nombres de paquetes que se vayan a crear deben empezar con el nombre del dominio de Internet
en donde se este desarrollando el software en orden inverso. Por ejemplo, para el dominio de
Internet: instituto.edu, el nombre del paquete debe empezar con edu.instituto. Una vez invertido el
nombre de dominio se puede elegir otro nombre que se desee para el paquete, se puede elegir la ruta
de la red y de la estacin de trabajo para el nombre completo.
Cuando se compila un archivo en Java que contiene una declaracin package, el archivo de clase
resultante se coloca en la estructura de directorio especificado por la declaracin package. Por
ejemplo la declaracin package:
package edu.instituto.mii1.f2c3.progjava
public class Tiempo1 {

}
indica que la clase Tiempo1 debe colocarse en el directorio progjava, los otros nombres edu,
instituto, mii1, f2c3, son tambin directorios. Los nombres de directorio en la declaracin package especifican
la ubicacin exacta de las clases en el paquete. Si estos directorios no existen antes de compilar la clase, el
compilador puede crearlos.
Al compilar una clase en un paquete, la opcin de lnea de comandos (-d) hace que el compilador
javac cree los directorios apropiados, con base en la declaracin package de la clase. Esta opcin
tambin especifica en dnde crear (o ubicar) los directorios. Por ejemplo al ejecutar la sentencia de
compilacin:
javac d . Tiempo1
se crear una rama de directorios en donde existir la clase Tiempo1 en el directorio progjava.
Si no se utiliza la opcin d, entonces se deber copiar o mover el archivo de clase al directorio del
paquete apropiado, despus de compilarlo.
Elabor: Ing. Jess Pando Barrn(Mocis)
58
El nombre del paquete es parte del nombre de la clase, para el programa ejemplo, el nombre de la
clase realmente es:
import ejemplopaquete.ejemplo.Tiempo1;
Este nombre de clase est completamente calificado y se puede utilizar as para diferenciar entre las
clases en el programa y as evitar un conflicto de nombres, lo que se llama como colisin de nombres.
Al compilar PruebaTiempo1, javac debe localizar el archivo .class de Tiempo1 para asegurarse
de que la clase PruebaTiempo1 utilice a la clase Tiempo1 correctamente. El compilador utiliza
un objeto especial llamado cargador de clases para localizar las clases que necesita. El cargador
de clases empieza buscando en las clases estndar de Java que se incluye con el J2SDK.
Despus busca los paquetes adicionales. Java 2 cuenta con un mecanismo de extensin que
permite que se agreguen nuevos paquetes (opcionales) a Java para fines de desarrollo y
ejecucin. Si la clase no se encuentra en la clase estndar de Java ni en las clases de extensin,
el cargador de clases busca en la ruta de clases, la cual contiene una lista de ubicaciones en las
que se almacenan las clases. La ruta de clases consiste en una lista de directorios, cada uno
separado por un separador de directorio: un signo de punto y coma (;) en Windows o un signo de
dos puntos (:) en UNIX/Linux/Mac OS X.
De manera predeterminada, la ruta de clases consiste slo del directorio actual. Sin embargo, la
ruta de clases puede modificarse de la siguiente manera:
1. Proporcionando la opcin classpath al compilador javac o
2. estableciendo la variable de entorno CLASSPATH (variable de entorno que se define
en el sistema operativo).
Por otra parte se comenta acerca de las notaciones oficiales en diferentes plataformas:
Notaciones Plataforma
Pascal .NET Java
NombreMiembro
Ejemplo: DemoClase
Clases
Mtodos
Propiedades
Estructuras
Clases
Camello
nombreMiembro
Ejemplo: demoMetodo
Atributos
Parmetros
Mtodos
Atributos
Parmetros
Ejemplo 3. fundamentos para la creacin de una biblioteca a medida (respetando la nomenclatura de
nombres:
P.java
package mx.edu.instituto.lab1.est01;
public class P
{
public static void sinSalto(String s)
{
System.out.print(s);
}
public static void conSalto(String s)
{
System.out.println(s);
Elabor: Ing. Jess Pando Barrn(Mocis)
59
}
}
PruebaHerramienta.java
import mx.edu.instituto.lab1.est01.P;
public class PruebaHerramienta
{
public static void main(String[] args)
{
P.sinSalto("hola, esta es un prueba ");
P.sinSalto("esto esta en la misma linea ");
P.conSalto(""+100);
P.conSalto(""+100.05);
P.conSalto(""+3.1416);
}
}
Salida:
Ejemplo 2. Uso de dos paquetes
P02.java
package mx.edu.instituto.lab1.est01;
public class P02
{
public static void elevarCuadrado(double valor)
{
System.out.println(Math.pow(valor,2));
}
public static void elevarCubo(double valor)
{
System.out.println(Math.pow(valor,3));
}
}
P03.java
package mx.edu.instituto.lab1.est01;
public class P03
{
public static void raizCuadrada(double valor)
{
System.out.println(Math.pow(valor,1.0/2.0));
}
public static void raizCubica(double valor)
{
Elabor: Ing. Jess Pando Barrn(Mocis)
60
System.out.println(Math.pow(valor,1.0/3.0));
}
}
PruebaFunciones.java
import mx.edu.instituto.lab1.est01.P02;
import mx.edu.instituto.lab1.est01.P03;
public class PruebaFunciones
{
public static void main(String[] args)
{
P02.elevarCuadrado(2.0);
P02.elevarCubo(2.0);
P03.raizCuadrada(8.0);
P03.raizCubica(8.0);
}
}
Arreglos
La tecnologa Java tiene dos maneras de declarar arreglos
La primera forma se puede hacer de la siguiente manera:
char vector1[];
Punto vector2[]; //donde Punto es una clase
O de esta forma

char [] vector1;
Punto [] vector2;
Despus de declarar una referencia de una variable de tipo arreglo, el siguiente paso es crear el
objeto arreglo e inicializar la referencia de la variable con la direccin del nuevo objeto creado:
vector1= new char[20];
vector2 = new point [100];
En realidad ya hemos usado un arreglo de una dimensin en el momento de activar la entrada de
datos por consola, usando el vector o arreglo de una dimensin args[] de tipo cadena, tal como lo muestra el
siguiente ejemplo:
class Demo1Array
{
public static void main(String args[])
{
String cad1=args[0];
String cad2=args[1];
String cad3=args[2];
System.out.println("cad2="+cad2+" "+args[1]+"\n");
for(int i=0; i<=2; i++)
System.out.println(args[i]+"\n");
}
Elabor: Ing. Jess Pando Barrn(Mocis)
61
}
Salida:
La sintaxis para declarar e inicializar un arreglo se puede hacer de tres maneras:
1. tipo identificador_array []
identificador_array = new tipo [longitud];
2. tipo identificador_array[] = new tipo[longitud]
3. tipo [] identificador_array={lista de valores o expresiones separadas por comas}
Considerando que la posicin de los corchetes puede cambiar de posicin antes o despus del
identificador del arreglo.
Ejemplos
Arreglos Unidimensionales
Demo1Array.java
class Demo1Array
{
public static void main(String args[])
{
String cad1=args[0];
String cad2=args[1];
String cad3=args[2];
System.out.println("cad2="+cad2+" "+args[1]+"\n");
for(int i=0; i<=2; i++)
System.out.println(args[i]+"\n");
}
}
Demo2Array.java
class Demo2Array
{
private int vector1[]=new int[100];
private int x=0;
void establecerDatos(int i)
{
vector1[x++]=i;
System.out.println("vector1["+i+"]="+i);
}
int obtenerDatos()
Elabor: Ing. Jess Pando Barrn(Mocis)
62
{
return vector1[--x];
}
}
PruebaDemo2Array.java
class PruebaDemo2Array
{
public static void main(String args[])
{
int n=Integer.parseInt(args[0]);
Demo2Array obj=new Demo2Array();
for(int j=0;j<n;j++)
{
obj.establecerDatos(j);
}
int t=n;
System.out.println("Visualizar arreglo en forma inversa");
for(int j=0;j<n;j++)
{
System.out.println("vector1["+--t+"]="+obj.obtenerDatos());
}
}
}
Demo3Array.java
class Demo3Array
{
int vector1[] = {0,1,2,3,4,5,6,7,8,9};
int obtenerDatos(int i)
{
return vector1[i];
}
}
PruebaDemo3Array.java
class PruebaDemo3Array
{
public static void main(String args[])
{
int n=Integer.parseInt(args[0]);
Demo3Array obj=new Demo3Array();
for(int j=0;j<=n;j++)
{
System.out.println(obj.obtenerDatos(j));
}
}
}
Demo4Array.java
Elabor: Ing. Jess Pando Barrn(Mocis)
63
class Demo4Array
{
private int vector1[] = {0,1,2,3,4,5,6,7,8,9};
Demo4Array(int arreglo[])
{
for (int i=0;i<vector1.length; i++)
arreglo[i]=vector1[i];
}
int obtenerDatos(int i)
{
return vector1[i];
}
}
PruebaDemo4Array.java
class PruebaDemo4Array
{
public static void main(String args[])
{
int n=Integer.parseInt(args[0]);
int numeros[]=new int [10];
Demo4Array obj=new Demo4Array(numeros);
for(int j=0;j<=n;j++)
{
System.out.println(obj.obtenerDatos(j));
}
}
}
Demo6Array.java
class Demo6Array
{
private float vector1[]={1.0f,2.0f,3.3f,4.14f,5.8987f};
int n=vector1.length;
Demo6Array(float arreglo[])
{
establecerDatos(arreglo);
}
void establecerDatos (float arreglo[])
{
for(int j=0; j<n;j++)
{
arreglo[j]=vector1[j];
}
}
Elabor: Ing. Jess Pando Barrn(Mocis)
64
}
PruebaDemo6Array.java
class PruebaDemo6Array
{
public static void main(String args[])
{
float vectorA[] = new float [5];
Demo6Array obj=new Demo6Array(vectorA);
for(int j=0; j<vectorA.length;j++)
System.out.println(vectorA[j]);
}
}
Demo7Array.java
class Demo7Array
{
private String vector1[]={"lunes", "martes", "miercoles", "jueves", "viernes"};
int n=vector1.length;
Demo7Array(String arreglo[])
{
establecerDatos(arreglo);
}
void establecerDatos (String arreglo[])
{
for(int j=0; j<n;j++)
{
arreglo[j]=vector1[j];
}
}
}
PruebaDemo7Array.java
class PruebaDemo7Array
{
public static void main(String args[])
{
String vectorA[] = new String [5];
Demo7Array obj=new Demo7Array(vectorA);
for(int j=0; j<vectorA.length;j++)
System.out.println(vectorA[j]);
}
}
Elabor: Ing. Jess Pando Barrn(Mocis)
65
SumaVectores.java
import javax.swing.*;
class SumaVectores
{
private int limite;
SumaVectores(int l)
{
establecerLimite(l);
}
void establecerLimite(int l)
{
if (l<=0)
limite=0;
else
limite=l;
}
void leer(int arreglo[])
{
for (int i=0;i<limite;i++)
{
arreglo[i]=Integer.parseInt(JOptionPane.showInputDialog("Introduce el elemento
"+i));
}
}
void sumaVectores(int arreglo1[], int arreglo2[], int arreglo3[])
{
for(int i=0;i<limite;i++)
{
arreglo3[i]=arreglo1[i]+arreglo2[i];
}
}
void visualizar(int arreglo[])
{
for(int i=0;i<limite;i++)
{
System.out.println("Elemento ["+i+"]="+arreglo[i]);
}
}
}
PruebaSumaVectores.java
class PruebaSumaVectores
{
public static void main(String args[])
{
int vectorA[] = new int [100];
int vectorB[] = new int [100];
int vectorC[] = new int [100];
int n=Integer.parseInt(args[0]);
SumaVectores obj=new SumaVectores(n);
obj.leer(vectorA);
Elabor: Ing. Jess Pando Barrn(Mocis)
66
obj.leer(vectorB);
obj.sumaVectores(vectorA,vectorB,vectorC);
System.out.println("Datos del vector A ");
obj.visualizar(vectorA);
System.out.println("Datos del vector B ");
obj.visualizar(vectorB);
System.out.println("Resultado de la suma ");
obj.visualizar(vectorC);
}
}
Arreglos Bididimensionales
DemoBidi1.java
class DemoBidi1
{
private int tabla1[][]={{1,2,3},{4,5,6},{7,8,9}};
int n=tabla1.length;
DemoBidi1(int arreglo[][])
{
establecerDatos(arreglo);
}
void establecerDatos (int arreglo[][])
{
for(int i=0;i<n;i++)
for(int j=0; j<n;j++)
{
arreglo[i][j]=tabla1[i][j];
}
}
}
PruebaDemoBidi1.java
class PruebaDemoBidi1
{
public static void main(String args[])
{
int tablaA[][] = new int [3][3];
DemoBidi1 obj=new DemoBidi1(vectorA);
for(int i=0;i<tablaA.length;i++)
for(int j=0; j<tablaA[i].length;j++)
Elabor: Ing. Jess Pando Barrn(Mocis)
67
System.out.println(tablaA[i][j]);
}
}
DemoBidi2.java
class DemoBidi2
{
private int tabla1[][]={{1,2,3},{4},{5,6},{7,8,9}};
int n=tabla1.length;
DemoBidi2(int arreglo[][])
{
establecerDatos(arreglo);
}
void establecerDatos (int arreglo[][])
{
for(int i=0;i<n;i++)
for(int j=0; j<tabla1[i].length;j++)
{
arreglo[i][j]=tabla1[i][j];
}
}
}
Otra manera de inicializar
class DemoBidi2
{
//private int tabla1[][]={{1,2,3},{4},{5,6},{7,8,9}};
private int tabla1[][]=new int [][]{{1,2,3},{4},{5,6},{7,8,9}};
int n=tabla1.length;
DemoBidi2(int arreglo[][])
{
establecerDatos(arreglo);
}
void establecerDatos (int arreglo[][])
{
for(int i=0;i<n;i++)
for(int j=0; j<tabla1[i].length;j++)
{
arreglo[i][j]=tabla1[i][j];
}
}
}
PruebaDemoBidi2.java
class PruebaDemoBidi2
{
public static void main(String args[])
{
Elabor: Ing. Jess Pando Barrn(Mocis)
68
// int tablaA[][] = new int [4][4];
int tablaA[][]={{0,0,0},{0},{0,0},{0,0,0}};
DemoBidi2 obj=new DemoBidi2(tablaA);
for(int i=0;i<tablaA.length;i++)
for(int j=0; j<tablaA[i].length;j++)
{
System.out.println(tablaA[i][j]);
}
}
}
DemoEmpleados.java
class DemoEmpleados
{
int idEmpleado=0;
String nombre="Nombre del empleado";
char estadoCivil='c';
double salarioDiario=0.0;
int edad=0;
DemoEmpleados(int id,String n,char c, double s, int e)
{
idEmpleado=id;
nombre=n;
estadoCivil=c;
salarioDiario=s;
edad=e;
}
void visualizarInformacion()
{
System.out.println("La clave del empleado es:"+ idEmpleado);
System.out.println("El nombre del empleado es:"+ nombre);
System.out.println("El Estado Civil del empleado es:"+ estadoCivil);
System.out.println("El salario del empleado es:"+ salarioDiario);
System.out.println("La edad del empleado es:"+ edad);
}
}
PruebaDemoEmpleados.java
class PruebaDemoEmpleados
{
public static void main(String args[])
{
DemoEmpleados empleados[]=new DemoEmpleados[3];
empleados[0]=new DemoEmpleados(111,"Juan",'c',45.00,40);
empleados[1]=new DemoEmpleados(222,"Ana",'c',44.00,35);
empleados[2]=new DemoEmpleados(333,"Rosa",'c',46.00,38);
DemoEmpleados primerEmpleado=empleados [0];
primerEmpleado.visualizarInformacion();
DemoEmpleados segundoEmpleado=empleados [1];
segundoEmpleado.visualizarInformacion();
empleados[2].visualizarInformacion();
}
Elabor: Ing. Jess Pando Barrn(Mocis)
69
}
Nmeros aleatorios
import java.util.Random;
public class PruebaRandom
{
public static void main(String args[])
{
int x;
Random rnd = new Random();
for (int i = 0; i < 10; i++) {
x=((int) (Math.random()*5)+1);
// x = (int)(rnd.nextDouble() * 5.0)+1;
System.out.println(x);
}
}
}
PruebaRandom3.java
public class PruebaRandom2
{
public static void main(String args[])
{
int x;
for (int i = 0; i < 10; i++) {
x=((int) (Math.random()*5)+1);
System.out.println(x);
}
}
}
Burbuja.java
import java.util.Arrays;
public class Burbuja
{
public static void main(String args[])
{
int aux;
int a[]={5,3,4,4,1,2,8,10,11};
Arrays.sort(a);
for(int i=0;i<a.length;i++)
System.out.println(a[i]);
}
}
RestaConjuntos.java
Elabor: Ing. Jess Pando Barrn(Mocis)
70
public class RestaConjuntos
{
public static void main(String args[])
{
int v[]={1,4,2,2,3};
int s[]={1};
int v_s[]={0,0,0};
int i,j,k;
System.out.println("Vector v");
for(i=0;i<v.length;i++)
System.out.print("v["+i+"]="+v[i]);
System.out.println("\n");
System.out.println("Vector s");
for(j=0;j<s.length;j++)
System.out.println("s["+j+"]="+s[j]);
System.out.println("\n");
here:
for(i=0;i<v.length;i++)
{
System.out.println("i="+i);
k=0;
j=0;
while(j<s.length)
{
System.out.println("v["+i+"]="+v[i]+" "+"s["+j+"]="+s[j]);
if(v[i]==s[j])
continue here;
else
j++;
}
k++;
v_s[k]=v[i];
System.out.println("v_s[k]="+v_s[k]);
}
}
}
Elabor: Ing. Jess Pando Barrn(Mocis)
71
Herencia
Al crear una clase, en vez de declarar miembros (variables y mtodos) completamente nuevos, el
programador puede designar que la nueva clase herede los miembros de una clase existente. Esta clase
existente se conoce como superclase y la nueva clase se conoce como subclase. (Otros lenguajes de
programacin, como C++, se refieren a la superclase como la clase base y la subclase como clase
derivada.). Una vez creada, cada subclase puede convertirse en superclase de futuras subclases. Una
subclase generalmente agrega sus propias variables y mtodos. Por lo tanto, una subclase es ms
especfica que su superclase y representa a un grupo ms especializado de objetos. Generalmente, la
subclase exhibe los comportamientos de su superclase junto con comportamientos adicionales especficos
de esta subclase. La superclase directa es la superclase a partir de la cual la subclase hereda en forma
explcita. Una superclase indirecta se hereda de dos o ms niveles arriba en la jerarqua de clases, la cual
define las relaciones de herencia entre las clases. En Java, la jerarqua de clases empieza con la clase
Object (en el paquete java.lang), a partir de la cual heredan todas las clases en Java, ya sea en forma
directa o indirecta. En el caso de la herencia simple, una clase deriva de una superclase. Java a diferencia
de C++, no soporta la herencia mltiple (que ocurre cuando una clase se deriva de ms de una superclase
directa).
La experiencia en la creacin de sistemas de software indica que algunas cantidades considerables de
cdigo tratan con casos especiales, estrechamente relacionados. Cuando los programadores se preocupan
con casos especiales, los detalles pueden oscurecer el panorama general. Con la programacin orientada a
objetos, los programadores se enfocan en los elementos comunes entre los objetos en el sistema, en vez
de enfocarse en los casos especiales. A este proceso se le conoce como abstraccin.
La relacin es un representa a la herencia; en este tipo de relacin, un objeto de una subclase
puede tratarse tambin como un objeto de sus superclases. Por ejemplo, un auto es un vehculo.
En contraste, la relacin tiene un identifica a la composicin; en este tipo de relacin, un objeto
contiene una o ms referencias a objetos como miembros. Por ejemplo, un auto tiene un volante de
direccin.
A menudo, un objeto de una clase es un objeto de otra clase tambin. Por ejemplo, en la geometra
un rectngulo es un cuadriltero (al igual que los cuadrados, los paralelogramos y los trapezoides). Por lo
tanto, en Java puede decirse que la clase Rectangulo es una subclase. Un rectngulo es un tipo especfico
de cuadriltero, pero es incorrecto decir que todo cuadriltero es un rectngulo.
Elabor: Ing. Jess Pando Barrn(Mocis)
public class Empleado {
public String nombre = ;
public double salario;
public Date fechaCump;
public String obtenerDetalles()
{
. . .
}
}
public class Administrador {
public String nombre = ;
public double salario;
public Date fechaCump;
public String departamento;
public String obtenerDetalles()
{
. . .
}
}
72
Cada flecha (en UML la representacin es con la punta de flecha vaca) en la jerarqua representa una
relacin es un. Por ejemplo, se puede decir: Un Crculo es un(a) FiguraBidimensional. Figura es una
superclase directa de FiguraBidimensional y FiguraTridimensional y es una superclase indirecta de toda
la demas clase
La clase FiguraBidimensional podra declararse en Java de la siguiente manera:
Public class FiguraBidimensional extends Figura
|Las relaciones de herencia forman estructuras jerrquicas en forma de rbol. Una superclase existe
en una relacin jerrquica con sus subclases. Aunque las clases pueden existir de manera independiente,
cuando participan en relaciones de herencia se afilian con otras clases. Una clase se convierte ya sea en
una superclase, proporcionando datos y comportamientos a otras clases, o en una subclase, heredando sus
datos y comportamientos de otras clases.
Es posible tratar a los objetos de superclase y a los objetos de subclase de manera similar; sus
similitudes se expresan en los miembros de la superclase. Los objetos de todas las clases que extienden a
una superclase comn pueden tratarse como objetos de esa superclase (es decir, dichos objetos tienen una
relacin es un con la superclase). Sin embargo, los objetos de una superclase no pueden tratarse como
objetos de sus subclases. Por ejemplo, todos los autos son vehculos pero no todos los vehculos son
autos.
Un problema con la herencia es que una subclase puede heredar mtodos que no necesita, o que no
debe tener. A pesar de que un mtodo de superclase sea apropiado para una subclase, a menudo esa
subclase requiere que el mtodo realice su tarea de una manera especfica para la subclase. En dichos
Elabor: Ing. Jess Pando Barrn(Mocis)
Figura
FiguraBidimensional FiguraTridimensional
Crculo Cuadrado Triangulo Esfera Cubo Tetraedro
public class Empleado {
public String nombre = ;
public double salario;
public Date fechaCump;
public String obtenerDetalles()
{
. . .
}
}
public class Administrador {
public String nombre = ;
public double salario;
public Date fechaCump;
public String departamento;
public String obtenerDetalles()
{
. . .
}
}
public class Empleado {
public String nombre = ;
public double salario;
public Date fechaCump;
public String obtenerDetalles()
{
. . .
}
}
73
casos, la subclase puede sobrescribir (redefinir) el mtodo de la superclase con una implementacin
apropiada.
Miembros protected
El uso del acceso protected ofrece un nivel intermedio de acceso entre public y private. Los
miembros protected de una superclase pueden ser utilizados por los miembros de esa superclase, por los
miembros de cualquier clase que se derive de esa superclase y por los miembros de otras clases en el
mismo paquete. (Los mtodos de una subclase no pueden tener acceso a los miembros private de su
superclase).
Los mtodos de una subclase pueden referirise a los miembros public y protected que se hereden de la
superclase con slo utilizar los nombres de los miembros. Cuando un mtodo de la subclase sobreescribe
al mtodo de la superclase, ste ltimo puede utilizarse desde la subclase si se antepone a su nombre la
palabra clave super y un punto.
Otro punto de vista de la herencia
En algunas ocasiones se necesita crear un modelo ms especializado, por ejemplo:
El siguiente modelo muestra la duplicacin de datos entre las clases Empleado y Administrador.
Como se observa se duplican los datos de las dos clases. Por lo tanto, una clase para minimizar este
error llamada sublclase
Elabor: Ing. Jess Pando Barrn(Mocis)
Empleado
+nombre : String =
+salario : double
+fechaCump : Date
+obtenerDetalles() : String
public class Empleado {
public String nombre = ;
public double salario;
public Date fechaCump;
public String obtenerDetalles()
{
. . .
}
}
Administrador
+nombre : String =
+salario : double
+fechaCump : Date
+departamento : String
+obtenerDetalles() : String
public class Administrador {
public String nombre = ;
public double salario;
public Date fechaCump;
public String departamento;
public String obtenerDetalles()
{
. . .
}
}
public class Empleado {
public String nombre = ;
public double salario;
public Date fechaCump;
public String obtenerDetalles()
{
. . .
}
}
74
En los lenguajes orientados a objetos existen mecanismos especiales que permiten definir una clase
en trminos de una definicin de clase previa.
Java permite extender una sola clase a otra. Esta restriccin es llamada herencia simple.
La siguiente figura muestra la clase base Empleado y tres subclases: Ingeniero, Administrador y
Secretaria. La clase Administrador tiene una subclase Director.
Elabor: Ing. Jess Pando Barrn(Mocis)
Empleado
+nombre : String =
+salario : double
+fechaCump : Date
+obtenerDetalles() : String
public class Empleado {
public String nombre = ;
public double salario;
public Date fechaCump;
public String obtenerDetalles()
{
. . .
}
}
Administrador
+departamento : String
public class Administrador extends Empleado {
public String departamento;
75
Control de acceso
Las variables y los mtodos pueden tener cuatro niveles de acceso: public, protected, default
o private. Las clases pueden ser pblicas o default.
Una variable o mtodo que est marcado como private es accesible nicamente por mtodos
que son miembros de la misma clase como las variables y mtodos private.
Una variable, mtodo o clase tiene una accesibilidad por default si no tiene un modificador
de proteccin explcito como parte de su declaracin . Tal accesibilidad significa que el
acceso es permitido desde cualquier mtodo en las clases que son miembros del mismo
paquete. Esto es frecuentemente llamado package-friendly.
Un mtodo o variable protected es accesible desde el mtodo en las clases que son
miembros del mismo paquete y desde cualquier mtodo en cualquier subclase.
Una variable o mtodo marcado con el modificador public es universalmente accesible.
Criterios de Accesibilidad
Modificador Misma clase Mismo paquete subclase Universal
Private Si
Default Si Si
Protected Si Si Si
Public Si Si Si Si
Mtodos overriding
Una subclase puede modificar su comportamiento heredado de una clase principal
Elabor: Ing. Jess Pando Barrn(Mocis)
Empleado
+nombre : String =
+salario : double
+fechaCump : Date
+obtenerDetalles() : String
Administrador
+departamento : String
Director
+adjudicarVehiculo : double
+incrementarConcesion()
Ingeniero
Secretaria
76
Una subclase puede crear un mtodo con diferente funcionalidad que el mtodo de su clase principal
pero con el mismo:
o Nombre
o Tipo de retorno
o Lista de argumentos.
Ejemplos de herencia
Padre.java
class Padre
{
Padre()
{
System.out.println("Este es el constructor de la clase Padre");
}
}
Hijo.java
class Hijo extends Padre
{
Hijo()
{
System.out.println("Este es el constructor de la clase Hijo");
}
}
PruebaPadreHijo.java
class PruebaPadreHijo
{
public static void main(String args[])
{
Hijo objHijo = new Hijo();
}
}
Salida:
Animal.java
class Animal
{
Animal()
{
System.out.println("Este es el constructor de la clase Animal");
}
}
Elabor: Ing. Jess Pando Barrn(Mocis)
77
Perro.java
class Perro extends Animal
{
Perro()
{
System.out.println("Este es el constructor de la clase Perro");
}
}
PruebaAnimalPerro.java
class PruebaAnimalPerro
{
public static void main(String args[])
{
Perro objPerro = new Perro();
}
}
Salida:
Padre2.java
class Padre2
{
Padre2()
{
System.out.println("Este es el constructor de la clase Padre");
}
}
Hijo2.java
class Hijo2 extends Padre2
{
}
PruebaPadreHijo2.java
class PruebaPadreHijo2
{
public static void main(String args[])
{
Hijo2 objHijo = new Hijo2();
}
}
Salida:
Elabor: Ing. Jess Pando Barrn(Mocis)
78
Padre3.java
class Padre3
{
Padre3()
{
System.out.println("Este es el constructor de la clase Padre");
}
}
Hijo3.java
class Hijo3 extends Padre3
{
Hijo3()
{
super();
System.out.println("Este es el constructor de la clase Hijo");
}
}
PruebaPadreHijo3.java
class PruebaPadreHijo3
{
public static void main(String args[])
{
Hijo3 objHijo = new Hijo3();
}
}
Salida:
Padre4.java
class Padre4 extends object
{
Padre4()
{
super();
System.out.println("Este es el constructor de la clase Padre");
}
}
Elabor: Ing. Jess Pando Barrn(Mocis)
79
Hijo4.java
class Hijo4 extends Padre
{
Hijo4()
{
super();
System.out.println("Este es el constructor de la clase hijo");
}
}
PruebaPadreHijo4.java
class PruebaPadreHijo4
{
public static void main(String args[])
{
Hijo4 objHijo = new Hijo4();
}
}
Salida:
SuperClase.java
class SuperClase
{
SuperClase()
{
System.out.println("Constructor de la superclase");
}
void metodoSuper()
{
System.out.println("Dentro del metodoSuper");
}
}
SubClase.java
class SubClase extends SuperClase
{
SubClase()
{
System.out.println("Constructor de la subclase");
}
void metodoSuper()
{
super.metodoSuper();
System.out.println("Dentro del metodoSuper de la subclase");
}
}
Elabor: Ing. Jess Pando Barrn(Mocis)
80
PruebaSuperClase.java
public class PruebaSuperClase
{
public static void main(String args[])
{
SubClase obj = new SubClase();
obj.metodoSuper();
}
}
Salida:
SuperClase2.java
class SuperClase2
{
SuperClase2()
{
System.out.println("Constructor de la superclase");
}
String metodoSuper()
{
return "Metodo de la SuperClase";
}
}
SubClase2.java
class SubClase2 extends SuperClase2
{
SubClase2()
{
System.out.println("Constructor de la subclase");
}
String metodoSuper()
{
return super.metodoSuper()+" y dentro del metodoSuper de la subclase";
}}
PruebaSuperClase2.java
public class PruebaSuperClase2
{
public static void main(String args[])
{
SubClase2 obj = new SubClase2();
System.out.println(obj.metodoSuper());
}}
Elabor: Ing. Jess Pando Barrn(Mocis)
81
Salida:
Empleado5.java
public class Empleado5
{
protected String nombre;
protected double salario;
Empleado5(String n, double s)
{
establecerValores(n,s);
}
public void establecerValores(String n, double s)
{
nombre=n;
salario=s;
}
public String obtenerDetalles()
{
return "Nombre: "+nombre+"\n"+"Salario: "+salario;
}
}
Administrador5.java
public class Administrador5 extends Empleado5
{

protected String departamento;
Administrador5(String n, double s,String d)
{
super(n,s);
establecerValores(d);
}
public void establecerValores(String d)
{
departamento=d;
}
public String obtenerDetalles()
{
return "Nombre: "+nombre+"\n"+"Salario: "+salario+"\n"+"Administrador
de:"+departamento;
}
}
Elabor: Ing. Jess Pando Barrn(Mocis)
82
PruebaEmpleado5.java
class PruebaEmpleado5
{
public static void main(String args[])
{
Empleado5 empleado = new Empleado5("Alfa",50.0);
Administrador5 administrador = new Administrador5("Lolo",5.6,"Produccion");
System.out.println(administrador.obtenerDetalles());
System.out.println(empleado.obtenerDetalles());
}
}
Salida:
Empleado6.java
public class Empleado6 extends Object
{
protected String nombre;
protected double salario;
Empleado6(String n, double s)
{
establecerValores(n,s);
}
public void establecerValores(String n, double s)
{
nombre=n;
salario=s;
}
public String obtenerDetalles()
{
return "Nombre: "+nombre+"\n"+"Salario: "+salario;
}
}
Administrador6.java
public class Administrador6 extends Empleado6
{

protected String departamento;
Administrador6(String n, double s,String d)
{
super(n,s);
establecerValores(d);
}
public void establecerValores(String d)
{
Elabor: Ing. Jess Pando Barrn(Mocis)
83
departamento=d;
}
public String obtenerDetalles()
{ return super.obtenerDetalles()+"\n"+"Administrador de:"+departamento;
}
}
PruebaEmpleado6.java
class PruebaEmpleado6
{
public static void main(String args[])
{
String nombreEmpleado=args[0];
double salarioEmpleado=Double.parseDouble(args[1]);
String deptoEmpleado=args[2];
Administrador6 administrador = new
Administrador6(nombreEmpleado,salarioEmpleado,deptoEmpleado);
System.out.println(administrador.obtenerDetalles());
}
}
Salida:
Elabor: Ing. Jess Pando Barrn(Mocis)
84
A.java
class A extends Object
{
A()
{
super();
System.out.println("constructor de A");
}
}
class B extends A
{
B()
{
super();
System.out.println("constructor de B");
}
}
class PruebaB extends B
{
PruebaB()
{
super();
System.out.println("constructor de PruebaB");
}
public static void main(String args[])
{
final String L="_________________________________";
PruebaB obj1 = new PruebaB();
System.out.println(L);
B obj2 = new B();
System.out.println(L);
A obj3 = new A();
}
}
Salida:
Elabor: Ing. Jess Pando Barrn(Mocis)
85
Composicin
A.java
public class A
{
A()
{
System.out.println("Dentro del constructor A");
}
}
B.java
public class B extends A
{
private C v1;
B(C var2)
{
System.out.println("Dentro del constructor B");
System.out.println(var2.obtener());
}
}
C.java
public class C
{
private int dato;
C(int d)
{
establecer(d);
}
void establecer(int d)
{
dato=d;
}
int obtener()
{
return dato;
}
}
PruebaA.java
public class PruebaA
{
public static void main(String args[])
{
C var2=new C(10);
B obj = new B(var2);
System.out.println(var2.obtener());
}
Elabor: Ing. Jess Pando Barrn(Mocis)
86
}
Salida:
Herencia y Composicin
Empleado7.java
public class Empleado7 extends Object
{
protected String nombre;
protected double salario;
protected Fecha2 fechaCont;
protected Fecha2 fechaNac;
Empleado7(String n, double s,Fecha2 c, Fecha2 na)
{
establecerValores(n,s,c,na);
}
public void establecerValores(String n, double s,Fecha2 c, Fecha2 na)
{
nombre=n;
salario=s;
fechaCont=c;
fechaNac=na;
}
public String obtenerDetalles()
{
return "Nombre: "+nombre+"\n"+"Salario: "+salario+"\n"+fechaCont.obtenerFecha()
+"\n"+fechaNac.obtenerFecha();
}
}
Administrador7.java
public class Administrador7 extends Empleado7
{

private String departamento;
Administrador7(String n, double s,String d,Fecha2 c, Fecha2 na)
{
super(n,s,c,na);
establecerValores(d);
}
public void establecerValores(String d)
Elabor: Ing. Jess Pando Barrn(Mocis)
87
{
departamento=d;
}
public String obtenerDetalles()
{
return super.obtenerDetalles()+"\n"+"Administrador de:"+departamento;
}
}
Fecha2.java
public class Fecha2
{
private int dia;
private int mes;
private int annio;
Fecha2(int d, int m, int a)
{
establecerDatos(d,m,a);
}
void establecerDatos(int d, int m, int a)
{
if(d>=0 && d<=31)
dia=d;
else
dia=0;
if(m>=0 && m<=12)
mes=m;
else
mes=0;
if(a>=2000 && a<=2010)
annio=a;
else
annio=0;
}
String obtenerFecha()
{
return dia+"/"+mes+"/"+annio;
}
}
PruebaEmpleado7.java
class PruebaEmpleado7
{
public static void main(String args[])
{
String nombreEmpleado=args[0];
double salarioEmpleado=Double.parseDouble(args[1]);
String deptoEmpleado=args[2];
int diaCont=Integer.parseInt(args[3]);
int mesCont=Integer.parseInt(args[4]);
int annioCont=Integer.parseInt(args[5]);
Elabor: Ing. Jess Pando Barrn(Mocis)
88
int diaNac=Integer.parseInt(args[6]);
int mesNac=Integer.parseInt(args[7]);
int annioNac=Integer.parseInt(args[8]);
Fecha2 cont = new Fecha2(diaCont,mesCont,annioCont);
Fecha2 nac = new Fecha2(diaNac,mesNac,annioNac);
Administrador7 administrador = new
Administrador7(nombreEmpleado,salarioEmpleado,deptoEmpleado,cont,nac);
System.out.println(administrador.obtenerDetalles());
Empleado7 empleado = new Empleado7(nombreEmpleado,salarioEmpleado,cont,nac);
System.out.println(empleado.obtenerDetalles());
}
}
Salida:
Clases y mtodos abstractos
Existen casos en los que es conveniente declarar clases para los cuales el programador no pretende
instanciar objetos. Dichas clases se denominan clases abstractas. Debido a que stas se utilizan slo como
superclases en las jerarquas de herencias, se refiere a esas clases como superclases abstractas. Estas clases no
pueden utilizarse para instanciar objetos porque, las clases abstractasestn incompletas. Las subclases deben
declarar las partes faltantes.
El propsito de una clase abstracta es proporcionar una superclase apropiada, a partir de la cual
puedan heredar otras clases. Las clases que puedan usarse para instanciar objetos se conocen como clases
concretas. Dichas clases proporcionan implementaciones de todos los mtodos que declaran. Las clases
abstractas son demasiado genricas como para crear objetos reales; slo especifican lo que las subclases
tienen en comn.
Una jerarqua de herencia no necesita contener clases abstractas. Sin embargo, comnmente se
utilizan jerarquas de clase encabezadas por superclases abstractas para reducir las dependencias de cdigo
cliente en tipos de subclases especficas.
Para que una clase sea abstracta, se debe declarar con la palabra clave abstract. Una clase abstracta
normalmente contiene uno o ms mtodos abstractos (los mtodos static no pueden ser abstractos). Un
mtodo abstracto es un mtodo con la palabra clave abstract en su declaracin.
Los mtodos abstractos no proporcionan implementaciones. Una clase que contiene mtodos
abstractos debe declararse como una clase abstracta. Cada subclase concreta de una superclase abstracta debe
proporcionar implementaciones concretas de los mtodos abstractos de la superclase. Los constructores no se
heredan, por lo que no pueden declararse como abstract.
Una clase abstracta declara los atributos y comportamientos de las diversas clases en una jerarqua de
clases: adems, generalmente contiene uno o ms mtodos abstractos que las subclases debe
sobrescribir. Las variables de instancia y los mtodos concretos de una clase abstracta se sujetan a las
reglas normales de herencia.
Al tratar de instanciar un objeto de una clase abstracta se produce un error de compilacin.
El no poder implementar un mtodo abstracto de la superclase en una subclase es un error de
compilacin, a menos que la subclase tambin se declare como abstract.
Elabor: Ing. Jess Pando Barrn(Mocis)
89
PruebaClasesAbstractas.java
abstract class A
{
abstract void metodoA();
void metodoB()
{
System.out.println("Dentro del metodo B de la clase A");
}
abstract int metodoC();
}
class B extends A
{
void metodoA()
{
System.out.println("Dentro del metodo A de la clase B");
}
void metodoB()
{
super.metodoB();
System.out.println("Dentro del metodo B de la clase B -sobreescribiendo-");
}
int metodoC()
{
System.out.println("Dentro del metodo C de la clase B");
return 10;
}
}
class PruebaClasesAbstractas
{
public static void main(String args[])
{
B obj=new B();
obj.metodoA();
obj.metodoB();
System.out.println(obj.metodoC());
}
}
Salida:
Elabor: Ing. Jess Pando Barrn(Mocis)
90
Interfaces
La palabra clave interfaz lleva el concepto de abstraccin un paso ms all. Se podra pensar que es
una clase abstracta pura. Permite establecer la forma de una clase: nombre de mtodos, listas de parmetros
y tipos de retorno, pero no cuerpos de mtodos. Una interfaz tambin puede contener campos, pero stos son
implcitamente estticos y constantes. Una interfaz proporciona slo la forma, pero no la implementacin.
Una interfaz dice: Esta es la apariencia que tendrn todas las clases que implementen esta interfaz.
Por consiguiente, cualquier cdigo que use una interfaz particular sabe qu mtodos deberan ser invocados
por esa interfaz y eso es todo. Por tanto se usa la interfaz para establecer un protocolo entre clases.
Para crear una interfaz, se usa la palabra clave interface en vez de la palabra clave class. Al igual que
una clase, se le puede anteponer la palabra public a interface.
Para hacer una clase que se ajuste a una interfaz particular (o a un grupo de interfaces), se usa la
palabra clave implements. Se est diciendo La interfaz contiene la apariencia, pero ahora voy a decir cmo
funciona. Por lo dems, es como la herencia.
Si la clase no implementa a ninguno de los mtodos de la interfaz, significa que la clase es abstracta
y debe declararse como abstract. Implementar una interfaz es como firmar un contrato con el compilador que
diga: Declarar todos los mtodos especficados por la interfaz.
El no implementar uno de los mtodos de una interfaz en una clase que implemente a esa interfaz
resulta en un error de compilacin, el cual indica que la clase debe declararse como abstract.
Una interaz se utiliza generalmente en lugar de una clase abstracta, cuando no hay una
implementacin predeterminada que heredar (es decir, no hay variables de instancia ni implementaciones de
mtodos predeterminados).
PruebaClaseInterfaz.java
interface A
{
public void metodoA();
public void metodoB();
public int metodoC();
}
class B implements A
{
public void metodoA()
{
System.out.println("Dentro del metodo A de la clase B");
}
public void metodoB()
{
System.out.println("Dentro del metodo B de la clase B ");
}
public int metodoC()
{
System.out.println("Dentro del metodo C de la clase B");
return 10;
}
}
class PruebaClasesInterfaz
{
public static void main(String args[])
{
B obj=new B();
obj.metodoA();
Elabor: Ing. Jess Pando Barrn(Mocis)
91
obj.metodoB();
System.out.println(obj.metodoC());
}}
Salida:
Simulacin de la Herencia mltiple
PruebaHerenciaMultiple.java
interface A1
{
public void metodoA();
public void metodoB();
public int metodoC();
}
class A2
{
void metodoD()
{
System.out.println("Dentro del metodo B de la clase A2");
}
String metodoE()
{
return "MetodoE()";
}
}
class B extends A2 implements A1
{
public void metodoA()
{
System.out.println("Dentro del metodo A de la clase B");
}
public void metodoB()
{
System.out.println("Dentro del metodo B de la clase B ");
}
public int metodoC()
{
System.out.println("Dentro del metodo C de la clase B");
return 10;
}
public void metodoD()
{
super.metodoD();
System.out.println("Dentro del metodo D de la clase B");
}
public String metodoE()
{
return super.metodoE()+" Dentro del metodo E de la clase A2";
Elabor: Ing. Jess Pando Barrn(Mocis)
92
}
}
class PruebaHerenciaMultiple
{
public static void main(String args[])
{
B obj=new B();
obj.metodoA();
obj.metodoB();
System.out.println(obj.metodoC());
obj.metodoD();
System.out.println(obj.metodoE());
}
}
Salida:
Herencia mltiple con una clase abstracta
PruebaHerenciaMultiple.java
interface A1
{
public void metodoA();
public void metodoB();
public int metodoC();
}
abstract class A2
{
abstract void metodoD();
abstract String metodoE();
}
class B extends A2 implements A1
{
public void metodoA()
{
System.out.println("Dentro del metodo A de la clase B");
}
public void metodoB()
{
System.out.println("Dentro del metodo B de la clase B ");
}
public int metodoC()
{
System.out.println("Dentro del metodo C de la clase B");
Elabor: Ing. Jess Pando Barrn(Mocis)
93
return 10;
}
public void metodoD()
{
System.out.println("Dentro del metodo D de la clase B");
}
public String metodoE()
{
return " Dentro del metodo E de la clase B";
}
}
class PruebaHerenciaMultiple
{
public static void main(String args[])
{
B obj=new B();
obj.metodoA();
obj.metodoB();
System.out.println(obj.metodoC());
obj.metodoD();
System.out.println(obj.metodoE());
}
}
Salida:
interface A1
{
public void metodoA();
public void metodoB();
public int metodoC();
}
class A2
{
public void metodoD()
{
}
public String metodoE()
{
return "metodoE()";
}
}
interface A3
{
public void metodoF();
}
Elabor: Ing. Jess Pando Barrn(Mocis)
94
class B extends A2 implements A1, A3
{
public void metodoA()
{
System.out.println("Dentro del metodo A de la clase B");
}
public void metodoB()
{
System.out.println("Dentro del metodo B de la clase B ");
}
public int metodoC()
{
System.out.println("Dentro del metodo C de la clase B");
return 10;
}
public void metodoD()
{
System.out.println("Dentro del metodo D de la clase B");
}
public String metodoE()
{
return super.metodoE()+" Dentro del metodo E de la clase B";
}
public void metodoF()
{
System.out.println("metodoF()");
}
}
class PruebaHerenciaMultiple
{
public static void main(String args[])
{
B obj=new B();
obj.metodoA();
obj.metodoB();
System.out.println(obj.metodoC());
obj.metodoD();
System.out.println(obj.metodoE());
obj.metodoF();
}
}
Salida:
Elabor: Ing. Jess Pando Barrn(Mocis)
95
Polimorfismo
Ejemplo 1
PruebaCastingPadreHijo2.java
public class CastingPadre
{
CastingPadre()
{
System.out.println("Constructor Clase Padre");
}
public void visualizarPadre()
{
System.out.println("Visualizar metodo Padre");
}
public void visualizar()
{
System.out.println("Metodo visualizar() Padre");
}
}
public class CastingHijo extends CastingPadre
{
CastingHijo()
{
System.out.println("Constructor Clase Hijo");
}
public void visualizarHijo()
{
System.out.println("Visualizar metodo Hijo");
}
public void visualizar()
{
super.visualizar();
System.out.println("Metodo visualizar() Hijo");
}}
public class PruebaCastingPadreHijo2
{
public static void main(String args[])
{
System.out.println("CastingHijo objHijo = new CastingHijo()");
CastingHijo objHijo = new CastingHijo();
objHijo.visualizarPadre();
objHijo.visualizar();
System.out.println("\n");
// Marca error de tipos incompatibles
// CastingHijo obj = new CastingPadre();
// obj.visualizarPadre();
Elabor: Ing. Jess Pando Barrn(Mocis)
96
// obj.visualizar();
System.out.println("CastingPadre obj = new CastingHijo()");
CastingPadre obj = new CastingHijo();
obj.visualizarPadre();
obj.visualizar();
System.out.println("\n");
System.out.println("CastingPadre objPadre = new CastingPadre()");
CastingPadre objPadre = new CastingPadre();
objPadre.visualizarPadre();
objPadre.visualizar();
System.out.println("\n");
System.out.println("objPadre=objHijo");
objPadre=objHijo;
objPadre.visualizarPadre();
objPadre.visualizar();
// Marca un error
//objPadre.visualizarHijo();
System.out.println("\n");
//Marca error esta asignacin
//objHijo=objPadre;
System.out.println("objHijo=(CastingHijo)objPadre");
objHijo=(CastingHijo)objPadre;
objHijo.visualizarHijo();
objHijo.visualizar();
objHijo.visualizarPadre();
System.out.println("\n");
System.out.println("objPadre=(CastingPadre)objHijo");
objPadre=(CastingPadre)objHijo;
objPadre.visualizar();
System.out.println("\n");
}}
Salida:
Elabor: Ing. Jess Pando Barrn(Mocis)
97
Ejemplo 2
Una compaa
3
paga a sus empleados en forma semanal. La compaa tiene cuatro tipos de empleados:
Empleados asalariados que reciben un salario semanal fijo, sin importar el nmero de horas
trabajadas.
Empleados por horas, que reciben un sueldo por hora y pago por tiempo extra.
Empleados por comisin, que reciben un porcentaje de sus ventas.
Empleados asalariados por comisin, que reciben un salario base ms un porcentaje de sus ventas.
Para este periodo de pago la compaa ha decidido compensara a los empleados asalariados por comisin,
agregando un 10% a sus salarios.
La compaa desea implementar una aplicacin en Java que realice sus clculos de nmina en forma
polimrfica.
Diagrama UML que representa las clases involucradas en el problema
3
Ejemplo tomado del libro de Deitel & Deitel pag. 408
Elabor: Ing. Jess Pando Barrn(Mocis)
98
Empleado
EmpleadoAsalariado EmpleadoPorComision EmpleadoPorHoras
EmpleadoBaseMasComision
<<abstract>>
Empleado.java
public abstract class Empleado
{
private String primerNombre, apellidoPaterno, numeroSeguroSocial;
public Empleado(String nombre, String apellido, String ssn)
{
primerNombre=nombre;
apellidoPaterno=apellido;
numeroSeguroSocial=ssn;
}
public void establecerPrimerNombre(String nombre)
{
primerNombre=nombre;
}
public String obtenerPrimerNombre()
{
return primerNombre;
}
public void establecerApellidoPaterno(String apellido)
{
apellidoPaterno=apellido;
}
Elabor: Ing. Jess Pando Barrn(Mocis)
99
public String obtenerApellidoPaterno()
{
return apellidoPaterno;
}
public void establecerNumeroSeguroSocial(String numero)
{
numeroSeguroSocial=numero;
}
public String obtenerNumeroSeguroSocial()
{
return numeroSeguroSocial;
}
public String toString()
{
return obtenerPrimerNombre()+" "+obtenerApellidoPaterno()+"\nnumero de seguro social:
" + obtenerNumeroSeguroSocial();
}
public abstract double ingresos();
}
EmpleadoAsalariado.java
public class EmpleadoAsalariado extends Empleado
{
private double salarioSemanal;
public EmpleadoAsalariado(String nombre, String apellido, String numeroSeguroSocial, double
salario)
{
super(nombre,apellido,numeroSeguroSocial);
establecerSalarioSemanal(salario);
}
public void establecerSalarioSemanal(double salario)
{
salarioSemanal=salario<0.0?0.0:salario;
}
public double obtenerSalarioSemanal()
{
return salarioSemanal;
}
public double ingresos()
{
return obtenerSalarioSemanal();
}
public String toString()
{
return "\nempleado asalariado: " +super.toString();
}
}
EmpleadoPorComision.java
public class EmpleadoPorComision extends Empleado
{
Elabor: Ing. Jess Pando Barrn(Mocis)
100
private double ventasTotales, tasaComision;
public EmpleadoPorComision(String nombre, String apellido, String numeroSeguroSocial, double
ventasTotalesSemana, double porcentaje)
{
super(nombre,apellido,numeroSeguroSocial);
establecerVentasTotales(ventasTotalesSemana);
establecerTasaComision(porcentaje);
}
public void establecerTasaComision(double tasa)
{
tasaComision=(tasa>0.0 && tasa <1.0) ? tasa:0.0;
}
public double obtenerTasaComision()
{
return tasaComision;
}
public void establecerVentasTotales(double ventas)
{
ventasTotales=ventas < 0.0 ? 0.0 : ventas;
}
public double obtenerVentasTotales()
{
return ventasTotales;
}
public double ingresos()
{
return obtenerTasaComision() * obtenerVentasTotales();
}
public String toString()
{
return "\nempleado por comision: " +super.toString();
}}
EmpleadoPorHoras.java
public class EmpleadoPorHoras extends Empleado
{
private double sueldo,horas;
public EmpleadoPorHoras(String nombre, String apellido, String numeroSeguroSocial, double
sueldoPorHora, double horasTrabajadas)
{
super(nombre,apellido,numeroSeguroSocial);
establecerSueldo(sueldoPorHora);
establecerHoras(horasTrabajadas);
}
public void establecerSueldo(double cantidadSueldo)
{
sueldo=cantidadSueldo<0.0 ? 0.0 : cantidadSueldo;
}
public double obtenerSueldo()
{
return sueldo;
}
public void establecerHoras(double horasTrabajadas)
Elabor: Ing. Jess Pando Barrn(Mocis)
101
{
horas=(horasTrabajadas>=0.0 && horasTrabajadas <= 168.0 ) ? horasTrabajadas:0.0;
}
public double obtenerHoras()
{
return horas;
}
public double ingresos()
{
if(horas<=40)
return sueldo*horas;
else
return 40*sueldo+(horas-40)*sueldo*1.5;
}
public String toString()
{
return "\nempleado por horas: "+super.toString();
}
}
EmpleadoBaseMasComision.java
public class EmpleadoBaseMasComision extends EmpleadoPorComision
{
private double salarioBase;
public EmpleadoBaseMasComision(String nombre, String apellido, String numeroSeguroSocial,
double cantidadVentasTotales, double tasa, double cantidadSalarioBase)
{
super(nombre,apellido,numeroSeguroSocial,cantidadVentasTotales,tasa);
establecerSalarioBase(cantidadSalarioBase);
}
public void establecerSalarioBase(double salario)
{
salarioBase=salario<0.0 ?0.0 :salario;
}
public double obtenerSalarioBase()
{
return salarioBase;
}
public double ingresos()
{
return obtenerSalarioBase() + super.ingresos();
}
public String toString()
{
return "\nempleado con salario base mas comision: " + super.obtenerPrimerNombre()+ " "+
super.obtenerApellidoPaterno()+ "\nnumero de Seguro Social: " + super.obtenerNumeroSeguroSocial();
}
}
PruebaSistemaNomina.java
import java.text.DecimalFormat;
import javax.swing.JOptionPane;
Elabor: Ing. Jess Pando Barrn(Mocis)
102
public class PruebaSistemaNomina
{
public static void main(String args[])
{
DecimalFormat dosDigitos=new DecimalFormat("0.00");
Empleado empleados[]=new Empleado[4];
empleados[0]=new EmpleadoAsalariado("Juan","Perez","111-11-1111",800.00);
empleados[1]=new EmpleadoPorComision("Alicia","Rodriguez","222-22-
2222",10000,0.06);
empleados[2]=new EmpleadoBaseMasComision("Alfonso","Romero","333-33-
3333",5000,0.04,300);
empleados[3]=new EmpleadoPorHoras("Isabel","Romero","444-44-4444",16.75,40);
String salida="";
for(int i=0;i<empleados.length;i++)
{
salida+=empleados[i].toString();
// determinar si el elemento es un EmpleadoBaseMasComision
if(empleados[i] instanceof EmpleadoBaseMasComision)
{
// conversin descendente de referencia a Empleado a referencia a
EmpleadoBaseMasComision
EmpleadoBaseMasComision
empleadoActual=(EmpleadoBaseMasComision) empleados[i];
double salarioBaseAnterior = empleadoActual.obtenerSalarioBase();
salida+="\nsalario base anterior: $"+salarioBaseAnterior;
empleadoActual.establecerSalarioBase(1.10*salarioBaseAnterior);
salida+="\nel nuevo salario base con aumento del 10% es:
$"+empleadoActual.obtenerSalarioBase();
}
salida+="\ngano $"+empleados[i].ingresos()+"\n";
}
for(int j=0; j<empleados.length;j++)
salida+="\nEl empleado " + j +" es un " + empleados[j].getClass().getName();
JOptionPane.showMessageDialog(null,salida);
System.exit(0);
}
}
Salida:
Elabor: Ing. Jess Pando Barrn(Mocis)
103
Comentarios:
En este ejemplo se desea realizar un procesamiento especial en los objetos
EmpleadoBaseMasComision; al encontrarse con estos objetos, se desea incrementar su salario base
en un 10%. Como los empleados se procesan en forma polimrfica, no se puede estar seguro en
cuanto al tipo de Empleado que se est manipulando en un momento dado. Esto crea un problema, ya
que se deben identificar los empleados EmpleadoBaseMasComision para poderles pagar
correctamente. Se utliza el operador instanceof para determinar si el tipo de cada objeto es
compatible con el tipo EmpleadoBaseMasComision. La condicin es verdadera si el objeto
referenciado por empleados[i] es un EmpleadoBaseMasComision. Esto tambin sera verdadero para
cualquier objeto de una subclase de EmpleadoBaseMasComision.
La lnea
EmpleadoBaseMasComision empleadoActual=(EmpleadoBaseMasComision) empleados[i];
Realiza una conversin descendente de empleados[i], del tipo Empleado al tipo
EmpleadoBaseMasComision. Esta conversin se permite solamente si el objeto tiene una relacin del tipo es
un con EmpleadoBaseMasComision.
Si el valor devuelto por la instruccin instanceof es true, la instruccin if realiza el procesamiento
especial requerido para el objeto EmpleadoBaseMasComision.
Todo objeto en Java conoce su propia clase y puede acceder a esta informacin a travs del mtodo
getClass, el cual heredan de la clase Object todas las clases. El mtodo getClass devuelve un objeto
de tipo Class (paquete java.lang), el cual contiene informacin acerca del tipo del obejto, incluyendo
el nombre de su clase.
En la lnea:
salida+="\nEl empleado " + j +" es un " + empleados[j].getClass().getName();
se invoca el mtodo getClass en el objeto para obtener la clase en tiempo de ejecucin (objeto Class)
de ese objeto. Luego se invoca al mtodo getName en el objeto devuelto por getClass, para obtener el
nombre de la clase.
Clases internas
Elabor: Ing. Jess Pando Barrn(Mocis)
104
class Alfa
{
Alfa()
{
Beta obj=new Beta();
obj.imprimir();
}
class Beta
{
public void imprimir()
{
System.out.println("En el interior de b");
}
}
}
public class PruebaAlfa
{
public static void main(String args[])
{
Alfa obj = new Alfa();
}
}
Salida:
3. Manejo de excepciones
Definicin: Una excepcin es un evento que ocurre durante la ejecucin del programa que interrumpe el flujo
normal de las sentencias.
Muchas clases de errores pueden utilizar excepciones desde serios problemas de hardware, como la avera de
un disco duro, a los simples errores de programacin, como tratar de acceder a un elemento de un array fuera
Elabor: Ing. Jess Pando Barrn(Mocis)
105
de sus lmites. Cuando dicho error ocurre dentro de un mtodo Java, el mtodo crea un objeto 'exception' y lo
maneja fuera, en el sistema de ejecucin. Este objeto contiene informacin sobre la excepcin, incluyendo su
tipo y el estado del programa cuando ocurri el error. El sistema de ejecucin es el responsable de buscar
algn cdigo para manejar el error. En terminologa java, crear una objeto exception y manejarlo por el
sistema de ejecucin se llama lanzar una excepcin. Despus de que un mtodo lance una excepcin, el
sistema de ejecucin entra en accin para buscar el manejador de la excepcin. El conjunto de "algunos"
mtodos posibles para manejar la excepcin es el conjunto de mtodos de la pila de llamadas del mtodo
donde ocurri el error. El sistema de ejecucin busca hacia atrs en la pila de llamadas, empezando por el
mtodo en el que ocurri el error, hasta que encuentra un mtodo que contiene el "manejador de excepcin"
adecuado. Un manejador de excepcin es considerado adecuado si el tipo de la excepcin lanzada es el mismo
que el de la excepcin manejada por el manejador. As la excepcin sube sobre la pila de llamadas hasta que
encuentra el manejador apropiado y una de las llamadas a mtodos maneja la excepcin, se dice que el
manejador de excepcin elegido captura la excepcin. Si el sistema de ejecucin busca exhaustivamente por
todos los mtodos de la pila de llamadas sin encontrar el manejador de excepcin adecuado, el sistema de
ejecucin finaliza (y consecuentemente y el programa Java tambin).
Mediante el uso de excepciones para manejar errores, los programas Java tienen las siguientes ventajas frente
a las tcnicas de manejo de errores tradicionales:
1: Separar el Manejo de Errores del Cdigo "Normal"
Por ejemplo, supongamos que tenemos una funcin que lee un archivo completo dentro de la
memoria. En pseudo-cdigo, la funcin se podra parecer a esto:
leerArchivo{
abrir el archivo;
determinar su tamao;
asignar suficiente memoria;
leer el archivo a la memoria;
cerrar el archivo;
}
A primera vista esta funcin parece bastante sencilla, pero ignora todos aquellos errores potenciales:
Qu sucede si no se puede abrir el archivo?
Qu sucede si no se puede determinar la longitud del archivo?
Qu sucede si no hay suficiente memoria libre?
Qu sucede si la lectura falla?
Qu sucede si no se puede cerrar el archivo?
Para responder a estas cuestiones dentro de la funcin, se tendra que aadir mucho cdigo para la deteccin y
el manejo de errores. El aspecto final de la funcin se parecera esto:
codigodeError leerArchivo {
inicializar codigodeError = 0;
abrir el archivo;
if (archivoAbierto) {
determinar la longitud del archivo;
if (obtenerLongitudDelArchivo) {
asignar suficiente memoria;
if (obtenerSuficienteMemoria) {
leer el archivo a memoria;
if (falloDeLectura) {
codigodeError = -1;
}
} else {
codigodeError = -2;
}
Elabor: Ing. Jess Pando Barrn(Mocis)
106
} else {
codigodeError = -3;
}
cerrar el archivo;
if (archivoNoCerrado && codigodeError == 0) {
codigodeError = -4;
} else {
codigodeError = codigodeError and -4;
}
} else {
codigodeError = -5;
}
return codigodeError;
}
Se observa en el cdigo anterior que existe exagerados caminos para determinar y controlar los errores
Java proporciona una solucin elegante al problema del tratamiento de rrores: las excepciones. Las
excepciones le permiten escribir el flujo principal de su cdigo y tratar los casos excepcionales en otro lugar.
Si la funcin leerArchivo utilizara excepciones en lugar de las tcnicas de
manejo de errores tradicionales se podra parecer a esto:
leerArchivo {
try {
abrir el archivo;
determinar su tamao;
asignar suficiente memoria;
leer el archivo a la memoria;
cerrar el archivo;
} catch (falloAbrirArchivo) {
hacerAlgo;
} catch (falloDeterminacionTamao) {
hacerAlgo;
} catch (falloAsignaciondeMemoria) {
hacerAlgo;
} catch (falloLectura) {
hacerAlgo;
} catch (falloCerrarArchivo) {
hacerAlgo;
}
}
Se observa que las excepciones no evitan el esfuerzo de hacer el trabajo de detectar, informar y manejar
errores. Lo que proporcionan las excepciones es la posibilidad de separar los detalles oscuros de qu hacer
cuando ocurre algo fuera de la normal. Adems, el factor de aumento de cdigo es de un 250% -- comparado
con el 400% del ejemplo anterior.
2: Propagar los Errores sobre la Pila de Llamadas
Una segunda ventaja de las excepciones es la posibilidad del propagar el error encontrado sobre la pila de
llamadas a mtodos. Supongamos que el mtodo leerArchivo es el cuarto mtodo en una serie de llamadas a
mtodos anidadas realizadas por un programa principal: metodo1 llama
a metodo2, que llama a metodo3, que finalmente llama a leerArchivo.
metodo1 {
Elabor: Ing. Jess Pando Barrn(Mocis)
107
call metodo2;
}
metodo2 {
call metodo3;
}
metodo3 {
call leerArchivo;
}
Supongamos tambin que metodo1 es el nico mtodo interesado en el error que ocurre dentro de
leerArchivo. Tradicionalmente las tcnicas de notificacin del error forzaran a metodo2 y metodo3 a
propagar el cdigo de error devuelto por leerArchivo sobre la pila de llamadas hasta que el cdigo de error
llegue finalmente a metodo1 -- el nico mtodo
que est interesado en l.
metodo1 {
codigodeErrorType error;
error = call metodo2;
if (error)
procesodelError;
else
proceder;
}
codigodeErrorType metodo2 {
codigodeErrorType error;
error = call metodo3;
if (error)
return error;
else
proceder;
}
codigodeErrorType metodo3 {
codigodeErrorType error;
error = call leerArchivo;
if (error)
return error;
else
proceder;
}
Como se aprendi anteriormente, el sistema de ejecucin Java busca hacia atrs en la pila de llamadas para
encontrar cualquier mtodo que est interesado en manejar una excepcin particular. Un mtodo Java puede
"esquivar" cualquier excepcin lanzada dentro de l, por lo tanto permite a los mtodos que estn por encima
de l en la pila de llamadas poder capturarlo. Slo los mtodos interesados en el error deben preocuparse de
detectarlo.
metodo1 {
try {
call metodo2;
} catch (excepcion) {
procesodelError;
}
}
metodo2 throws excepcion {
call metodo3;
}
Elabor: Ing. Jess Pando Barrn(Mocis)
108
metodo3 throws excepcion {
call leerArchivo;
}
Sin embargo, como se puede ver desde este pseudo-cdigo, requiere cierto esfuerzo por parte de los mtodos
centrales. Cualquier excepcin verificada que pueda ser lanzada dentro de un mtodo forma parte del
interface de programacin pblico del mtodo y debe ser especificado en la clausula throws del mtodo. As
el mtodo informa a su llamador sobre las excepciones que puede lanzar, para que el llamador pueda decidir
consciente e inteligentemente qu hacer con esa excepcin.
Se observa de nuevo la diferencia del factor de aumento de cdigo y el factor de incertitumbre entre las dos
tcnicas de manejo de errores. El cdigo que utiliza excepciones es ms compacto y ms fcil de entender.
3: Agrupar Errores y Diferenciacin
Frecuentemente las excepciones se dividen en categoras o grupos. Por ejemplo, podramos imaginar un grupo
de excepciones, cada una de las cuales representara un tipo de error especfico que pudiera ocurrir durante la
manipulacin de un array: el ndice est fuera del rango del tamao del array, el elemento que se quiere
insertar en el array no es del tipo correcto, o el elemento que se est buscando no est en el array. Adems,
podemos imaginar que algunos mtodos querran manejar todas las excepciones de esa categora (todas las
excepciones de array), y otros mtodos podra manejar slo algunas excepciones
especficas (como la excepcin de ndice no vlido).
Como todas las excepciones lanzadas dentro de los programas Java son objetos de primera clase, agrupar o
categorizar las excepciones es una salida natural de las clases y las superclases. Las excepciones Java deben
ser ejemplares de la clase Throwable, o de cualquier descendiente de sta. Como de las otras clases Java, se
pueden crear subclases de la clase Throwable y subclases de estas subclases. Cada clase 'hoja' (una clase sin
subclases) representa un tipo especfico de excepcin y cada clase 'nodo' (una clase con una o ms subclases)
representa un grupo de excepciones relacionadas.
InvalidIndexException, ElementTypeException, y NoSuchElementException son todas clases hojas. Cada
una representa un tipo especfico de error que puede ocurrir cuando se manipula un array. Un mtodo puede
capturar una excepcin basada en su tipo especfico (su clase inmediata o interface). Por ejemplo, un
manejador de excepcin que slo controle la excepcin de ndice no vlido, tiene una sentencia catch como
esta:
catch (InvalidIndexException e) {
. . .
}
ArrayException es una clase nodo y representa cualquier error que pueda ocurrir durante la manipulacin de
un objeto array, incluyendo aquellos errores representados especficamente por una de sus subclases. Un
mtodo puede capturar una excepcin basada en este grupo o tipo general especificando cualquiera de las
superclases de la excepcin en la sentencia catch. Por ejemplo, para capturar todas las excepciones de
array, sin importar sus tipos especficos, un manejador de excepcin especificara un argumento
ArrayException:
catch (ArrayException e) {
. . .
}
Este manejador podra capturar todas las excepciones de array, incluyendo InvalidIndexException,
ElementTypeException, y NoSuchElementException. Se puede descubrir el tipo de excepcin preciso que ha
ocurrido comprobando el parmetro del manejador e.
Incluso podramos seleccionar un manejador de excepciones que controlara cualquier excepcin con este
manejador:
Elabor: Ing. Jess Pando Barrn(Mocis)
109
catch (Exception e) {
. . .
}
Los manejadores de excepciones que son demasiado generales, como el mostrado aqu, pueden hacer que el
cdigo sea propenso a errores mediante la captura y manejo de excepciones que no se hubieran anticipado y
por lo tanto no son manejadas correctamente dentro de el manejador. Como regla no se recomienda escribir
manejadores de excepciones generales.
Como se ha visto, se pueden crear grupos de excepciones y manejarlas de una forma general, o se puede
especificar un tipo de excepcin especfico para diferenciar excepciones y manejarlas de un modo exacto.
Ejemplos
PruebaExcep1.java
class PruebaExcep1
{
public static void main(String args[])
{
//int a=100/0; Marca error en tiempo de ejecucin con los tipos enteros
float b=(float) 100.0/0;
double c=100.0/0;
System.out.println("b="+b+" "+"c="+c);
}
}
Salida:
PruebaExcep2.java
class PruebaExcep2
{
public static void main(String args[])
{
int a;
try
{
a=100/0;
}
catch (ArithmeticException m)
{
System.out.println("error mensaje= "+m.getMessage());
System.out.println("\n"+"Division entre cero");
}
}
}
Salida:
Elabor: Ing. Jess Pando Barrn(Mocis)
110
PruebaExcep3.java
class PruebaExcep3
{
public static void main(String args[])
{
int i;
for(i=0;i<5;i++)
{
int a=(int) (Math.random()*100);
int b=(int) (Math.random()*4);
try
{
int c=a/b;
System.out.println("iteracion No. "+i+" "+a+"/"+b+"="+c);
}
catch (ArithmeticException m)
{
System.out.println("se detecto una division entre cero");
i--;
}
}
}
}
Salida:
Elabor: Ing. Jess Pando Barrn(Mocis)
111
PruebaExcep4.java
public class PruebaExcep4 {
public static void main(String[] args) {
if (args.length != 1)
System.out.println("Debe introducir un entero a la entrada");
try
{
int enteroLeido = stringToInt(args[0]);
System.out.println("Ha introducido el entero " + enteroLeido);
}
catch (NumberFormatException e)
{
System.out.println("La cadena " + args[0] + " no es un entero. Ten mas cuidado la proxima vez");
}
System.out.println("Ahora el programa puede continuar");
}
private static int stringToInt(String entero) {
int resultado = Integer.parseInt(entero);
return resultado;
}
}
Salida:
Elabor: Ing. Jess Pando Barrn(Mocis)
112
PruebaExcep5.java
class PruebaExcep5
{
public static void main(String args[])
{
int a[]={1,2,3};
try
{
if(Boolean.parseBoolean(args[0]))
System.out.println(a[4]);
else
System.out.println(5/0);
}
catch (ArithmeticException o)
{
System.out.println(o.getMessage());
}
catch (ArrayIndexOutOfBoundsException o2)
{
System.out.println(o2);
}
}}
Elabor: Ing. Jess Pando Barrn(Mocis)
113
Salida:
PruebaExcep6.java
class PruebaExcep6
{
public static void main(String args[])
{
try
{
evaluarEntero(Boolean.parseBoolean(args[0]));
}
catch (ArithmeticException o)
{
System.out.println(o.getMessage());
}
catch (Exception o)
{
System.out.println(o);
}
}
static void evaluarEntero(boolean v)
{
int a[]={1,2,3};
if(v)
System.out.println(a[4]);
else
System.out.println(5/0);
}
}
Salida:
PruebaExcep7.java
Elabor: Ing. Jess Pando Barrn(Mocis)
114
class PruebaExcep7
{
public static void main(String args[])
{
try
{
evaluarEntero(Boolean.parseBoolean(args[0]));
}
catch (ArithmeticException o)
{
System.out.println(o.getMessage());
}
catch (ArrayIndexOutOfBoundsException o)
{
System.out.println(o);
}
}
static void evaluarEntero(boolean v) throws
ArithmeticException,ArrayIndexOutOfBoundsException
{
int a[]={1,2,3};
if(v)
System.out.println(a[4]);
else
System.out.println(5/0);
}
}
Salida:
PruebaExcep8.java
class PruebaExcep8
{
public static void main(String args[])
{
try
{
evaluarEntero(Boolean.parseBoolean(args[0]));
}
catch (Exception o)
{
System.out.println(o);
Elabor: Ing. Jess Pando Barrn(Mocis)
115
}
}
static void evaluarEntero(boolean v) throws Exception
{
int a[]={1,2,3};
if(v)
System.out.println(a[4]);
else
System.out.println(5/0);
}
}
Salida:
class PruebaExcep9
{
public static void main(String args[])
{
try
{
evaluarEntero(Boolean.parseBoolean(args[0]));
}
catch (ArithmeticException o)
{
System.out.println(o.getMessage());
}
catch (ArrayIndexOutOfBoundsException o)
{
System.out.println(o);
}
finally
{
System.out.println("Metodo finally");
}
}
static void evaluarEntero(boolean v) throws
ArithmeticException,ArrayIndexOutOfBoundsException
{
int a[]={1,2,3};
if(v)
System.out.println(a[4]);
else
System.out.println(5/0);
}
}
Salida:
Elabor: Ing. Jess Pando Barrn(Mocis)
116
PruebaExcep10.java
class ClaseExcepcion
{
static void evaluarEntero(boolean v) throws
ArithmeticException,ArrayIndexOutOfBoundsException
{
int a[]={1,2,3};
if(v)
System.out.println(a[4]);
else
System.out.println(5/0);
}
}
class PruebaExcep10
{
public static void main(String args[])
{
try
{
ClaseExcepcion.evaluarEntero(Boolean.parseBoolean(args[0]));
}
catch (ArithmeticException o)
{
System.out.println(o.getMessage());
}
catch (ArrayIndexOutOfBoundsException o)
{
System.out.println(o);
}
finally
{
System.out.println("Metodo finally");
}
}
}
Salida:
Elabor: Ing. Jess Pando Barrn(Mocis)
117
4. Interfaz Grfica de Usuario (GUI). Parte I. AWT
GUI
Abstract Windowing Toolkit (AWT)
La AWT prove components bsicos GUI que son usados en el diseo de applets y aplicaciones. Un
componente es un objeto que tiene una representacin grfica el cual puede ser desplegado en la pantalla y los
usuarios pueden interactuar con l. Algunos ejemplos de componentes son: botones, campos de texto, cajas de
verificacin.
El paquete AWT consiste de un conjunto de components heredados, en muchos casos de la clase abstracta
java.awt.Component, esta clase prove variables y mtodos requeridos por todos los componentes AWT.
Tal vez el ms importante de estos componentes sea la clase Container. Un contenedor es un componente que
puede contener otros componentes o contenedores. Los contenedores se usan para distribuir los componentes
GUI en la pantalla. Las clases Panel y Frame son los contenedores que ms frecuentemente se usan.
Componentes GUI
Rl paquete java.awt
Este paquete contiene las clases que generan los componentes GUI. La siguiente figura muestra la
distribucin de este paquete.
Elabor: Ing. Jess Pando Barrn(Mocis)
118
Contenedores
Existen dos tipos principales de contenedores: la clase Window y la clase Panel
La clase Window es una ventana nativa que es independiente de otros contenedores. Hay dos tipos
importantes de objetos Window.
1. Frame- es una ventana con ttulo y esquinas en donde se puede fcilmente redisear la estructura
2. Dialog- es una ventana simple que no tiene una barra de men.
Un objeto Panel debe estar contenido dentro de otro objeto Container o estar incluido en una ventana de un
navegador Web.
Existen varios componentes contenedores que son frecuentemente usados en el lenguaje de programacin
Java.
Frames
Panels
Applets
Dialogs
4.1 Frames
La clase Frame es una subclase de la clase Window. Es una ventana con un ttulo y esquinas para redefinir el
tamao. La clase Frame hereda sus caractersticas de la clase Container, de esta manera se pueden agregar
objetos con el mtodo add.
El constructor Frame(String) permite asignar el ttulo al Frame.
Frame
DemoFrame1.java
import java.awt.*;
class DemoFrame1
{
private Frame f;
public DemoFrame1(String titulo)
{
f=new Frame(titulo);
}
public void ejecutar()
{
f.setSize(200,200);
f.setBackground(Color.BLUE);
//f.setBackground(Color.blue);
f.setVisible(true);
}
public static void main(String args[])
{
DemoFrame1 demo = new DemoFrame1("Demostracion del Frame");
demo.ejecutar();
Elabor: Ing. Jess Pando Barrn(Mocis)
119
}}
Salida:
DemoFrame2.java
import java.awt.*;
class DemoFrame2
{
private Frame f1;
private Frame f2;
public DemoFrame2(String titulo)
{
f1=new Frame(titulo);
f2=new Frame(titulo);
}
public void ejecutar1()
{
f1.setSize(200,200);
f1.setBackground(Color.pink);
f1.setVisible(true);
}
public void ejecutar2()
{
f2.setSize(300,300);
f2.setBackground(Color.yellow);
f2.setVisible(true);
}
public static void main(String args[])
{
DemoFrame2 demo = new DemoFrame2("Demostracion del Frame1");
demo.ejecutar2();
demo.ejecutar1();
}
}
Salida:
Elabor: Ing. Jess Pando Barrn(Mocis)
120
DemoFrame3.java
import java.awt.*;
class DemoFrame3 extends Frame
{
public void paint(Graphics g)
{
g.drawString("prueba",60,100);
setBackground(Color.red);
g.drawLine(60,105,100,105);
}
}
class PruebaDemoFrame3
{
public static void main(String args[])
{
DemoFrame3 f = new DemoFrame3();
f.setSize(200,200);
f.show();
}
}
Salida:
DemoFrame4.java
import java.awt.*;
class DemoFrame4
{
private Frame f;
private Label letrero;
public DemoFrame4(String titulo)
{
f=new Frame(titulo);

Elabor: Ing. Jess Pando Barrn(Mocis)
121
}
public void ejecutar()
{
f.setSize(300,300);
f.setBackground(Color.yellow);
f.setVisible(true);
letrero = new Label("Letrero 1");
f.add(letrero);
f.pack();
}
public static void main(String args[])
{
DemoFrame4 demo = new DemoFrame4("Demostracion del Frame1");
demo.ejecutar();
}
}
Elabor: Ing. Jess Pando Barrn(Mocis)
122
4.2 Panels
Un panel es un objeto que prove un espacio en donde se pueden colocar cualquier componente GUI,
incluyendo otros panels cada Panel el cual hereda de la clase Container puede tener su propio layout manager.
Despus de que se crea un objeto Panel se debe agregar a un objeto Window o Framw, esto se hace usando el
mtodo add de la clase Container. Para visualizar el frame y el panel, se debe establecer el frame a visible.
DemoPanel1.java
import java.awt.*;
public class DemoPanel1
{
private Frame f;
private Panel p;
public DemoPanel1(String titulo)
{
f = new Frame(titulo);
p=new Panel();
}
public void ejecutar()
{
p.setSize(100,100);
p.setBackground(Color.blue);
f.setLayout(null);
f.setSize(300,300);
f.setBackground(Color.red);
f.add(p);
f.setVisible(true);
}
public static void main(String args[])
{
DemoPanel1 demo = new DemoPanel1("Demo de un Panel");
demo.ejecutar();
}
}
Salida:
Elabor: Ing. Jess Pando Barrn(Mocis)
123
DemoPanel2.java
import java.awt.*;
public class DemoPanel2
{
private Frame f;
private Panel p1;
private Panel p2;
public DemoPanel2(String titulo)
{
f = new Frame(titulo);
p1=new Panel();
p2=new Panel();
}
public void ejecutar()
{
p1.setSize(100,100);
p1.setBackground(Color.yellow);
p1.setVisible(true);
p2.setSize(50,50);
p2.setBackground(Color.red);
p2.setVisible(true);
f.setSize(300,300);
f.setBackground(Color.blue);
f.setLayout( null ) ;
f.add(p2);
f.add(p1);
f.setVisible(true);
}
public static void main(String args[])
{
DemoPanel2 demo = new DemoPanel2("Demo de un Panel");
demo.ejecutar();
}
}
Elabor: Ing. Jess Pando Barrn(Mocis)
124
Salida:
4.3 Dialogs
Un componente Dialog esta asociado con un contenedor Frame. Es una ventana de libre posicin con algunos
detalles decorativos.
DemoDialog.java
import java.awt.*;
class DemoDialog
{
private Frame f;
private Dialog d;
private Label et;
public DemoDialog(String titulo)
{
f=new Frame(titulo);
d = new Dialog(f, "Dialogo", true);
et = new Label("Hola, este es un dialogo");
}
public void ejecutar()
{
d.setSize(150,50);
d.add(et);
d.setVisible(true);
}
public static void main(String args[])
{
DemoDialog demo = new DemoDialog("Demostracion del Frame1");
demo.ejecutar();
}
}
Salida:
DemoDialog2.java
Elabor: Ing. Jess Pando Barrn(Mocis)
125
import java.awt.*;
class DemoDialog2
{
private Frame f;
private Dialog d;
private Label et;
private Dialog d2;
private Label et2;
public DemoDialog2(String titulo)
{
f=new Frame(titulo);
d = new Dialog(f, "Dialogo", true);
et = new Label("Hola, este es un dialogo");
et2 = new Label("Hola, este es otro dialogo");
}
public void ejecutar()
{
d.setLayout(new GridLayout(2,1));
d.setSize(150,50);
d.add(et);
d.add(et2);
d.setVisible(true);
}
public static void main(String args[])
{
DemoDialog2 demo = new DemoDialog2("Demostracion del Frame1");
demo.ejecutar();
}
}
Salida:
DemoDialog2.java
import java.awt.*;
class DemoDialog2
{
private Frame f;
private Dialog d;
private Label et;
private Dialog d2;
private Label et2;
public DemoDialog2(String titulo)
{
f=new Frame(titulo);
d = new Dialog(f, "Dialogo", true);
et = new Label("Hola, este es un dialogo");
et2 = new Label("Hola, este es otro dialogo");
}
Elabor: Ing. Jess Pando Barrn(Mocis)
126
public void ejecutar()
{
d.setSize(150,50);
d.add(et,BorderLayout.NORTH);
d.add(et2,BorderLayout.SOUTH);
d.setVisible(true);
}
public static void main(String args[])
{
DemoDialog2 demo = new DemoDialog2("Demostracion del
Frame1");
demo.ejecutar();
}
}
Salida:
Elabor: Ing. Jess Pando Barrn(Mocis)
127
Tipos de Layout Managers
Los siguientes Layout Managers estn incluidos en el lenguaje de programacin Java
FlowLayout
BorderLayout
GridLayout
CardLayout
GridBagLayout
La siguiente figura muestra los Managers por default
El Administrador BorderLayout
Una disposisicn (arreglo) BorderLayout sita a los componetes dentro de reas geogrficas. Un componente
puede ser agregado a una de estas cinco regiones.
DemoBorderLayout.java
import java.awt.*;
public class DemoBorderLayout
{
private Frame f;
private Button boton1;
private Button boton2;
Elabor: Ing. Jess Pando Barrn(Mocis)
128
public DemoBorderLayout()
{
f = new Frame("Demo del FlowLayout");
boton1 = new Button ("Presioname");
boton2 = new Button ("No me presiones");
}
public void ejecutar()
{
f.setLayout(new BorderLayout());// esta linea no es
// necesaria ya que por default un Frame es un BorderLayout
f.add(boton1,BorderLayout.NORTH);
f.add(boton2,BorderLayout.SOUTH);
f.pack();
f.setVisible(true);
}
public static void main(String args[])
{
DemoBorderLayout demo=new DemoBorderLayout();
demo.ejecutar();
}
}
DemoBorderLayout2.java
import java.awt.*;
public class DemoBorderLayout2
{
private Frame f;
private Button boton1;
private Button boton2;
private Button boton3;
private Button boton4;
private Button boton5;
public DemoBorderLayout2()
{
f = new Frame("Demo del FlowLayout");
boton1 = new Button ("Arriba");
boton2 = new Button ("Abajo");
boton3 = new Button ("Derecha");
boton4 = new Button ("Izquierda");
boton5 = new Button ("Centro");
}
public void ejecutar()
{
f.setLayout(new BorderLayout());// esta linea no es
// necesaria ya que por default un Frame es un BorderLayout
f.add(boton1,BorderLayout.NORTH);
f.add(boton2,BorderLayout.SOUTH);
f.add(boton3,BorderLayout.WEST);
f.add(boton4,BorderLayout.EAST);
Elabor: Ing. Jess Pando Barrn(Mocis)
129
f.add(boton5,BorderLayout.CENTER);
f.pack();
f.setVisible(true);
}
public static void main(String args[])
{
DemoBorderLayout2 demo=new DemoBorderLayout2();
demo.ejecutar();
}
}
Salida:
DemoBorderLayout3.java
import java.awt.*;
public class DemoBorderLayout3
{
private Frame f;
private Panel p1;
private Panel p2;
private Panel p3;
private Panel p4;
private Panel p5;
public DemoBorderLayout3(String titulo)
{
f = new Frame(titulo);
p1=new Panel();
p2=new Panel();
p3=new Panel();
p4=new Panel();
p5=new Panel();
}
public void ejecutar()
{
p1.setSize(100,100);
p1.setBackground(Color.yellow);
p1.setVisible(true);
p2.setSize(50,50);
Elabor: Ing. Jess Pando Barrn(Mocis)
130
p2.setBackground(Color.red);
p2.setVisible(true);
p3.setSize(50,50);
p3.setBackground(Color.green);
p3.setVisible(true);
p4.setSize(50,50);
p4.setBackground(Color.gray);
p4.setVisible(true);
p5.setSize(50,50);
p5.setBackground(Color.white);
p5.setVisible(true);
f.setSize(300,300);
f.setBackground(Color.blue);
f.add(p2,BorderLayout.NORTH);
f.add(p1,BorderLayout.SOUTH);
f.add(p3,BorderLayout.EAST);
f.add(p4,BorderLayout.WEST);
f.add(p5,BorderLayout.CENTER);
f.setVisible(true);
}
public static void main(String args[])
{
DemoBorderLayout3 demo = new DemoBorderLayout3("Demo de un BorderLayout");
demo.ejecutar();
}
}
Elabor: Ing. Jess Pando Barrn(Mocis)
131
El Administrador FlowLayout
La distribucin FlowLayout distribuye los componentes en forma similar a un texto en procesador de textos.
Los componentes aparecen de izquierda a derecha hasta que termina el rengln y los componentes son
agregados a otro rengln. El efecto es idntico al que se tiene en una navegador Web.
A FlowLayout manager arranges components similar to text in a word processing document. Components
appear from left to right until they run out of room, after which they wrap around to the next row. The effect
is identical to that of a web browser.
DemoFlowLayout.java
import java.awt.*;
public class DemoFlowLayout
{
private Frame f;
private Button boton1;
private Button boton2;
private Button boton3;
private Button boton4;
private Button boton5;
private Panel p;
public DemoFlowLayout()
{
f = new Frame("Demo del FlowLayout");
boton1 = new Button ("Boton 1");
boton2 = new Button ("Boton 2");
boton3 = new Button ("Boton 3");
boton4 = new Button ("Boton 4");
boton5 = new Button ("Boton 5");
p=new Panel();
}
Elabor: Ing. Jess Pando Barrn(Mocis)
132
public void ejecutar()
{
p.setSize(100,100);
p.setBackground(Color.yellow);
p.setVisible(true);
// en un Panel la distribucion es FlowLayout por default
//p.setLayout(new BorderLayout()); con esta instruccionse puede
// cambiar la distribucion de un panel a BorderLayout
p.add(boton1);
p.add(boton2);
p.add(boton3);
p.add(boton4);
p.add(boton5);
f.add(p,BorderLayout.CENTER);
f.pack();
f.setVisible(true);
}
public static void main(String args[])
{
DemoFlowLayout demo=new DemoFlowLayout();
demo.ejecutar();
}
}
Salida:
Elabor: Ing. Jess Pando Barrn(Mocis)
133
El administrador GridLayout
Una distribucin de este tipo coloca los componentes en una tabla y cada componente ocupa una celda de
igual tamao.
The GridLayout manager arranges components into a table of rows and columns, one component per cell,
each of equal size.
DemoGrid.java
import java.awt.*;
public class DemoGrid
{
private Frame f;
private Button elBoton[];
public DemoGrid(String titulo)
{
f=new Frame(titulo);
elBoton = new Button[9];
for(int i=0;i<elBoton.length;i++)
elBoton[i]=new Button(""+i);
}
public void ejecutar()
{
f.setLayout(new GridLayout(3,3));
for(int i=0; i<elBoton.length;i++)
f.add(elBoton[i]);
f.pack();
f.setVisible(true);
}
public static void main(String args[])
{
DemoGrid demo=new DemoGrid("Demo de un GridLayout");
demo.ejecutar();
}
Elabor: Ing. Jess Pando Barrn(Mocis)
134
}
Salida:
Las siguientes reglas gobiernan al administrador Grid Layout
Los componente son agregados secuencialmente de izquierda a derecha, de arriba hacia abajo. Si el
nmero de componentes agregados es menor que el nmero de componentes designados en el
constructor para la clase GridLayout, el espacio reservado para estos componentes quedar vacante.
Todos los componentes tienen el mismo tamao.
Cuando se redimensiona las relaciones horizontales y verticales entre los componentes no cambia,
esto es importante si se desea persentar al usuario un vista consistente.
Ejemplos varios
Procesador1.java
import java.awt.*;
public class Procesador1
{
private Frame f;
private Panel p1;
private Panel p2;
private Button botonLimpiar;
private Button botonSalir;
private TextField campo1;
private TextArea area1;
public Procesador1(String titulo)
{
f=new Frame(titulo);
p1=new Panel();
p2=new Panel();
botonLimpiar=new Button("Clear");
botonSalir=new Button("Quit");
campo1=new TextField(40);
area1=new TextArea(5,40);
Elabor: Ing. Jess Pando Barrn(Mocis)
135
}
public void ejecutar()
{
p1.setLayout(new BorderLayout());
p1.add(campo1,BorderLayout.NORTH);
p1.add(area1,BorderLayout.SOUTH);
p2.add(botonLimpiar);
p2.add(botonSalir);
f.add(p1,BorderLayout.NORTH);
f.add(p2,BorderLayout.SOUTH);
f.pack();
f.setVisible(true);
f.setBackground(Color.blue);
}
public static void main(String args[])
{
Procesador1 demo=new Procesador1("Procesador");
demo.ejecutar();
}
}
Salida:
Chat1.java
import java.awt.*;
public class Chat1
{
private Frame f;
private Panel p1;
private Panel p2;
private Panel p3;
private Button botonEnviar;
private Button botonSalir;
private Button botonGuardar;
private Button botonImprimir;
private Label letrero1;
private Label letrero2;
Elabor: Ing. Jess Pando Barrn(Mocis)
136
private TextArea areaEntrada;
private TextArea areaSalida;
public Chat1(String titulo)
{
f=new Frame(titulo);
p1=new Panel();
p2=new Panel();
p3=new Panel();
letrero1=new Label("Mensaje a enviar");
letrero2=new Label("Mensaje recibido");
botonEnviar=new Button("Enviar");
botonSalir=new Button("Salir");
botonGuardar=new Button("Guardar");
botonImprimir=new Button("Imprimir");
areaEntrada=new TextArea(20,40);
areaSalida=new TextArea(20,40);
p1.setLayout(new BorderLayout());
p1.add(letrero1,BorderLayout.NORTH);
p1.add(areaEntrada,BorderLayout.SOUTH);
p2.setLayout(new BorderLayout());
p2.add(letrero2,BorderLayout.NORTH);
p2.add(areaSalida,BorderLayout.SOUTH);
p3.add(botonEnviar);
p3.add(botonSalir);
p3.add(botonGuardar);
p3.add(botonImprimir);
f.add(p1,BorderLayout.EAST);
f.add(p2,BorderLayout.WEST);
f.add(p3,BorderLayout.SOUTH);
}
public void ejecutar()
{
f.pack();
f.setVisible(true);
f.setBackground(Color.red);
}
public static void main(String args[])
{
Chat1 demo=new Chat1("Messenger");
demo.ejecutar();
}
}
Salida:
Elabor: Ing. Jess Pando Barrn(Mocis)
137
Ejercicios
ExamenGui.java
import java.awt.*;
public class ExamenGui
{
private TextField campo1,campo2,campo3, campo4;
private Button b1,b2,b3,b4,b5;
private Label txt1,txt2,txt3,txt4;
private Frame f;
private Panel p1, p2, p3,p4;
private TextArea ta1, ta2;
ExamenGui()
{
Campo1 = new TextField(10);
Elabor: Ing. Jess Pando Barrn(Mocis)
138
campo2 = new TextField(10);
campo3 = new TextField(10);
campo4 = new TextField(10);
txt1 = new Label(" Valor alfa ");
txt2 = new Label("Valor beta ");
txt3 = new Label("Valor gamma ");
txt4 = new Label("Valor epsilon ");
b1 = new Button ("Request");
b2 = new Button ("Response");
b3 = new Button ("Write");
b4 = new Button ("Submit");
b5 = new Button ("Exit");
ta1 = new TextArea(5,40);
ta2 = new TextArea(5,40);
f = new Frame("Primer Examen de GUI");
p1 = new Panel();
p2=new Panel();
p3=new Panel();
p4=new Panel();
}
void pegarObjetos()
{
p1.add(txt1);
p1.add(txt2);
p1.add(txt3);
Elabor: Ing. Jess Pando Barrn(Mocis)
139
p1.add(txt4);
p2.add(campo1);
p2.add(campo2);
p2.add(campo3);
p2.add(campo4);
p4.setLayout(new GridLayout(5,1));
p4.add(b1);
p4.add(b2);
p4.add(b3);
p4.add(b4);
p4.add(b5);
p3.add(ta1);
p3.add(p4);
p3.add(ta2);
f.add(p1,BorderLayout.NORTH);
f.add(p2,BorderLayout.CENTER);
f.add(p3,BorderLayout.SOUTH);
f.setVisible(true);
f.pack();
}
public static void main(String args[])
{
ExamenGui obj=new ExamenGui();
obj.pegarObjetos();
}
Elabor: Ing. Jess Pando Barrn(Mocis)
140
}
Salida:
5. Manejo de eventos
Para implementer el manejo de eventos en una GUI se necesitan 4 pasos:
1. Identificar la fuente del evento
2. Determinar el tipo de interfaz requerida para el tipo de evento
3. definir una clase que implemente la interfaz requerida
4. registra el manejador con el evento
Ejemplo 1
DemoEvento1.java
import java.awt.* ;
import java.awt.event.* ;
public class ManejadorBotonClick implements ActionListener
{
private int count ;
public void actionPerformed( ActionEvent e)
{
Button boton = ( Button ) e.getSource() ;
boton.setLabel( "Clicks : " + ++count ) ;
}
}
import java.awt.* ;
import java.awt.event.* ;
public class DemoEvento1
{
private Frame frame ;
private Button boton ;
DemoEvento1()
{
frame = new Frame( "Demo " ) ;
boton = new Button( "Clicks : 0" ) ;
Elabor: Ing. Jess Pando Barrn(Mocis)
141
}
public void ejecutar()
{
boton.setFont( new Font( "Serif",Font.BOLD, 16 ) ) ;
boton.addActionListener( new ManejadorBotonClick() ) ;
frame.add( boton, BorderLayout.CENTER ) ;
frame.setSize( 125, 125 ) ;
frame.setVisible( true ) ;
}
public static void main( String [] args )
{
DemoEvento1 demo = new DemoEvento1() ;
demo.ejecutar() ;
}
}
Salida:
Ejemplo 2
DemoEventoVentana.java
import java.awt.event.* ;
public class ManejadorVentana implements WindowListener
{
public void windowClosing( WindowEvent evento )
{
System.exit( 0 ) ;
}
public void windowOpened( WindowEvent w ) {}
public void windowIconified( WindowEvent w ) {}
public void windowDeiconified( WindowEvent w ) {}
public void windowClosed( WindowEvent w ) {}
public void windowActivated( WindowEvent w ) {}
public void windowDeactivated( WindowEvent w ) {}
}
import java.awt.* ;
import java.awt.event.* ;
public class DemoEventoVentana
{
Frame frame ;
Label etiqueta ;
public DemoEventoVentana()
{
frame = new Frame( "Demo Evento Ventana" ) ;
Elabor: Ing. Jess Pando Barrn(Mocis)
142
etiqueta = new Label( "Cerrando la ventana", Label.CENTER ) ;
}
public void ejecutar()
{
etiqueta.setFont( new Font( "Serif", Font.BOLD, 16 ) ) ;
frame.addWindowListener( new ManejadorVentana() ) ;
frame.add( etiqueta, BorderLayout.CENTER ) ;
frame.setSize( 400, 100 ) ;
frame.setVisible( true ) ;
}
public static void main( String [] args )
{
DemoEventoVentana demo = new DemoEventoVentana() ;
demo.ejecutar() ;
}
}
Salida:
Ejemplo 3
DemoEventoVentana.java
import java.awt.* ;
import java.awt.event.* ;
public class ManejadorBotonClick implements ActionListener
{
private int count ;
public void actionPerformed( ActionEvent e)
{
Button boton = ( Button ) e.getSource() ;
boton.setLabel( "Clicks : " + ++count ) ;
}
}
import java.awt.event.* ;
public class ManejadorVentana implements WindowListener
{
public void windowClosing( WindowEvent theEvent )
{
System.exit( 0 ) ;
}
public void windowOpened( WindowEvent w ) {}
public void windowIconified( WindowEvent w ) {}
public void windowDeiconified( WindowEvent w ) {}
public void windowClosed( WindowEvent w ) {}
public void windowActivated( WindowEvent w ) {}
Elabor: Ing. Jess Pando Barrn(Mocis)
143
public void windowDeactivated( WindowEvent w ) {}
}
import java.awt.* ;
import java.awt.event.* ;
public class DemoEventoVentana
{
Frame frame ;
Label etiqueta ;
Button boton;
public DemoEventoVentana()
{
frame = new Frame( "Demo Evento Ventana" ) ;
etiqueta = new Label( "Para cerrar esta ventana de un click en el cuadro respectivo",
Label.CENTER ) ;
boton = new Button( "Clicks : 0" ) ;
}
public void ejecutar()
{
boton.setFont( new Font( "Serif",Font.BOLD, 16 ) ) ;
boton.addActionListener( new ManejadorBotonClick() ) ;
frame.add( boton, BorderLayout.WEST ) ;
etiqueta.setFont( new Font( "Serif", Font.BOLD, 16 ) ) ;
frame.addWindowListener( new ManejadorVentana() ) ;
frame.add( etiqueta, BorderLayout.EAST) ;
frame.setVisible( true ) ;
frame.pack();
}
public static void main( String [] args )
{
DemoEventoVentana demo = new DemoEventoVentana() ;
demo.ejecutar() ;
}
}
Salida:
Ejemplo 4
En este ejemplo se integran dos mtodos a la clase para controlar el evento del Mouse y el de la ventana,
usando una implementacin (herencia mltiple) y el this para activar los mtodos
DemoEventos.java
import java.awt.* ;
import java.awt.event.* ;
public class DemoEventos implements ActionListener,WindowListener
{
Frame frame ;
Label etiqueta ;
Elabor: Ing. Jess Pando Barrn(Mocis)
144
Button boton;
private int count ;
public DemoEventos()
{
frame = new Frame( "Demo Evento Ventana" ) ;
etiqueta = new Label( "Para cerrar esta ventana de un click en el cuadro respectivo",
Label.CENTER ) ;
boton = new Button( "Clicks : 0" ) ;
count=0 ;
}
public void ejecutar()
{
boton.setFont( new Font( "Serif",Font.BOLD, 16 ) ) ;
boton.addActionListener(this) ;
frame.add( boton, BorderLayout.WEST ) ;
etiqueta.setFont( new Font( "Serif", Font.BOLD, 16 ) ) ;
frame.addWindowListener(this) ;
frame.add( etiqueta, BorderLayout.EAST) ;
frame.setVisible( true ) ;
frame.pack();
}
public static void main( String [] args )
{
DemoEventos demo = new DemoEventos() ;
demo.ejecutar() ;
}
public void actionPerformed( ActionEvent e)
{
Button boton = ( Button ) e.getSource() ;
boton.setLabel( "Clicks : " + ++count ) ;
}
public void windowClosing( WindowEvent theEvent )
{
System.exit( 0 ) ;
}
public void windowOpened( WindowEvent w ) {}
public void windowIconified( WindowEvent w ) {}
public void windowDeiconified( WindowEvent w ) {}
public void windowClosed( WindowEvent w ) {}
public void windowActivated( WindowEvent w ) {}
public void windowDeactivated( WindowEvent w ) {}
}
Salida:
Elabor: Ing. Jess Pando Barrn(Mocis)
145
5.1 Categoras de los eventos
Categora Nombre de la interfaz Mtodos
Action ActionListener actionPerformed(ActionEvent)
Item ItemListener itemStateChanged(itemEvent)
Mouse MouseListener
mousePressed(mouseEvent)
mouseReleases(mouseEvent)
mouseEntered(mouseEvent)
mouseExited(mouseEvent)
mouseClicked(mouseEvent)
Mouse Motion MouseMotionListener
mouseDragged(mouseEvent)
mouseMoved(MouseEvent)
Key KeyListener
keyPressed(KeyEvent)
keyReleased(KeyEvent)
keyTyped(KeyEvent)
Focus FocusListener
focusGained(FocusEvent)
focusLost(FocusEvent)
Adjustment AdjustmentListener adjustmentValueChanged(Adjustment)
Component ComponentListener
componentMoved(ComponentEvent)
componentHidden (ComponentEvent)
componentResized(ComponentEvent)
componentShown(ComponentEvent)
Window WindowListener
windowClosing(WindowEvent)
windowOpened(WindowEvent)
windowIconified(WindowEvent)
windowDeiconified(WindowEvent)
windowClosed(WindowEvent)
windowActivated(WindowEvent)
windowDeactivated(WindowEvent)
Container ContainerListener
componentAdded(ContainerEvent)
componentRemoved(ContainerEvent)
Elabor: Ing. Jess Pando Barrn(Mocis)
146
Text TextListener textValueChanged(TextEvent)
Ejemplo 5
DemoEventosMoverMouse.java
import java.awt.* ;
import java.awt.event.* ;
public class EventosMoverMouse implements MouseMotionListener, MouseListener
{
private TextField textX ;
private TextField textY ;
private TextField textLocalizar ;
private TextField textPresionar ;
public EventosMoverMouse( TextField textX,TextField textY,TextField textLocalizar,TextField
textPresionar )
{
this.textX = textX ;
this.textY = textY ;
this.textLocalizar = textLocalizar ;
this.textPresionar = textPresionar ;
}
public void mouseDragged( MouseEvent evento )
{
mouseMoved( evento ) ;
}
public void mouseMoved( MouseEvent evento )
{
textX.setText( "" + evento.getX() ) ;
textY.setText( "" + evento.getY() ) ;
}
Elabor: Ing. Jess Pando Barrn(Mocis)
147
public void mouseEntered( MouseEvent evento )
{
textLocalizar.setText( "Sobre la etiqueta" ) ;
}
public void mouseExited( MouseEvent evento )
{
textLocalizar.setText( "No est sobre la etiqueta" ) ;
}
public void mousePressed( MouseEvent evento )
{
textPresionar.setText( "Presionado" ) ;
}
public void mouseReleased( MouseEvent evento )
{
textPresionar.setText( "No se ha presionado" ) ;
}
public void mouseClicked( MouseEvent evento ) {}
}
import java.awt.* ;
import java.awt.event.* ;
public class DemoEventosMoverMouse {
private Frame frame ;
private Panel panelNorte ;
private Label etiquetaX ;
private Label etiquetaY ;
private Label etiquetaLocalizar ;
private Label etiquetaPresionar ;
private Label instruccion ;
private TextField textX ;
private TextField textY ;
private TextField textLocalizar ;
private TextField textPresionar ;
public DemoEventosMoverMouse()
{
frame = new Frame( "DualListenerDemo" ) ;
panelNorte = new Panel() ;
etiquetaX = new Label( "Coordenada X " ) ;
etiquetaY = new Label( "Coordenada Y " ) ;
etiquetaLocalizar = new Label( "Status de Localizacion" ) ;
etiquetaPresionar = new Label( "Status" ) ;
instruccion = new Label( "Mover el raton sobre la etiqueta", Label.CENTER ) ;
textX = new TextField( 20 ) ;
textY = new TextField( 20 ) ;
textLocalizar = new TextField( "No sobre la etiqueta", 20 ) ;
textPresionar = new TextField( "No se ha presionado", 20 ) ;
}
Elabor: Ing. Jess Pando Barrn(Mocis)
148
public void ejecutar()
{
etiquetaX.setBackground( Color.lightGray ) ;
etiquetaY.setBackground( Color.lightGray ) ;
etiquetaLocalizar.setBackground( Color.lightGray ) ;
etiquetaPresionar.setBackground( Color.lightGray ) ;
instruccion.setBackground( Color.lightGray ) ;
// esta serie de instrucciones permite simplificar la llamada
// a la clase tal como se muestra en las lineas comentadas
EventosMoverMouse procesa = new EventosMoverMouse( textX, textY, textLocalizar,
textPresionar ) ;
instruccion.addMouseListener( procesa ) ;
instruccion.addMouseMotionListener( procesa ) ;
//instruccion.addMouseListener( new EventosMoverMouse( textX, textY, textLocalizar,
textPresionar ) ) ;
//instruccion.addMouseMotionListener( new EventosMoverMouse( textX, textY,
textLocalizar, textPresionar ) ) ;
panelNorte.setLayout( new GridLayout( 4, 2 ) ) ;
panelNorte.add( etiquetaX ) ;
panelNorte.add( textX ) ;
panelNorte.add( etiquetaY ) ;
panelNorte.add( textY ) ;
panelNorte.add( etiquetaLocalizar ) ;
panelNorte.add( textLocalizar ) ;
panelNorte.add( etiquetaPresionar ) ;
panelNorte.add( textPresionar ) ;
frame.add( panelNorte, BorderLayout.NORTH ) ;
frame.add( instruccion, BorderLayout.CENTER ) ;
frame.setSize( 300, 200 ) ;
frame.setVisible( true ) ;
}
public static void main( String [] args )
{
DemoEventosMoverMouse demo = new DemoEventosMoverMouse() ;
demo.ejecutar() ;
}
}
Salida:
Elabor: Ing. Jess Pando Barrn(Mocis)
149
5.2 Clases adaptadoras
Se puede usar una clase adaptadora en lugar de una interfaz para que de esta manera no se tenga la necesidad
de implementar todos los mtodos tanto los que se usan como los que no
Pseudocdigo con una clase interaz
1. package java.awt.event ;
2.
3.
4.
5. public abstract class WindowAdapter implements
6.
7. WindowListener {
8.
9. public void windowOpened( WindowEvent e ) {}
10.
11. public void windowClosing( WindowEvent e ) {}
12.
13. public void windowClosed( WindowEvent e ) {}
14.
15. public void windowIconified( WindowEvent e ) {}
16.
17. public void windowDeiconified( WindowEvent e ) {}
18.
19. public void windowActivated( WindowEvent e ) {}
20.
21. public void windowDeactivated( WindowEvent e ) {}
22.
23. }
Elabor: Ing. Jess Pando Barrn(Mocis)
150
Pseudocdigo con una clase adaptadora
1. import java.awt.event.* ;
2.
3.
4.
5. public class WindowHandler extends WindowAdapter {
6.
7. public void windowClosing( WindowEvent theEvent ) {
8.
9. System.exit( 0 ) ;
10.
11. }
12.
13. }
14.
5.3 Manejando eventos con una clase interna
Ejemplo 6
DemoEventosMoverMouse2.java
import java.awt.* ;
import java.awt.event.* ;
public class DemoEventosMoverMouse2 {
private Frame frame ;
private Panel panelNorte ;
private Label etiquetaX ;
private Label etiquetaY ;
private Label etiquetaLocalizar ;
private Label etiquetaPresionar ;
private Label instruccion ;
private TextField textX ;
private TextField textY ;
private TextField textLocalizar ;
private TextField textPresionar ;
public DemoEventosMoverMouse2()
{
frame = new Frame( "DualListenerDemo" ) ;
Elabor: Ing. Jess Pando Barrn(Mocis)
151
panelNorte = new Panel() ;
etiquetaX = new Label( "Coordenada X " ) ;
etiquetaY = new Label( "Coordenada Y " ) ;
etiquetaLocalizar = new Label( "Status de Localizacion" ) ;
etiquetaPresionar = new Label( "Status" ) ;
instruccion = new Label( "Mover el raton sobre la etiqueta", Label.CENTER ) ;
textX = new TextField( 20 ) ;
textY = new TextField( 20 ) ;
textLocalizar = new TextField( "No sobre la etiqueta", 20 ) ;
textPresionar = new TextField( "No se ha presionado", 20 ) ;
}
public void ejecutar()
{
etiquetaX.setBackground( Color.lightGray ) ;
etiquetaY.setBackground( Color.lightGray ) ;
etiquetaLocalizar.setBackground( Color.lightGray ) ;
etiquetaPresionar.setBackground( Color.lightGray ) ;
instruccion.setBackground( Color.lightGray ) ;
EventosMoverMouse2 procesa = new EventosMoverMouse2( textX, textY, textLocalizar,
textPresionar ) ;
instruccion.addMouseListener( procesa ) ;
instruccion.addMouseMotionListener( procesa ) ;
panelNorte.setLayout( new GridLayout( 4, 2 ) ) ;
panelNorte.add( etiquetaX ) ;
panelNorte.add( textX ) ;
panelNorte.add( etiquetaY ) ;
panelNorte.add( textY ) ;
panelNorte.add( etiquetaLocalizar ) ;
panelNorte.add( textLocalizar ) ;
panelNorte.add( etiquetaPresionar ) ;
panelNorte.add( textPresionar ) ;
frame.add( panelNorte, BorderLayout.NORTH ) ;
frame.add( instruccion, BorderLayout.CENTER ) ;
frame.setSize( 300, 200 ) ;
frame.setVisible( true ) ;
}
public static void main( String [] args )
{
DemoEventosMoverMouse2 demo = new DemoEventosMoverMouse2() ;
demo.ejecutar() ;
}
// insercin de la clase interna
public class EventosMoverMouse2 implements MouseMotionListener, MouseListener
{
private TextField textX ;
private TextField textY ;
private TextField textLocalizar ;
private TextField textPresionar ;
public EventosMoverMouse2( TextField textX,TextField textY,TextField
textLocalizar,TextField textPresionar )
Elabor: Ing. Jess Pando Barrn(Mocis)
152
{
this.textX = textX ;
this.textY = textY ;
this.textLocalizar = textLocalizar ;
this.textPresionar = textPresionar ;
}
public void mouseDragged( MouseEvent evento )
{
mouseMoved( evento ) ;
}
public void mouseMoved( MouseEvent evento )
{
textX.setText( "" + evento.getX() ) ;
textY.setText( "" + evento.getY() ) ;
}
public void mouseEntered( MouseEvent evento )
{
textLocalizar.setText( "Sobre la etiqueta" ) ;
}
public void mouseExited( MouseEvent evento )
{
textLocalizar.setText( "No est sobre la etiqueta" ) ;
}
public void mousePressed( MouseEvent evento )
{
textPresionar.setText( "Presionado" ) ;
}
public void mouseReleased( MouseEvent evento )
{
textPresionar.setText( "No se ha presionado" ) ;
}
public void mouseClicked( MouseEvent evento )
{
textLocalizar.setText( "se ha presionado el ratn sobre la etiqueta" ) ;
}
}
}
Archivos que se generan:
Elabor: Ing. Jess Pando Barrn(Mocis)
153
La salida es similar al ejemplo 5
Existen varios componentes AWT y los eventos que escuchan y que se muestran en la siguiente tabla
Tipo de componentte Act Adj Cmp Cnt Foc Itm Key Mou MM Text Win
Button X X X X X X
Canvas X X X X X
Checkbox X X X X X X
CheckboxMenuItem X
Choice X X X X X X
Component X X X X X
Container X X X X X X
Dialog X X X X X X X
Frame X X X X X X X
Label X X X X X
List X X X X X X X
MenuItem X
Panel X X X X X X
Scrollbar X X X X X X
ScrollPane X X X X X X
Elabor: Ing. Jess Pando Barrn(Mocis)
154
TextArea X X X X X X
TextField X X X X X X X
Window X X X X X X X
Act - ActionListener
Adj - AdjustmentListener
Cmp - ComponentListener
Cnt - ContainerListener
Foc - FocusListener
Itm - ItemListener
Key - KeyListener
Mou - MouseListener
MM - MouseMotionListener
Text - TextListener
Win WindowListener
5.4 Ejemplos
Ejemplo 1
EjerGui1.java
import java.awt.event.*;
import java.awt.*;
class ManejadorEventos implements WindowListener, FocusListener, ActionListener
{
private TextField campo1;
private TextField campo2;
private Button bot1;
private TextField campo3;
private TextArea area;
ManejadorEventos()
{
}
ManejadorEventos(TextArea a)
{
area=a;
}
ManejadorEventos(Button b1, TextField c3)
{
bot1=b1;
campo3=c3;
}
ManejadorEventos(TextField c1, TextField c2)
{
campo1=c1;
Elabor: Ing. Jess Pando Barrn(Mocis)
155
campo2=c2;
}
public void windowClosing( WindowEvent e )
{
System.exit( 0 ) ;
}
public void windowOpened( WindowEvent w ) {}
public void windowIconified( WindowEvent w ) {}
public void windowDeiconified( WindowEvent w ) {}
public void windowClosed( WindowEvent w ) {}
public void windowActivated( WindowEvent w ) {}
public void windowDeactivated( WindowEvent w ) {}
public void focusGained(FocusEvent e)
{
area.append("Esta es una prueba para agregar texto a una area de texto");
}
public void focusLost(FocusEvent e)
{
campo2.setText(campo1.getText());
}
public void actionPerformed( ActionEvent e)
{
bot1.setLabel( "ha dado un click" ) ;
campo3.setText(bot1.getLabel());
}
import java.awt.* ;
import java.awt.event.* ;
public class EjerGui1
{
private Frame f;
private Label et1, et2,et3;
private TextField txtCampo1, txtCampo2, txtCampo3;
private TextArea txtArea;
private Button b1;
EjerGui1()
{
f=new Frame ("Mi primer GUI con eventos");
et1=new Label("Introduzca el primer valor",Label.CENTER);
et2=new Label("Introduzca el segundo valor",Label.CENTER);
et3=new Label("Introduzca el tercer valor",Label.CENTER);
txtCampo1=new TextField(10);
txtCampo2=new TextField(10);
txtCampo3=new TextField(10);
txtArea=new TextArea(3,30);
b1=new Button("Presiona aqu");
}
void visualizarGUI()
{
f.setLayout(new GridLayout(7,1));
Elabor: Ing. Jess Pando Barrn(Mocis)
156
et1.setFont( new Font("",Font.BOLD, 16 ) ) ;
f.add(et1);
txtCampo1.setFont( new Font( "",Font.ITALIC, 12 ) ) ;
f.add(txtCampo1);
et2.setFont( new Font( "",Font.BOLD, 14 ) ) ;
f.add(et2);
txtCampo2.setFont( new Font( "",Font.ITALIC, 12 ) ) ;
f.add(txtCampo2);
et3.setFont( new Font( "",Font.ROMAN_BASELINE, 16 ) ) ;
f.add(et3);
txtCampo3.setFont( new Font( "",Font.ITALIC, 12 ) ) ;
f.add(txtCampo3);
f.addWindowListener( new ManejadorEventos() ) ;
txtCampo1.addFocusListener(new ManejadorEventos(txtCampo1,txtCampo2));
f.add(b1);
b1.addActionListener(new ManejadorEventos(b1, txtCampo3));
f.add(txtArea);
txtArea.addFocusListener(new ManejadorEventos(txtArea));
f.setSize(400,300);
f.setVisible(true);
}
public static void main(String args[])
{
EjerGui1 gui=new EjerGui1();
gui.visualizarGUI();
}
}
Salida:
Elabor: Ing. Jess Pando Barrn(Mocis)
157
Ejemplo con dos botones
EjerGui1.java
import java.awt.event.*;
import java.awt.*;
class ManejadorEventos implements WindowListener, FocusListener, ActionListener
{
private TextField campo1;
private TextField campo2;
private Button bot1;
private Button bot2;
private TextField campo3;
private TextArea area;
ManejadorEventos()
{
Elabor: Ing. Jess Pando Barrn(Mocis)
158
}
ManejadorEventos(TextField c1, TextField c2, TextField c3, Button b1, Button b2, TextArea a)
{
campo1=c1;
campo2=c2;
campo3=c3;
bot1=b1;
bot2=b2;
area=a;
}
public void windowClosing( WindowEvent e )
{
System.exit( 0 ) ;
}
public void windowOpened( WindowEvent w ) {}
public void windowIconified( WindowEvent w ) {}
public void windowDeiconified( WindowEvent w ) {}
public void windowClosed( WindowEvent w ) {}
public void windowActivated( WindowEvent w ) {}
public void windowDeactivated( WindowEvent w ) {}
public void focusGained(FocusEvent e)
{
area.append("Esta es una prueba para agregar texto a una area de texto");
}
public void focusLost(FocusEvent e)
Elabor: Ing. Jess Pando Barrn(Mocis)
159
{
campo2.setText(campo1.getText());
}
public void actionPerformed( ActionEvent evento)
{
Button b = ( Button ) evento.getSource() ;
String text = b.getActionCommand() ;
if ( text.equals( bot1.getActionCommand() ) )
{

bot1.setLabel( "ha dado un click" ) ;
campo3.setText(bot1.getLabel());
}
else
{
if(text.equals( bot2.getActionCommand() ))
campo1.setText("esta es una prueba");
}
}
}
import java.awt.* ;
import java.awt.event.* ;
public class EjerGui1
{
Elabor: Ing. Jess Pando Barrn(Mocis)
160
private Frame f;
private Label et1, et2,et3;
private TextField txtCampo1, txtCampo2, txtCampo3;
private TextArea txtArea;
private Button b1;
private Button b2;
EjerGui1()
{
f=new Frame ("Mi primer GUI con eventos");
et1=new Label("Introduzca el primer valor",Label.CENTER);
et2=new Label("Introduzca el segundo valor",Label.CENTER);
et3=new Label("Introduzca el tercer valor",Label.CENTER);
txtCampo1=new TextField(10);
txtCampo2=new TextField(10);
txtCampo3=new TextField(10);
txtArea=new TextArea(3,30);
b1=new Button("Presiona aqu");
b2=new Button("Boton 2");
}
void visualizarGUI()
{
f.setLayout(new GridLayout(7,1));
et1.setFont( new Font("",Font.BOLD, 16 ) ) ;
f.add(et1);
txtCampo1.setFont( new Font( "",Font.ITALIC, 12 ) ) ;
Elabor: Ing. Jess Pando Barrn(Mocis)
161
f.add(txtCampo1);
et2.setFont( new Font( "",Font.BOLD, 14 ) ) ;
f.add(et2);
txtCampo2.setFont( new Font( "",Font.ITALIC, 12 ) ) ;
f.add(txtCampo2);
et3.setFont( new Font( "",Font.ROMAN_BASELINE, 16 ) ) ;
f.add(et3);
txtCampo3.setFont( new Font( "",Font.ITALIC, 12 ) ) ;
f.add(txtCampo3);
ManejadorEventos objeto =new
ManejadorEventos(txtCampo1,txtCampo2,txtCampo3,b1,b2,txtArea);
f.addWindowListener( new ManejadorEventos() ) ;
txtCampo1.addFocusListener(objeto);
f.add(b1);
b1.addActionListener(objeto);
f.add(b2);
b2.addActionListener(objeto);
f.add(txtArea);
txtArea.addFocusListener(objeto);
f.setSize(400,300);
f.setVisible(true);
}
public static void main(String args[])
{
EjerGui1 gui=new EjerGui1();
gui.visualizarGUI();
Elabor: Ing. Jess Pando Barrn(Mocis)
162
}
}
Salida :
Ejemplo 3
DemoBoton.java
import java.awt.* ;
import java.awt.event.* ;
public class DemoBoton extends WindowAdapter implements ActionListener {
private Frame f ;
private Button botonContador ; // Declare a button
private Button botonSalir ; // Declare a button
private int contador ;
public DemoBoton() {
f = new Frame( "DemoBoton" ) ;
botonContador = new Button( "contador : 0" ) ;
botonSalir = new Button( "Salir" ) ;
}
public void ejecutar() {
botonContador.addActionListener( this ) ;
botonSalir.addActionListener( this ) ;
f.addWindowListener( this ) ;
f.setLayout( new GridLayout( 2, 1 ) ) ;
f.add( botonContador ) ;
f.add( botonSalir ) ;
f.setSize( 175, 175 ) ;
f.setVisible( true ) ;
}
public static void main( String [] args ) {
DemoBoton demo = new DemoBoton() ;
demo.ejecutar() ;
}
public void actionPerformed( ActionEvent evento ) {
Button b = ( Button ) evento.getSource() ;
Elabor: Ing. Jess Pando Barrn(Mocis)
163
String text = b.getActionCommand() ;
if ( text.equals( botonSalir.getActionCommand() ) )
System.exit( 0 ) ;
else {
contador++ ;
botonContador.setLabel( "contador : " + contador ) ;
}
}
public void windowClosing( WindowEvent evento ) {
System.exit( 0 ) ;
}
}
Salida:
Los siguientes ejemplos estn divididos en tres clases para implementar y modificar ms rpido
Ejemplo
EventoBoton.java Contiene el procesamiento de los eventos
import java.awt.* ;
import java.awt.event.* ;
public class EventoBoton extends WindowAdapter implements ActionListener
{
private Button bSalir, bContador;
private int c=0;
EventoBoton(Button b1, Button b2)
{
bSalir=b1;
bContador=b2;
}
public void actionPerformed( ActionEvent evento )
{
Button b = ( Button ) evento.getSource() ;
Elabor: Ing. Jess Pando Barrn(Mocis)
164
String text = b.getActionCommand() ;
if ( text.equals( bSalir.getActionCommand() ) )
System.exit( 0 ) ;
else
{
c++ ;
bContador.setLabel( "contador : " + c ) ;
}
}
public void windowClosing( WindowEvent theEvent )
{
System.exit( 0 ) ;
}
}
DemoBoton2 Contiene la implementacin de la GUI y y los Listeners
import java.awt.* ;
import java.awt.event.* ;
class DemoBoton2
{
private Frame f ;
private Button botonContador ;
private Button botonSalir ;
private int contador ;
public DemoBoton2()
{
f = new Frame( "DemoBoton" ) ;
botonContador = new Button( "contador : 0" ) ;
botonSalir = new Button( "Salir" ) ;
}
public void ejecutar()
{
EventoBoton objeto = new EventoBoton(botonSalir, botonContador);
botonContador.addActionListener( objeto ) ;
botonSalir.addActionListener( objeto ) ;
f.addWindowListener( objeto ) ;
f.setLayout( new GridLayout( 2, 1 ) ) ;
f.add( botonContador ) ;
f.add( botonSalir ) ;
Elabor: Ing. Jess Pando Barrn(Mocis)
165
f.setSize( 175, 175 ) ;
f.setVisible( true ) ;
}
}
PruebaDemoBoton2.java Contiene la ejecucin de la interfaz y de los eventos
class PruebaDemoBoton2
{
public static void main( String [] args )
{
DemoBoton2 demo = new DemoBoton2() ;
demo.ejecutar() ;
}
}
5.5 Posicionamiento Absoluto
Los Componentes se pueden colocar en Contenedores utilizando cualquiera de los controladores de
posicionamiento, o utilizando posicionamiento absoluto para realizar esta funcin. La primera forma de
colocar los Componentes se considera ms segura porque automticamente sern compensadas las diferencias
que se puedan encontrar entre resoluciones de pantalla de plataformas distintas.
La clase Component proporciona mtodos para especificar la posicin y tamao de un Componente en
coordenadas absolutas indicadas en pixels:
setBounds( int,int,int,int );
setBounds( Rectangle );
La posicin y tamao si se especifica en coordenadas absolutas, puede hacer ms difcil la consecucin de una
apariencia uniforme, en diferentes plataformas, del interfaz, segn algunos autores; pero, a pesar de ello, es
interesante saber cmo se hace.
Hay dos versiones sobrecargadas de setBounds(). Una de ellas permite que tamao y posicin se indiquen a
travs de cuatro enteros: ordenadas, abscisas, ancho y alto. La otra versin requiere que se utilice un objeto
Rectangle, que se pasa como parmetro al mtodo. Esta ltima versin es ms flexible, porque la clase
Rectangle tiene siete constructores diferentes que pueden ser utilizados para crear la caja que indicar la
posicin y tamao del componente.
Ejemplo
import java.awt.*;
class PruebaSetBounds
{
Elabor: Ing. Jess Pando Barrn(Mocis)
166
private Button b1,b2,b3;
private Frame f;
PruebaSetBounds()
{
b1 = new Button("boton 1");
b2 = new Button("boton 2");
b3 = new Button("boton 3");
f= new Frame ("Prueba de setBounds");
}
void visualizar()
{
f.setLayout(null);
// el primer par de nmeros establece el origen del objeto en pixels
// el segundo par de nmeros establece la anchura y la altura del objeto
b1.setBounds(20,20,50,30);
f.add(b1);
b2.setBounds(new Rectangle(100,75,100,75));
f.add(b2);
b3.setBounds(300,100,50,80);
f.add(b3);
f.setSize(400,200);
f.setBackground(Color.BLUE);
f.setVisible(true);
}
public static void main(String args[])
{
PruebaSetBounds obj = new PruebaSetBounds();
obj.visualizar();
}
}
Salida:
Elabor: Ing. Jess Pando Barrn(Mocis)
167
Ejemplo para seleccionar varios botones
GuiVariosBotones.java
import java.awt.* ;
import java.awt.event.* ;
class GuiVariosBotones
{
private Frame f ;
private Button b1,b2,b3 ;
private TextField t1,t2,t3;
public GuiVariosBotones()
{
f = new Frame( "DemoBoton" ) ;
b1 = new Button( "boton 1" ) ;
b2 = new Button( "boton 2" ) ;
b3 = new Button( "boton 3" ) ;
t1=new TextField(20);
t2=new TextField(20);
t3=new TextField(20);
}
public void ejecutar()
{
f.setLayout( new GridLayout( 6, 1 ) ) ;
Elabor: Ing. Jess Pando Barrn(Mocis)
168
EventoVariosBoton obj = new EventoVariosBoton(b1,b2,b3,t1,t2,t3);

f.addWindowListener( new EventoVariosBoton()) ;

f.add( b1 ) ;
f.add( t1 ) ;
f.add( b2 ) ;
f.add( t2 ) ;
f.add( b3 ) ;
f.add( t3 ) ;

b1.addActionListener( obj ) ;
b2.addActionListener( obj ) ;
b3.addActionListener( obj ) ;

f.setVisible( true ) ;
f.pack();
}
}
EventoVariosBoton.java
import java.awt.* ;
import java.awt.event.* ;
public class EventoVariosBoton extends WindowAdapter implements ActionListener
{
private Button b1,b2,b3;
private TextField t1,t2,t3;
EventoVariosBoton()
{
}
EventoVariosBoton(Button b1, Button b2, Button b3, TextField t1, TextField t2, TextField t3)
{
this.b1=b1;
this.b2=b2;
this.b3=b3;
this.t1=t1;
this.t2=t2;
this.t3=t3;
}
public void actionPerformed( ActionEvent evento )
{
// esta instruccin permite almacenar el caracter de la posicin 6 de la
// etiqueta del botn que permite diferenciar a cada uno
char operador = evento.getActionCommand().charAt(6);
Elabor: Ing. Jess Pando Barrn(Mocis)
169
switch (operador)
{
case '1':
t1.setText("boton 1");
break;
case '2':
t2.setText("boton 2");
break;
case '3':
t3.setText("boton 3");
break;
}
}
public void windowClosing( WindowEvent evento )
{
System.exit( 0 ) ;
}
}
PruebaVariosBotones.java
class PruebaVariosBotones
{
public static void main( String [] args )
{
GuiVariosBotones demo = new GuiVariosBotones() ;
demo.ejecutar() ;
}
}
Ejemplo 2
GuiVariosBotones2.java
import java.awt.* ;
import java.awt.event.* ;
class GuiVariosBotones2
{
private Frame f ;
private Button b1,b2,b3 ;
private TextField t1,t2,t3;
Elabor: Ing. Jess Pando Barrn(Mocis)
170
public GuiVariosBotones2()
{
f = new Frame( "DemoBoton" ) ;
b1 = new Button( "boton 1" ) ;
b2 = new Button( "boton 2" ) ;
b3 = new Button( "boton 3" ) ;
t1=new TextField(20);
t2=new TextField(20);
t3=new TextField(20);
}
public void ejecutar()
{
f.setLayout( new GridLayout( 6, 1 ) ) ;
EventosVariosBotones2 obj = new EventosVariosBotones2(b1,b2,b3,t1,t2,t3);

f.addWindowListener( new EventosVariosBotones2()) ;

f.add( b1 ) ;
f.add( t1 ) ;
f.add( b2 ) ;
f.add( t2 ) ;
f.add( b3 ) ;
f.add( t3 ) ;

b1.addActionListener( obj ) ;
b2.addActionListener( obj ) ;
b3.addActionListener( obj ) ;

f.setVisible( true ) ;
f.pack();
}
}
EventosVariosBotones2.java
import java.awt.* ;
import java.awt.event.* ;
public class EventosVariosBotones2 extends WindowAdapter implements ActionListener
{
private Button b1,b2,b3;
private TextField t1,t2,t3;
EventosVariosBotones2()
{
}
EventosVariosBotones2(Button b1, Button b2, Button b3, TextField t1, TextField t2, TextField t3)
{
this.b1=b1;
this.b2=b2;
this.b3=b3;
this.t1=t1;
this.t2=t2;
Elabor: Ing. Jess Pando Barrn(Mocis)
171
this.t3=t3;
}
public void actionPerformed( ActionEvent evento )
{
Object fuente = evento.getSource();
if(fuente==b1)
t1.setText("boton 1");
else if(fuente==b2)
t2.setText("boton 2");
else if(fuente==b3)
t3.setText("boton 3");

}
public void windowClosing( WindowEvent evento )
{
System.exit( 0 ) ;
}
}
PruebaVariosBotones2.java
class PruebaVariosBotones2
{
public static void main( String [] args )
{
GuiVariosBotones2 demo = new GuiVariosBotones2() ;
demo.ejecutar() ;
}
}
Elabor: Ing. Jess Pando Barrn(Mocis)
172
5.6 Checkbox
GuiCheckbox.java
import java.awt.* ;
import java.awt.event.* ;
public class GuiCheckbox
{
private Frame f ;
private Label et ;
private Checkbox leer ;
private Checkbox pintar ;
private Checkbox correr ;
public GuiCheckbox()
{
f = new Frame( "GuiCheckbox" ) ;
et = new Label( "Pasatiempos : " ) ;
leer = new Checkbox( "leer ", false ) ;
pintar = new Checkbox( "pintar", false ) ;
correr = new Checkbox( "correr ", false ) ;
}
public void ejecutar()
{
EventoCheckbox procesar = new EventoCheckbox();
Elabor: Ing. Jess Pando Barrn(Mocis)
173
leer.addItemListener( procesar ) ;
pintar.addItemListener( procesar ) ;
correr.addItemListener( procesar ) ;
f.addWindowListener( procesar ) ;
f.setLayout( new FlowLayout() ) ;
f.add( et ) ;
f.add( leer ) ;
f.add( pintar ) ;
f.add( correr ) ;
f.pack() ;
f.setVisible( true ) ;
}
}
EventoCheckbox.java
import java.awt.*;
import java.awt.event.*;
public class EventoCheckbox extends WindowAdapter implements ItemListener
{
public void itemStateChanged( ItemEvent evento )
{
Checkbox cbox = ( Checkbox ) evento.getSource() ;
System.out.println( cbox.getLabel() + " : " +
cbox.getState() ) ;
}
public void windowClosing( WindowEvent evento )
{
System.exit( 0 ) ;
}
}
PruebaDemoCheckbox.java
class PruebaDemoCheckbox
{
public static void main( String [] args )
{
GuiCheckbox demo = new GuiCheckbox() ;
demo.ejecutar() ;
}
}
Salida:
Elabor: Ing. Jess Pando Barrn(Mocis)
174
5.7 Componentes Choice y List
Choice
GuiChoice.java
import java.awt.* ;
import java.awt.event.* ;
public class GuiChoice
{
private Frame f ;
private Choice sel ;
private TextField t1;
private String [] diasDeLaSemana =
{"Domingo","Lunes","Martes","Miercoles","Jueves","Viernes","Sabado"};
public GuiChoice()
{
f = new Frame( "Gui Choice" ) ;
sel = new Choice() ;
t1 = new TextField(20);
}
public void ejecutar()
{
for ( int i = 0 ; i < diasDeLaSemana.length ; i++ )
sel.addItem( diasDeLaSemana[ i ] ) ;
EventosChoice obj =new EventosChoice(sel,t1);
Elabor: Ing. Jess Pando Barrn(Mocis)
175
sel.addItemListener( obj ) ;
f.addWindowListener( new EventosChoice() ) ;
f.add( sel,BorderLayout.NORTH ) ;
f.add(t1,BorderLayout.CENTER);
f.pack() ;
f.setVisible( true ) ;
}
}
EventosChoice.java
import java.awt.* ;
import java.awt.event.* ;
public class EventosChoice extends WindowAdapter implements ItemListener
{
private Choice sel;
private TextField t1;
private int c=0;
EventosChoice()
{
}
EventosChoice(Choice sel, TextField t1)
{
this.sel=sel;
this.t1=t1;
}
public void itemStateChanged( ItemEvent evento )
{
String etiqueta = ( String ) evento.getItem() ;
System.out.println( "Seleccion : " + etiqueta ) ;

if ( etiqueta.equals( "Lunes" ) )
t1.setText("Se ha seleccionado Lunes");
else
if ( etiqueta.equals( "Martes" ) )
t1.setText("Se ha seleccionado Martes");
else
if ( etiqueta.equals( "Miercoles" ) )
t1.setText("Se ha seleccionado Miercoles");
else
if ( etiqueta.equals( "Jueves" ) )
t1.setText("Se ha seleccionado Jueves");
else
if ( etiqueta.equals( "Viernes" ) )
t1.setText("Se ha seleccionado Viernes");
else
if ( etiqueta.equals( "Sabado" ) )
Elabor: Ing. Jess Pando Barrn(Mocis)
176
t1.setText("Se ha seleccionado Sabado");
else
if ( etiqueta.equals( "Domingo" ) )
t1.setText("Se ha seleccionado Domingo");
}
public void windowClosing( WindowEvent theEvent )
{
System.exit( 0 ) ;
}
}
PruebaChoice.java
class PruebaChoice
{
public static void main( String [] args )
{
GuiChoice demo = new GuiChoice() ;
demo.ejecutar() ;
}
}
List
GuiList.java
import java.awt.* ;
import java.awt.event.* ;
public class GuiList
{
private Frame f ;
private List lista;
private String [] diasDeLaSemana =
{"Domingo","Lunes","Martes","Miercoles","Jueves","Viernes","Sabado"};
public GuiList()
{
f = new Frame( "GuiList" ) ;
lista = new List(4,true) ;
}
public void ejecutar()
{
for ( int i = 0 ; i < diasDeLaSemana.length ; i++ )
lista.addItem( diasDeLaSemana[ i ] ) ;
EventosLista obj =new EventosLista(lista);
lista.addItemListener( obj ) ;
f.addWindowListener( new EventosLista() ) ;
f.add( lista) ;
Elabor: Ing. Jess Pando Barrn(Mocis)
177
f.pack() ;
f.setVisible( true ) ;
}
}
EventosLista.java
import java.awt.* ;
import java.awt.event.* ;
public class EventosLista extends WindowAdapter implements ItemListener
{
private List lista;
private int c=0;
EventosLista()
{
}
EventosLista(List lista)
{
this.lista=lista;
}

public void itemStateChanged( ItemEvent evento ) {
String [] itemsSeleccionados = lista.getSelectedItems() ;
System.out.println( "items actualmente seleccionados" ) ;
for ( int i = 0 ; i < itemsSeleccionados.length ; i++ )
System.out.println( itemsSeleccionados[ i ] ) ;
System.out.println() ;
}
public void windowClosing( WindowEvent evento )
{
System.exit( 0 ) ;
}
}
PruebaList.java
class PruebaList
{
public static void main( String [] args )
{
GuiList demo = new GuiList() ;
demo.ejecutar() ;
}
}
Elabor: Ing. Jess Pando Barrn(Mocis)
178
5.8 Componentes de Texto
GuiText1.java
import java.awt.* ;
import java.awt.event.* ;
public class GuiText1
{
private Frame f ;
private Label etiqueta ;
private Label etiquetaPassword ;
private TextField nombreCampo ;
private TextField campoPassword ;
private Button botonLimpiar ;
private Button botonEnviar ;
private final static int WIDTH = 20 ;
public GuiText1( String titulo )
{
f = new Frame( titulo ) ;
etiqueta = new Label( "Nombre" ) ;
etiquetaPassword = new Label( "Password" ) ;
nombreCampo = new TextField( WIDTH ) ;
campoPassword = new TextField( WIDTH ) ;
Elabor: Ing. Jess Pando Barrn(Mocis)
179
botonLimpiar = new Button( "Limpiar" ) ;
botonEnviar = new Button( "Enviar" ) ;
}
public void ejecutar()
{
EventosGuiText1 obj = new
EventosGuiText1(nombreCampo,campoPassword,botonLimpiar,botonEnviar);
nombreCampo.addActionListener( obj ) ;
campoPassword.addActionListener( obj ) ;
botonLimpiar.addActionListener( obj ) ;
botonEnviar.addActionListener( obj ) ;
f.addWindowListener( obj) ;
campoPassword.setEchoChar( '*' ) ;
etiqueta.setBackground( Color.lightGray ) ;
etiquetaPassword.setBackground( Color.lightGray ) ;
f.setLayout( new GridLayout( 3, 2 ) ) ;
f.add( etiqueta ) ;
f.add( nombreCampo ) ;
f.add( etiquetaPassword ) ;
f.add( campoPassword ) ;
f.add( botonLimpiar ) ;
f.add( botonEnviar ) ;
f.pack() ;
f.setVisible( true ) ;
}
}
EventosGuiText1.java
import java.awt.* ;
import java.awt.event.* ;
public class EventosGuiText1 extends WindowAdapter implements ActionListener
{
private TextField nombreCampo ;
private TextField campoPassword ;
private Button botonLimpiar ;
private Button botonEnviar ;
EventosGuiText1(TextField nombreCampo, TextField campoPassword, Button
botonLimpiar, Button botonEnviar)
{
this.nombreCampo=nombreCampo ;
this.campoPassword=campoPassword ;
this.botonLimpiar=botonLimpiar ;
this.botonEnviar=botonEnviar ;
}
public void actionPerformed( ActionEvent evento)
{
Elabor: Ing. Jess Pando Barrn(Mocis)
180
Object fuente = evento.getSource() ;
if ( fuente instanceof TextField )
{
if ( fuente == nombreCampo )
campoPassword.requestFocus() ;
else
nombreCampo.requestFocus() ;
}
else
{
if ( fuente == botonLimpiar )
{
nombreCampo.setText( "" ) ;
campoPassword.setText( "" ) ;
}
else
{
System.out.println( "Nombre : " + nombreCampo.getText() ) ;
System.out.println( "Password : " + campoPassword.getText() ) ;
System.exit( 0 ) ;
}
}
}
public void windowClosing( WindowEvent theEvent )
{
System.exit( 0 ) ;
}
}
PruebaGuiText1.java
public class PruebaGuiText1
{
public static void main( String args [] )
{
GuiText1 demo =new GuiText1( "Demo de TextFiled" ) ;
demo.ejecutar() ;
}
}
Salida:
Elabor: Ing. Jess Pando Barrn(Mocis)
181
GuiText2.java
import java.awt.* ;
import java.awt.event.* ;
import java.io.* ;
import java.awt.*;
import java.awt.event.*;
public class GuiText2
{
private Frame f ;
private Label etiquetaDirectorio ;
private TextField entradaDirectorio ;
private Label etiquetaArchivo ;
private TextField entradaArchivo ;
private TextArea cuerpoArchivo;
private Button botonLlamar ;
private Button botonLimpiar ;
private Button botonSalir ;
private Panel northPanel ;
private Panel southPanel ;
private final static int ALTURA = 20 ;
private final static int ANCHURA= 40 ;
public GuiText2( String titulo )
{
f = new Frame( titulo ) ;
etiquetaDirectorio = new Label( "Directorio" ) ;
entradaDirectorio = new TextField( ANCHURA) ;
etiquetaArchivo = new Label( "Nombre del Archivo" ) ;
entradaArchivo = new TextField( ANCHURA) ;
cuerpoArchivo= new TextArea( ALTURA, ANCHURA) ;
botonLlamar = new Button( "Llamar" ) ;
botonLimpiar = new Button( "Limpiar" ) ;
botonSalir = new Button( "Salir" ) ;
northPanel = new Panel() ;
southPanel = new Panel() ;
}
public void ejecutar()
{
EventosGuiText2 obj =new
EventosGuiText2(entradaDirectorio,entradaArchivo,botonLlamar,botonLimpiar,botonSalir,cuerpoArchivo);
entradaDirectorio.addActionListener( obj ) ;
entradaArchivo.addActionListener( obj ) ;
botonLlamar.addActionListener( obj ) ;
botonLimpiar.addActionListener( obj ) ;
botonSalir.addActionListener( obj ) ;
f.addWindowListener( obj) ;
cuerpoArchivo.setEditable( false ) ;
etiquetaDirectorio.setBackground( Color.lightGray ) ;
Elabor: Ing. Jess Pando Barrn(Mocis)
182
etiquetaArchivo.setBackground( Color.lightGray ) ;
northPanel.setLayout( new GridLayout( 2, 2 ) ) ;
northPanel.add( etiquetaDirectorio ) ;
northPanel.add( entradaDirectorio ) ;
northPanel.add( etiquetaArchivo ) ;
northPanel.add( entradaArchivo ) ;
southPanel.setLayout( new GridLayout( 1, 3 ) ) ;
southPanel.add( botonLlamar ) ;
southPanel.add( botonLimpiar ) ;
southPanel.add( botonSalir ) ;
f.add( northPanel, BorderLayout.NORTH ) ;
f.add( cuerpoArchivo, BorderLayout.CENTER ) ;
f.add( southPanel, BorderLayout.SOUTH ) ;
f.pack() ;
f.setVisible( true ) ;
}

}
EventosGuiText2.java
import java.awt.*;
import java.awt.event.*;
import java.io.* ;
public class EventosGuiText2 extends WindowAdapter implements ActionListener
{
private TextField entradaDirectorio ;
private TextField entradaArchivo ;
private Button botonLlamar ;
private Button botonLimpiar ;
private Button botonSalir ;
private TextArea cuerpoArchivo;
EventosGuiText2(TextField entradaDirectorio, TextField entradaArchivo, Button botonLlamar,
Button botonLimpiar, Button botonSalir, TextArea cuerpoArchivo)
{
Elabor: Ing. Jess Pando Barrn(Mocis)
183
this.cuerpoArchivo=cuerpoArchivo;
this.entradaDirectorio=entradaDirectorio;
this.entradaArchivo=entradaArchivo;
this.botonLlamar=botonLlamar;
this.botonLimpiar=botonLimpiar;
this.botonSalir=botonSalir;
}
private String obtenerArchivo( String directoryName, String fileName ) throws IOException
{
FileReader file = null ;
char [] buffer = new char[ 128 ] ;
String content = "" ;
if ( fileName.length() + directoryName.length() > 0 )
{
String path = directoryName ;
if ( ! path.equals( "" ) )
path += System.getProperty( "file.separator" ) ;
path += fileName ;
file = new FileReader( path ) ;
int bytes = 0 ;
while ( file.read( buffer ) != -1 )
content += new String( buffer ) ;
file.close() ;
}
return content ;
}
public void actionPerformed( ActionEvent evento )
{
Object fuente = evento.getSource() ;
if ( fuente == entradaDirectorio )
entradaArchivo.requestFocus() ;
else if ( fuente == entradaArchivo )
entradaDirectorio.requestFocus() ;
else if ( fuente == botonLlamar )
{
try
{
String contenido = obtenerArchivo( entradaDirectorio.getText(),
entradaArchivo.getText() ) ;
cuerpoArchivo.setText( contenido ) ;
}
catch ( IOException io )
{
cuerpoArchivo.setText( "Error en la lectura del archivo" ) ;
}
cuerpoArchivo.setCaretPosition( 0 ) ;
entradaDirectorio.requestFocus() ;
}
else if ( fuente == botonLimpiar )
{
entradaDirectorio.setText( "" ) ;
entradaArchivo.setText( "" ) ;
cuerpoArchivo.setText( "" ) ;
entradaDirectorio.requestFocus() ;
Elabor: Ing. Jess Pando Barrn(Mocis)
184
}
else
System.exit( 0 ) ;
}
public void windowClosing( WindowEvent evento )
{
System.exit( 0 ) ;
}}
PruebaGuiText2.java
class PruebaGuiText2
{
public static void main( String args [] )
{
GuiText2 demo = new GuiText2( "Demo 2 de textos" ) ;
demo.ejecutar() ;
}}
Salida:
5.9 Componentes Canvas y Scrollpane
Un canvas es un rea rectangular vacia de la pantalla dentro de la cual una aplicacin puede dibujar, desplegar
textos, banderizar imgenes y atrapar entradas de eventos.
Canvas
DemoCanvas.java
import java.awt.* ;
import java.awt.event.* ;
import java.util.* ;
public class DemoCanvas extends WindowAdapter implements ActionListener
{
private Frame f ;
private SketchCanvas canvas;
Elabor: Ing. Jess Pando Barrn(Mocis)
185
private Button boton ;
public DemoCanvas()
{
f = new Frame( "Demo Canvas" ) ;
canvas= new SketchCanvas() ;
boton = new Button( "Limpiar" ) ;
}
public void ejecutar()
{
boton.addActionListener( this ) ;
f.addWindowListener( this ) ;
f.add( canvas, BorderLayout.CENTER ) ;
f.add( boton, BorderLayout.SOUTH ) ;
f.pack() ;
f.setVisible( true ) ;
}
public static void main( String [] args )
{
DemoCanvas demo = new DemoCanvas() ;
demo.ejecutar() ;
}
public void actionPerformed( ActionEvent evento )
{
canvas.limpiar() ;
}
public void windowClosing( WindowEvent evento )
{
System.exit( 0 ) ;
}
/////////////////////////////////////////////////////
public class SketchCanvas extends Canvas implements MouseListener, MouseMotionListener
{
private Vector vector ;
private int inicioX ;
private int inicioY ;
public SketchCanvas()
{
vector = new Vector() ;
setSize( 200, 200 ) ;
addMouseMotionListener( this ) ;
addMouseListener( this ) ;
}
private void drawLine( Graphics graficos, int [] puntos )
Elabor: Ing. Jess Pando Barrn(Mocis)
186
{
graficos.drawLine( puntos[ 0 ], puntos[ 1 ],puntos[ 2 ], puntos[ 3 ] ) ;
}
public void limpiar()
{
Graphics graficos = getGraphics() ;
Dimension dimension = getSize() ;
int altura = ( int ) dimension.getHeight() ;
int anchura = ( int ) dimension.getWidth() ;
graficos.clearRect( 0, 0, anchura, altura ) ;
vector.clear() ;
}
public void paint( Graphics graficos )
{
Iterator iteracion = vector.iterator() ;
while ( iteracion.hasNext() )
{
int [] puntos = ( int [] ) iteracion.next() ;
drawLine( graficos, puntos ) ;
}
}
public void mousePressed( MouseEvent evento )
{
inicioX = evento.getX() ;
inicioY = evento.getY() ;
}
public void mouseDragged( MouseEvent evento )
{
Graphics graficos = getGraphics() ;
int finX = evento.getX() ;
int finY = evento.getY() ;
int [] puntos = {inicioX, inicioY, finX, finY} ;
drawLine( graficos, puntos ) ;
vector.add( puntos ) ;
inicioX = finX ;
inicioY = finY ;
}
public void mouseMoved( MouseEvent evento ) {}
public void mouseClicked( MouseEvent evento ) {}
public void mouseEntered( MouseEvent evento ) {}
public void mouseExited( MouseEvent evento ) {}
public void mouseReleased( MouseEvent evento ) {}
Elabor: Ing. Jess Pando Barrn(Mocis)
187
}
}
Salida:
ScrollPane
DemoScrollPane.java
import java.awt.* ;
import java.awt.event.* ;
import java.awt.image.* ;
public class DemoScrollPane extends WindowAdapter
{
private Frame f ;
private ScrollPane scrollPane ;
private ImageCanvas canvas ;
public DemoScrollPane( String titulo, String gif )
Elabor: Ing. Jess Pando Barrn(Mocis)
188
{
f = new Frame( titulo ) ;
scrollPane = new ScrollPane() ;
canvas = new ImageCanvas( gif ) ;
}
public void ejecutar()
{
f.addWindowListener( this ) ;
scrollPane.add( canvas ) ;
f.add( scrollPane ) ;
f.setSize( 400, 400 ) ;
f.setVisible( true ) ;
}
public void windowClosing( WindowEvent theEvent )
{
System.exit( 0 ) ;
}
public class ImageCanvas extends Canvas
{
private Image imagen ;
public ImageCanvas( String gif )
{
imagen = f.getToolkit().getImage( gif ) ;
MediaTracker tracker = new MediaTracker( this ) ;
tracker.addImage( imagen, 0 ) ;
try
{
tracker.waitForID( 0 ) ;
}
catch ( Exception theException ) {}
this.imagen = imagen ;
}
public void paint( Graphics graphics )
{
graphics.drawImage( imagen, 0, 0, this ) ;
}
public void update( Graphics graphics )
{
paint( graphics ) ;
}
public Dimension getPreferredSize()
{
return new Dimension(imagen.getWidth( this ),imagen.getHeight( this ) ) ;
}
Elabor: Ing. Jess Pando Barrn(Mocis)
189
}
}
PruebaDemoScrollPane.java
public class PruebaDemoScrollPane
{
public static void main( String [] args )
{
DemoScrollPane demo =
new DemoScrollPane( "Demo ScrollPane", "prueba.gif" ) ;
demo.ejecutar() ;
}
}
Salida:
Dialogos
DemoVentanaDialogo.java
import java.awt.* ;
import java.awt.event.* ;
import java.io.* ;
public class DemoVentanaDialogo extends WindowAdapter implements ActionListener
{
private Frame f ;
private Label etiquetaDirectorio ;
private TextField entradaDirectorio ;
private Label etiquetaArchivo ;
private TextField entradaArchivo ;
Elabor: Ing. Jess Pando Barrn(Mocis)
190
private TextArea cuerpoArchivo ;
private Button botonLlamar ;
private Button botonLimpiar ;
private Button botonSalir ;
private Panel panelNorte ;
private Panel panelSur ;
private Dialog dialogo ;
private Panel panel ;
private Label advertencia;
private Button desconocido ;
private FileDialog archivoDialogo ;
private final static int ALTURA = 20 ;
private final static int ANCHURA = 40 ;
public DemoVentanaDialogo( String titulo )
{
f = new Frame( titulo ) ;
etiquetaDirectorio = new Label( "Directorio" ) ;
entradaDirectorio = new TextField( ANCHURA ) ;
etiquetaArchivo = new Label( "Nombre del archivo" ) ;
entradaArchivo = new TextField( ANCHURA ) ;
cuerpoArchivo = new TextArea( ALTURA, ANCHURA ) ;
botonLlamar = new Button( "Llamar" ) ;
botonLimpiar = new Button( "Limpiar" ) ;
botonSalir = new Button( "Salir" ) ;
panelNorte = new Panel() ;
panelSur = new Panel() ;
dialogo = new Dialog( f, "Warning", true ) ;
panel = new Panel() ;
advertencia= new Label("Error al llamar el archivo", Label.CENTER ) ;
desconocido = new Button( "OK" ) ;
archivoDialogo = new FileDialog( f, "Browse", FileDialog.LOAD ) ;
}
public void ejecutar()
{
entradaDirectorio.addActionListener( this ) ;
entradaArchivo.addActionListener( this ) ;
botonLlamar.addActionListener( this ) ;
botonLimpiar.addActionListener( this ) ;
botonSalir.addActionListener( this ) ;
f.addWindowListener( this ) ;
cuerpoArchivo.setEditable( false ) ;
etiquetaDirectorio.setBackground( Color.lightGray ) ;
etiquetaArchivo.setBackground( Color.lightGray ) ;
panelNorte.setLayout( new GridLayout( 2, 2 ) ) ;
panelNorte.add( etiquetaDirectorio ) ;
panelNorte.add( entradaDirectorio ) ;
panelNorte.add( etiquetaArchivo ) ;
panelNorte.add( entradaArchivo ) ;
panelSur.setLayout( new GridLayout( 1, 3 ) ) ;
panelSur.add( botonLlamar ) ;
panelSur.add( botonLimpiar ) ;
panelSur.add( botonSalir ) ;
f.add( panelNorte, BorderLayout.NORTH ) ;
f.add( cuerpoArchivo, BorderLayout.CENTER ) ;
Elabor: Ing. Jess Pando Barrn(Mocis)
191
f.add( panelSur, BorderLayout.SOUTH ) ;
f.pack() ;
f.setVisible( true ) ;
desconocido.addActionListener( this ) ;
dialogo.addWindowListener( this ) ;
dialogo.setLayout( new GridLayout( 2, 1 ) ) ;
dialogo.add( advertencia) ;
panel.add( desconocido ) ;
dialogo.add( panel ) ;
dialogo.pack() ;
dialogo.setResizable( false ) ;
}
private String getFile( String nombreDirectorio, String nombreArchivo ) throws IOException
{
FileReader archivo = null ;
char [] buffer = new char[ 128 ] ;
String contenido = "" ;
if ( nombreArchivo.length() + nombreDirectorio.length() > 0 )
{
String path = nombreDirectorio ;
if ( ! path.equals( "" ) )
path += System.getProperty( "archivo.separator" ) ;
path += nombreArchivo ;
archivo = new FileReader( path ) ;
int bytes = 0 ;
while ( archivo.read( buffer ) != -1 )
contenido += new String( buffer ) ;
archivo.close() ;
}
return contenido ;
}
public void actionPerformed( ActionEvent theEvent )
{
Object fuente = theEvent.getSource() ;
if ( fuente == entradaDirectorio )
entradaArchivo.requestFocus() ;
else if ( fuente == entradaArchivo )
entradaDirectorio.requestFocus() ;
else if ( fuente == botonLlamar )
{
if ( entradaArchivo.getText().length() +
entradaDirectorio.getText().length() == 0 )
{
archivoDialogo.setVisible( true ) ;
entradaDirectorio.setText
( archivoDialogo.getDirectory() ) ;
entradaArchivo.setText( archivoDialogo.getFile() ) ;
}
try
{
Elabor: Ing. Jess Pando Barrn(Mocis)
192
String contenido = getFile( entradaDirectorio.getText(),
entradaArchivo.getText() ) ;
cuerpoArchivo.setText( contenido ) ;
}
catch ( IOException io )
{
cuerpoArchivo.setText( "" ) ;
int altura = ( f.getHeight() -dialogo.getHeight() ) / 2 ;
int anchura = ( f.getWidth() -dialogo.getWidth() ) / 2 ;
Point punto =f.getLocationOnScreen() ;
int x = ( int ) punto.getX() + anchura ;
int y = ( int ) punto.getY() + altura ;
dialogo.setLocation( x, y ) ;
dialogo.setVisible( true ) ;
}
cuerpoArchivo.setCaretPosition( 0 ) ;
entradaDirectorio.requestFocus() ;
}
else if ( fuente == botonLimpiar )
{
entradaDirectorio.setText( "" ) ;
entradaArchivo.setText( "" ) ;
cuerpoArchivo.setText( "" ) ;
entradaDirectorio.requestFocus() ;
}
else if ( fuente == desconocido )
dialogo.dispose() ;
else
System.exit( 0 ) ;
}
public void windowClosing( WindowEvent theEvent )
{
Object fuente = theEvent.getSource() ;
if ( fuente == dialogo )
dialogo.dispose() ;
else
System.exit( 0 ) ;
}
}
PruebaDemoVentanaDialogo.java
public class PruebaDemoVentanaDialogo
{
public static void main( String args [] )
{
DemoVentanaDialogo demo = new DemoVentanaDialogo( "DemoVentanaDialogo" ) ;
demo.ejecutar() ;
}
}
Elabor: Ing. Jess Pando Barrn(Mocis)
193
Salida:
5.10 Componentes Menu
Elabor: Ing. Jess Pando Barrn(Mocis)
194
Ejemplo
GuiDemoMenu1.java
import java.awt.* ;
import java.awt.event.* ;
public class GuiDemoMenu1
{
private Frame f ;
private TextArea textArea ;
private MenuBar BarraMenu ;
private Menu MenuArchivo ;
private MenuItem llamar ;
private MenuItem guardar ;
private MenuItem salir ;
private Menu menuBuscar ;
private MenuItem encontrar ;
private MenuItem reemplazar ;
private Menu menuPropiedades ;
private CheckboxMenuItem checar ;
private CheckboxMenuItem todo ;
private Menu menuHelp ;
private MenuItem indexar ;
private final static int ALTURA = 20 ;
private final static int ANCHURA = 40 ;
public GuiDemoMenu1( String titulo )
{
f = new Frame( titulo ) ;
textArea = new TextArea( ALTURA, ANCHURA ) ;
Elabor: Ing. Jess Pando Barrn(Mocis)
195
indexar = new MenuItem( "indexar" ) ;
menuHelp = new Menu( "Ayuda" ) ;
checar = new CheckboxMenuItem( "checar opcion" ) ;
todo = new CheckboxMenuItem( "reemplazar todo" ) ;
menuPropiedades = new Menu( "Properties" ) ;
encontrar = new MenuItem( "encontrar" ) ;
reemplazar = new MenuItem( "reemplazar" ) ;
menuBuscar = new Menu( "Buscar" ) ;
llamar = new MenuItem( "llamar" ) ;
guardar = new MenuItem( "guardar" ) ;
salir = new MenuItem( "salir" ) ;
MenuArchivo = new Menu( "Archivo" ) ;
BarraMenu = new MenuBar() ;
}
public void ejecutar()
{
EventosDemoMenu1 obj =new
EventosDemoMenu1(llamar,guardar,salir,encontrar,reemplazar,indexar,checar,todo);
llamar.addActionListener( obj ) ;
guardar.addActionListener( obj ) ;
salir.addActionListener( obj ) ;
encontrar.addActionListener( obj ) ;
reemplazar.addActionListener( obj ) ;
indexar.addActionListener( obj ) ;
checar.addActionListener( obj ) ;
todo.addActionListener( obj ) ;
f.addWindowListener( obj ) ;
f.add( textArea, BorderLayout.CENTER ) ;
MenuArchivo.add( llamar ) ;
MenuArchivo.add( guardar ) ;
MenuArchivo.addSeparator() ;
MenuArchivo.add( salir ) ;
menuBuscar.add( encontrar ) ;
menuBuscar.add( reemplazar ) ;
menuBuscar.addSeparator() ;
menuBuscar.add( menuPropiedades ) ;
menuPropiedades.add( checar ) ;
menuPropiedades.add( todo ) ;
menuHelp.add( indexar ) ;
BarraMenu.add( MenuArchivo ) ;
BarraMenu.add( menuBuscar ) ;
BarraMenu.setHelpMenu( menuHelp ) ;
f.setMenuBar( BarraMenu ) ;
f.pack() ;
f.setVisible( true ) ;
}
}
EventosDemoMenu1.java
import java.awt.* ;
import java.awt.event.* ;
public class EventosDemoMenu1 extends WindowAdapter implements ActionListener
{
private MenuItem llamar ;
Elabor: Ing. Jess Pando Barrn(Mocis)
196
private MenuItem guardar ;
private MenuItem salir ;
private MenuItem encontrar ;
private MenuItem reemplazar ;
private CheckboxMenuItem checar ;
private CheckboxMenuItem todo ;
private MenuItem indexar ;
public EventosDemoMenu1(MenuItem llamar,MenuItem guardar, MenuItem salir,MenuItem encontrar,
MenuItem reemplazar, MenuItem indexar,CheckboxMenuItem checar,CheckboxMenuItem todo)
{
this.llamar=llamar;
this.guardar=guardar;
this.salir=salir;
this.encontrar=encontrar;
this.reemplazar=reemplazar;
this.checar=checar;
this.todo=todo;
}
public void actionPerformed( ActionEvent evento )
{
String command = evento.getActionCommand() ;
if ( ! command.equals( "salir" ) )
System.out.println( command ) ;
else
System.exit( 0 ) ;
}
public void windowClosing( WindowEvent evento )
{
System.exit( 0 ) ;
}
}
PruebaDemoMenu1.java
public class PruebaDemoMenu1
{
public static void main( String [] args )
{
GuiDemoMenu1 demo = new GuiDemoMenu1( "Demo Menu" ) ;
demo.ejecutar() ;
}
}
Salida:
Elabor: Ing. Jess Pando Barrn(Mocis)
197
5.11 Controlando colores y fuentes
Ejemplo1 Colores
GuiDemoColor.java
import java.awt.* ;
import java.awt.event.* ;
public class GuiDemoColor
{
private Frame f ;
private Button botonIzquierdo ;
private Button botonDerecho;
public final static Color brillante = Color.lightGray ;
public final static Color oscuro = new Color( 160, 160, 160 ) ;
public GuiDemoColor( String titulo )
{
f = new Frame( titulo ) ;
botonIzquierdo = new Button( "Presiona" ) ;
botonDerecho= new Button( "Salir" ) ;
}
public void ejecutar()
{
EventosDemoColor obj = new EventosDemoColor(botonIzquierdo,
botonDerecho);
botonIzquierdo.addMouseListener( obj ) ;
botonDerecho.addMouseListener( obj ) ;
botonIzquierdo.setBackground( oscuro ) ;
botonDerecho.setBackground( oscuro ) ;
f.addWindowListener( new EventosDemoColor()) ;
f.setLayout( new GridLayout( 1, 2 ) ) ;
f.add( botonIzquierdo ) ;
f.add( botonDerecho) ;
f.setSize( 200, 100 ) ;
f.setVisible( true ) ;
}
}
Elabor: Ing. Jess Pando Barrn(Mocis)
198
EventosDemoColor.java
import java.awt.* ;
import java.awt.event.* ;
public class EventosDemoColor extends WindowAdapter implements MouseListener
{
private Button botonIzquierdo;
private Button botonDerecho;
EventosDemoColor()
{
}
EventosDemoColor(Button botonIzquierdo, Button botonDerecho)
{
this.botonIzquierdo=botonIzquierdo;
this.botonDerecho=botonDerecho;
}
public void mousePressed( MouseEvent evento )
{
}
public void mouseExited( MouseEvent evento )
{
Button boton = ( Button ) evento.getSource() ;
boton.setBackground( GuiDemoColor.oscuro) ;
}
public void mouseReleased( MouseEvent evento )
{
}
public void mouseEntered( MouseEvent evento )
{
Button boton = ( Button ) evento.getSource() ;
boton.setBackground( GuiDemoColor.brillante ) ;
boton.requestFocus() ;
}
public void mouseClicked( MouseEvent evento )
{
Button fuente = ( Button ) evento.getSource() ;
if ( fuente.getActionCommand().equals( "Salir" ) )
System.exit( 0 ) ;
}
public void windowClosing( WindowEvent evento )
{
System.exit( 0 ) ;
}
}
PruebaDemoColor.java
public class PruebaDemoColor
{
public static void main( String args [] )
{
GuiDemoColor demo = new GuiDemoColor( "Demo Color" ) ;
demo.ejecutar() ;
}}
Elabor: Ing. Jess Pando Barrn(Mocis)
199
Salida:
Ejemplo 2 Fuentes
GuiDemoFuente.java
import java.awt.* ;
import java.awt.event.* ;
public class GuiDemoFuente
{
private Frame f;
private Panel panel;
private List nombreLista ;
private List tamanoLista ;
private List estiloLista ;
private Label etiqueta ;
public static int fuenteIndex ;
public static int estiloIndex ;
public static int tamanoIndex ;
public final static String [] nombreFuente = {"SansSerif", "Serif", "Monospaced"} ;
public final static String [] estiloFuente = {"Plain", "Bold", "Italic", "BoldItalic"} ;
public final static int [] tamanoFuente = {8, 12, 14, 16, 18, 24, 48, 64} ;
private final static int TAMANO = 4 ;
GuiDemoFuente( String titulo)
{
f= new Frame( titulo) ;
etiqueta = new Label( "Hola", Label.CENTER ) ;
panel= new Panel() ;
nombreLista = new List( TAMANO ) ;
estiloLista = new List( TAMANO ) ;
tamanoLista = new List( TAMANO ) ;
}
public void ejecutar()
{
EventosDemoFuente obj=new
EventosDemoFuente(nombreLista,estiloLista,tamanoLista,etiqueta);
nombreLista.addItemListener( obj ) ;
estiloLista.addItemListener( obj ) ;
tamanoLista.addItemListener( obj ) ;
f.addWindowListener( new EventosDemoFuente() ) ;
for ( int i = 0 ; i < nombreFuente.length ; i++ )
nombreLista.add( nombreFuente[ i ] ) ;
for ( int i = 0 ; i < estiloFuente.length ; i++ )
Elabor: Ing. Jess Pando Barrn(Mocis)
200
estiloLista.add( estiloFuente[ i ] ) ;
for ( int i = 0 ; i < tamanoFuente.length ; i++ )
tamanoLista.add( "" + tamanoFuente[ i ] ) ;
nombreLista.select( fuenteIndex ) ;
estiloLista.select( estiloIndex ) ;
tamanoLista.select( tamanoIndex ) ;
Font fuente = new Font( nombreFuente[ fuenteIndex ],estiloIndex,tamanoFuente[ tamanoIndex ]
) ;
etiqueta.setFont( fuente ) ;
f.setLayout( new GridLayout( 2, 1 ) ) ;
panel.setLayout( new GridLayout( 1, 3 ) ) ;
panel.add( nombreLista ) ;
panel.add( estiloLista ) ;
panel.add( tamanoLista ) ;
f.add( etiqueta ) ;
f.add( panel) ;
f.pack() ;
f.setVisible( true ) ;
}
}
EventosDemoFuente.java
import java.awt.* ;
import java.awt.event.* ;
public class EventosDemoFuente extends WindowAdapter implements ItemListener
{
private List nombreLista;
private List estiloLista;
private List tamanoLista;
private Label etiqueta;
EventosDemoFuente()
{
}
EventosDemoFuente(List nombreLista, List estiloLista, List tamanoLista,Label etiqueta)
{
this.nombreLista=nombreLista;
this.estiloLista=estiloLista;
this.tamanoLista=tamanoLista;
this.etiqueta=etiqueta;
}
public void itemStateChanged( ItemEvent evento)
{
List fuente = ( List ) evento.getItemSelectable() ;
if ( fuente == nombreLista )
GuiDemoFuente.fuenteIndex = fuente.getSelectedIndex() ;
else if ( fuente == estiloLista )
GuiDemoFuente.estiloIndex = fuente.getSelectedIndex() ;
else
GuiDemoFuente.tamanoIndex = fuente.getSelectedIndex() ;
Elabor: Ing. Jess Pando Barrn(Mocis)
201
Font fuente2 = new Font( GuiDemoFuente.nombreFuente[ GuiDemoFuente.fuenteIndex ],
GuiDemoFuente.estiloIndex, GuiDemoFuente.tamanoFuente[ GuiDemoFuente.tamanoIndex ] ) ;
etiqueta.setFont( fuente2 ) ;
}
public void windowClosing( WindowEvent evento)
{
System.exit( 0 ) ;
}
}
PruebaDemoFuente.java
public class PruebaDemoFuente
{
public static void main( String [] args )
{
GuiDemoFuente demo = new GuiDemoFuente( "Demo Fuente" ) ;
demo.ejecutar() ;
}
}
Salida:
Elabor: Ing. Jess Pando Barrn(Mocis)
202
6. Interfaz Grfica de Usuario (GUI). Parte II. Swing
4
Las GUIs se crean a partir de componentes de la GUI (tambin conocidos como controles o widgets
[accesorios de ventana]). Un componente de la GUI es un objeto con el cual interacta el usuario
mediante el ratn, el teclado u otra forma de entrada, como el reconocimiento de voz.
Los componentes de la GUI de Swing del paquete javax.swing estn escritos, se manipulan y
muestran completamente en Java (los denominados componentes puros de Java). Los componentes de
Swing son parte de la JFC (Java Foundation Classes), las bibliotecas de Java para el desarrollo de GUIs
para mltiples plataformas.
Los componentes originales de la GUI del paquete java.awt del AWT (Abstract Windows Toolkit)
estn enlazados directamente con las herramientas de interfaz grfica de usuario de la plataforma local.
Cuando se ejecuta un programa de Java con una GUI del AWT en distintas plataformas Java, los
componentes de la GUI del programa se muestran de manera distinta en cada plataforma. Por ejemplo un
programa que muestra un objeto de tipo Button (paquete java.awt), en una computadora que ejecuta el
sistema operativo Microsoft Windows, el objeto Button tendr la misma apariencia visual que los botones
de otras aplicaciones Windows. De manera similar, en una computadora que ejecuta el sistema operativo
MacOS, de Apple, el objeto Button tendr la misma apariencia visual que los botones de otras
aplicaciones Macintosh. En ocasiones, la forma en que un usuario puede interactuar con un componente
AWT especfico es distinta entre las plataformas.
En conjunto, la apariencia y la manera en que el usuario interacta con el programa se conocen como
la vista y el sentido de ese programa. Los componentes de Swing permiten al programador especificar
una vista y sentido uniformes entre todas las plataformas, o proporcionar una vista y sentido
personalizado para cada plataforma. Un programa puede incluso cambiar la vista y el sentido durante su
ejecucin. Por ejemplo, un programa podra permitir a los usuarios elegir su vista y sentido preferidos.
Los componentes de Swing se implementan en Java, por lo que proporcionan un mayor nivel de
protabilidad y flexibilidad que los componentes originales de la GUI del paquete java.awt.
Los componentes de Swing comnmente seconocen como componentes ligeros; estn escritos
completamente en Java, por lo que no son abrumados por las complejas herramientas de la GUI de la
plataforma en que se utilicen. Sin embargo, a los componentes de AWT (muchos de los cuales se
comparan con los componentes de Swing), que estn enlazados a la plataforma local, se les llama
componentes pesados; stos dependen del sistema de ventanas de la plataforma local para determinar su
funcionalidad y su vista y sentido. Cada componente pesado tiene un igual (del paquete java.awt.peer)
que es responsable de las interacciones entre el componente y la plataforma local que muestra y manipula
a ese componente. Varios componentes de Swing son componentes pesados, como las subclases de
java.awt.Window (por ejemplo, Jframe) que muestran ventanas en la pantalla, y las sublcases de
java.applet.Applet (como JApplet). Estos componentes an requieren de una interaccin directa con el
sistema de ventanas local. Como tal, la apariencia y funcionalidad de un componente pesado de la GUI
de Swing estn restringidas por el sistema de ventanas local.
Superclases comunes de muchos de los componentes de Swing
4
Resumen de los captulos 13,14 del libro de Deitel & Deitel
Elabor: Ing. Jess Pando Barrn(Mocis)
203
Una clase Container administra una coleccin de componentes relacionados. En aplicaciones con
objetos Jframe y en subprogramas, se adjuntan componentes al panel de contenido, que es un objeto de la
clase Container. Esta clase declara los atributos y comportamientos comunes para todas las subclases de
Container. Un mtodo que se origina en la clase Container es add, el cual se utiliza para adjuntar componentes
al panel de contenido (un objeto Container). Otro mtodo que se origina en la clase Container es setLayout, el
cual permite a un programa especificar el administrador de esquemas que ayuda a un Container a posicionar y
ajustar el tamao de sus componentes.
La clase Jcomponent es la superclase de la mayora de los componentes de Swing. Esta clase declara
los atributos y comportamientos comunes de todas las subclases de Jcomponent.
Elabor: Ing. Jess Pando Barrn(Mocis)
Object
Component
Container
JComponent
204
6.1. Campos y etiquetas
Ejemplo 1
GuiDemoEtiqueta.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GuiDemoEtiqueta extends JFrame
{
private JLabel et1, et2, et3;
private Icon imagen;
GuiDemoEtiqueta()
{
super("Prueba de JLabel");
et1=new JLabel("Etiqueta con texto");
imagen=new ImageIcon("imagen.gif");
et2=new JLabel("Etiqueta con texto e icono", imagen,SwingConstants.LEFT);
et3=new JLabel();
}
void visualizar()
{
Container contenedor = getContentPane();
contenedor.setLayout(new FlowLayout());
et1.setToolTipText("Esta es la etiqueta1");
et2.setToolTipText("Esta es la etiqueta2");
et3=new JLabel();
et3.setText("Etiqueta con icono y texto en parte inferior");
et3.setIcon(imagen);
et3.setHorizontalTextPosition(SwingConstants.CENTER);
et3.setVerticalTextPosition(SwingConstants.BOTTOM);
et3.setToolTipText("Esta es la etiqueta3");
contenedor.add(et1);
contenedor.add(et2);
contenedor.add(et3);
setSize(275,250);
setVisible(true);
}
}
PruebaDemoEtiqueta.java
public class PruebaDemoEtiqueta
{
public static void main(String args[])
{
GuiDemoEtiqueta obj = new GuiDemoEtiqueta();
obj.visualizar();
}
}
Elabor: Ing. Jess Pando Barrn(Mocis)
205
Salida:
Ejemplo 2
GuiDemoCampo.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GuiDemoCampo extends JFrame
{
private JTextField campoTexto1, campoTexto2, campoTexto3;
private JPasswordField campoPassword;
GuiDemoCampo()
{
super("Prueba de JTextield y PasswordField");
campoTexto1=new JTextField(10);
campoTexto2=new JTextField("Escriba el texto aqui");
campoTexto3=new JTextField("Campo de texto no editable",20);
campoPassword=new JPasswordField("Texto oculto");
}
void ejecutar()
{
Container contenedor = getContentPane();
contenedor.setLayout(new FlowLayout());
campoTexto3.setEditable(false);
EventosDemoCampo obj=new
EventosDemoCampo(campoTexto1,campoTexto2,campoTexto3,campoPassword);
campoTexto1.addActionListener(obj);
campoTexto2.addActionListener(obj);
campoTexto3.addActionListener(obj);
campoPassword.addActionListener(obj);
contenedor.add(campoTexto1);
contenedor.add(campoTexto2);
contenedor.add(campoTexto3);
contenedor.add(campoPassword);
setSize(275,250);
setVisible(true);
}}
Elabor: Ing. Jess Pando Barrn(Mocis)
206
EventosDemoCampo.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class EventosDemoCampo implements ActionListener
{
private JTextField campoTexto1, campoTexto2, campoTexto3;
private JPasswordField campoPassword;
EventosDemoCampo(JTextField campoTexto1,JTextField campoTexto2,JTextField
campoTexto3,JPasswordField campoPassword)
{
this.campoTexto1=campoTexto1;
this.campoTexto2=campoTexto2;
this.campoTexto3=campoTexto3;
this.campoPassword=campoPassword;
}
public void actionPerformed(ActionEvent evento)
{
String cadena="";
if(evento.getSource()==campoTexto1)
cadena="campoTexto1: " +evento.getActionCommand();
else if(evento.getSource()==campoTexto2)
cadena="campoTexto2: " +evento.getActionCommand();
else if(evento.getSource()==campoTexto3)
cadena="campoTexto3: " +evento.getActionCommand();
else if(evento.getSource()==campoPassword)
{
cadena="campoPassword: " +new String (campoPassword.getPassword());
}
JOptionPane.showMessageDialog(null,cadena);
}
}
PruebaDemoCampo.java
import javax.swing.*;
public class PruebaDemoCampo
{
public static void main(String args[])
{
GuiDemoCampo obj = new GuiDemoCampo();
obj.ejecutar();
obj.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
Elabor: Ing. Jess Pando Barrn(Mocis)
207
Salida:
6.2. Botones
GuiDemoBoton.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GuiDemoBoton extends JFrame
{
private JButton botonSimple, botonElegante;
private Icon imagen1;
private Icon imagen2;
GuiDemoBoton()
{
super("Prueba de botones");
imagen1 = new ImageIcon("imagen1.gif");
imagen2=new ImageIcon("imagen2.gif");
botonSimple=new JButton("Boton Simple");
botonElegante=new JButton("Boton Elegante",imagen1);
}
void ejecutar()
{
Container contenedor = getContentPane();
contenedor.setLayout(new FlowLayout());
EventosDemoBoton obj=new EventosDemoBoton(botonSimple, botonElegante);
botonSimple.addActionListener(obj);
botonElegante.addActionListener(obj);
contenedor.add(botonSimple);
botonElegante.setRolloverIcon(imagen2);
contenedor.add(botonElegante);
setSize(275,250);
setVisible(true);
}
}
Elabor: Ing. Jess Pando Barrn(Mocis)
208
EventosDemoBoton.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class EventosDemoBoton implements ActionListener
{
private JButton botonSimple, botonElegante;
EventosDemoBoton(JButton botonSimple, JButton botonElegante)
{
this.botonSimple=botonSimple;
this.botonElegante=botonElegante;
}
public void actionPerformed(ActionEvent evento)
{
JOptionPane.showMessageDialog(null,"Se oprimio: "+evento.getActionCommand());
}
}
PruebaDemoBoton.java
import javax.swing.*;
public class PruebaDemoBoton
{
public static void main(String args[])
{
GuiDemoBoton obj = new GuiDemoBoton();
obj.ejecutar();
obj.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
Salida:
Elabor: Ing. Jess Pando Barrn(Mocis)
209
6.3. CheckBox y RadioButton
Ejemplo1
GuiDemoCasillaVerificacion.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GuiDemoCasillaVerificacion extends JFrame
{
private JTextField campo;
private JCheckBox negrita,cursiva;
GuiDemoCasillaVerificacion()
{
super("Prueba de Checkbox");
campo=new JTextField("Observe el cambio en el estilo de tipo de letra",25);
campo.setFont(new Font("Serif",Font.PLAIN,14));
negrita=new JCheckBox("Negrita");
cursiva=new JCheckBox("Cursiva");
}
void ejecutar()
{
Container contenedor = getContentPane();
contenedor.setLayout(new FlowLayout());
EventosDemoCasillaVerificacion obj=new EventosDemoCasillaVerificacion(negrita,
cursiva,campo);
negrita.addItemListener(obj);
cursiva.addItemListener(obj);
contenedor.add(campo);
contenedor.add(negrita);
contenedor.add(cursiva);
setSize(275,250);
setVisible(true);
}
}
EventosDemoCasillaVerificacion.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class EventosDemoCasillaVerificacion implements ItemListener
{
private int valNegrita=Font.PLAIN;
private int valCursiva=Font.PLAIN;
Elabor: Ing. Jess Pando Barrn(Mocis)
210
private JTextField campo;
private JCheckBox negrita,cursiva;
EventosDemoCasillaVerificacion(JCheckBox negrita,JCheckBox cursiva,JTextField campo)
{
this.negrita=negrita;
this.cursiva=cursiva;
this.campo=campo;
}
public void itemStateChanged(ItemEvent evento)
{
if(evento.getSource()==negrita)
valNegrita=negrita.isSelected() ? Font.BOLD : Font.PLAIN;
if(evento.getSource()==cursiva)
valCursiva=cursiva.isSelected() ? Font.ITALIC : Font.PLAIN;
campo.setFont(new Font("Serif",valNegrita+valCursiva,14));
}
}
PruebaDemoCasillaVerificacion.java
import javax.swing.*;
public class PruebaDemoCasillaVerificacion
{
public static void main(String args[])
{
GuiDemoCasillaVerificacion obj = new GuiDemoCasillaVerificacion();
obj.ejecutar();
obj.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
Salida:
Elabor: Ing. Jess Pando Barrn(Mocis)
211
Ejemplo 2
DemoBotonOpcion.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DemoBotonOpcion extends JFrame
{
private JTextField campo;
private Font tipoLetraSimple, tipoLetraNegrita, tipoLetraCursiva, tipoLetraNegritaCursiva;
private JRadioButton botonSimple, botonNegrita, botonCursiva, botonNegritaCursiva;
private ButtonGroup grupoBotonesOpcion;

public DemoBotonOpcion()
{
super( "Prueba de RadioButton" );
Container contenedor = getContentPane();
contenedor.setLayout( new FlowLayout() );
campo = new JTextField( "Observe cmo cambia el estilo del tipo de letra", 30 );
botonSimple = new JRadioButton( "Simple", true );
botonNegrita = new JRadioButton( "Negrita", false );
botonCursiva = new JRadioButton( "Cursiva", false );
botonNegritaCursiva = new JRadioButton( "Negrita/Cursiva", false );

contenedor.add( campo );
contenedor.add( botonSimple );
contenedor.add( botonNegrita );
contenedor.add( botonCursiva );
contenedor.add( botonNegritaCursiva );
grupoBotonesOpcion = new ButtonGroup();
grupoBotonesOpcion.add( botonSimple );
grupoBotonesOpcion.add( botonNegrita );
grupoBotonesOpcion.add( botonCursiva );
grupoBotonesOpcion.add( botonNegritaCursiva );

tipoLetraSimple = new Font( "Serif", Font.PLAIN, 14 );
tipoLetraNegrita = new Font( "Serif", Font.BOLD, 14 );
tipoLetraCursiva = new Font( "Serif", Font.ITALIC, 14 );
tipoLetraNegritaCursiva = new Font( "Serif", Font.BOLD + Font.ITALIC, 14 );
campo.setFont( tipoLetraSimple ); // establecer tipo de letra inicial


botonSimple.addItemListener( new ManejadorBotonOpcion( tipoLetraSimple ) );
botonNegrita.addItemListener( new ManejadorBotonOpcion( tipoLetraNegrita ) );
botonCursiva.addItemListener( new ManejadorBotonOpcion( tipoLetraCursiva ) );
botonNegritaCursiva.addItemListener(new ManejadorBotonOpcion( tipoLetraNegritaCursiva ) );
setSize( 350, 100 );
Elabor: Ing. Jess Pando Barrn(Mocis)
212
setVisible( true );
}
// clase interna privada para manejar eventos de botn de opcin
private class ManejadorBotonOpcion implements ItemListener
{
private Font tipoDeLetra;
public ManejadorBotonOpcion( Font f )
{
tipoDeLetra = f;
}

public void itemStateChanged( ItemEvent evento )
{
campo.setFont( tipoDeLetra );
}
}
}
PruebaBotonOpcion.java
import javax.swing.*;
class PruebaBotonOpcion
{
public static void main( String args[] )
{
DemoBotonOpcion aplicacion = new DemoBotonOpcion();
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
}
Salida:
Elabor: Ing. Jess Pando Barrn(Mocis)
213
6.4. JComboBox implementado con una clase interna annima
DemoCuadroComb.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DemoCuadroComb extends JFrame
{
private JComboBox cuadroCombImagenes;
private JLabel etiqueta;
private String nombres[] = { "Imagen1.gif", "Imagen2.gif", "Imagen3.gif", "Imagen4.gif" };
private Icon iconos[] = { new ImageIcon( nombres[ 0 ] ),new ImageIcon( nombres[ 1 ] ), new ImageIcon(
nombres[ 2 ] ),new ImageIcon( nombres[ 3 ] ) };
public DemoCuadroComb()
{
super( "Prueba de JComboBox" );

// obtener panel de contenido y establecer su esquema
Container contenedor = getContentPane();
contenedor.setLayout( new FlowLayout() );
// establecer objeto JComboBox y registrar su manejador de eventos con una clase interna annima
cuadroCombImagenes = new JComboBox( nombres );
cuadroCombImagenes.setMaximumRowCount( 3 );
cuadroCombImagenes.addItemListener(new ItemListener()
{
public void itemStateChanged( ItemEvent evento )
{
// determinar si la casilla de verificacin est
seleccionada
if ( evento.getStateChange() ==
ItemEvent.SELECTED )

etiqueta.setIcon( iconos[cuadroCombImagenes.getSelectedIndex() ] );
}
} // fin de la clase interna annima
); // fin de la llamada a addItemListener
contenedor.add( cuadroCombImagenes );
// establecer objeto JLabel para mostrar objetos ImageIcon
etiqueta = new JLabel( iconos[ 0 ] );
contenedor.add( etiqueta );
Elabor: Ing. Jess Pando Barrn(Mocis)
214
setSize( 350, 150 );
setVisible( true );
}
}
PruebaCuadroComb.java
import javax.swing.*;
class PruebaCuadroComb
{
public static void main( String args[] )
{
DemoCuadroComb aplicacion = new DemoCuadroComb();
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
}
Salida:
Elabor: Ing. Jess Pando Barrn(Mocis)
215
6.5. Jlist
Ejemplo 1
DemoList.java
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
public class DemoList extends JFrame
{
private JList listaColores;
private Container contenedor;

private final String nombresColores[] = { "Negro", "Azul", "Cyan", "Gris oscuro", "Gris", "Verde", "Gris
claro",
"Magenta", "Naranja", "Rosa", "Rojo", "Blanco",
"Amarillo" };
private final Color colores[] = { Color.BLACK, Color.BLUE, Color.CYAN, Color.DARK_GRAY,
Color.GRAY, Color.GREEN, Color.LIGHT_GRAY,
Color.MAGENTA, Color.ORANGE, Color.PINK, Color.RED,
Color.WHITE,Color.YELLOW };

public DemoList()
{
super( "Prueba de JList" );
contenedor = getContentPane();
contenedor.setLayout( new FlowLayout() );
// crear una lista con elementos del arreglo nombresColores
listaColores = new JList( nombresColores );
listaColores.setVisibleRowCount( 5 );

// no permitir selecciones mltiples
listaColores.setSelectionMode( ListSelectionModel.SINGLE_SELECTION );
//contenedor.add(listaColores); esto genera la salida 1 sin el JScrollPane
// esto genera la salida 2
//agregar un objeto JScrollPane, que contiene a JList, al panel de contenido
contenedor.add( new JScrollPane( listaColores ) );
listaColores.addListSelectionListener(new ListSelectionListener()
{
public void valueChanged( ListSelectionEvent evento )
{

contenedor.setBackground(colores[ listaColores.getSelectedIndex() ] );
Elabor: Ing. Jess Pando Barrn(Mocis)
216
}
} // fin de la clase interna annima
); // fin de la llamada a addListSelectionListener
setSize( 350, 350 );
setVisible( true );
}
}
PruebaList.java
import javax.swing.*;
class PruebaList
{
public static void main( String args[] )
{
DemoList aplicacion = new DemoList();
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
}
Salida 1 sin agregar el JScrollPane
Salida 2 agregando el JScrollPane
Elabor: Ing. Jess Pando Barrn(Mocis)
217
Ejemplo 2
DemoSeleccionMultiple.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DemoSeleccionMultiple extends JFrame
{
private JList listaColores, listaCopia;
private JButton botonCopiar;
private final String nombresColores[] = { "Negro", "Azul", "Cyan", "Gris oscuro", "Gris", "Verde", "Gris
claro", "Magenta", "Naranja",
"Rosa", "Rojo", "Blanco", "Amarillo" };
public DemoSeleccionMultiple()
{
super( "Listas de seleccin mltiple" );
Container contenedor = getContentPane();
contenedor.setLayout( new FlowLayout() );
// establecer objeto JList listaColores
listaColores = new JList( nombresColores );
listaColores.setVisibleRowCount( 5 );
listaColores.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION );
contenedor.add( new JScrollPane( listaColores ) );
botonCopiar = new JButton( "Copiar >>>" );
contenedor.add( botonCopiar );
// establecer objeto JList listaCopia
listaCopia = new JList( );
listaCopia.setVisibleRowCount( 5 );
listaCopia.setFixedCellWidth( 100 );
listaCopia.setFixedCellHeight( 15 );
listaCopia.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION );
contenedor.add( new JScrollPane( listaCopia ) );
botonCopiar.addActionListener(new ActionListener()
{
public void actionPerformed( ActionEvent evento )
{
// colocar valores seleccionados en listaCopia

listaCopia.setListData( listaColores.getSelectedValues() );
}
} // fin de clase interna annima
); // fin de la llamada a addActionListener
Elabor: Ing. Jess Pando Barrn(Mocis)
218
setSize( 325, 130 );
setVisible( true );
}
}
PruebaSeleccionMultiple.java
import javax.swing.*;
class PruebaSeleccionMultiple
{
public static void main( String args[] )
{
DemoSeleccionMultiple aplicacion = new DemoSeleccionMultiple();
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
}
Salida:
Comentarios:
El mtodo setSelectionMode de JList esepcifica el modo de seleccin de la lista. La clase
ListSelectionModel (del paquete javax.swing) declara tres constantes que especifican el modo de
seleccin de un objeto JList:
o SINGLE_SELECTION permite seleccionar solamente un
elemento en un momento dado.
o SINGLE_SELECTION es para una lista de seleccin mltiple y
permite la seleccin de varios elementos contiguos
o MULTIPLE_INTERVAL_SELECTION es para una lista de
seleccin mltiple que no restringe el nmero de elementos que
pueden seleccionarse.
Elabor: Ing. Jess Pando Barrn(Mocis)
219
6.6. Eventos del Mouse
Ejemplo 1
EventoMouse.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class EventosMouse extends JFrame implements MouseListener, MouseMotionListener
{
private JLabel barraEstado;
// configurar GUI y registrar manejadores de eventos de Mouse
public EventosMouse()
{
super( "Demostracin de los eventos de Mouse" );
barraEstado = new JLabel();
getContentPane().add( barraEstado, BorderLayout.SOUTH );

addMouseListener( this ); // escucha sus propios eventos de Mouse
addMouseMotionListener( this ); // y de movimiento de Mouse
setSize( 300, 125 );
setVisible( true );
}
// Manejadores de eventos de MouseListener
// manejar el evento cuando el botn del Mouse se suelta inmediatamente despus de oprimir
public void mouseClicked( MouseEvent evento )
{
barraEstado.setText( "Se hizo clic en [" + evento.getX() + ", " + evento.getY() + "]" );
}
// manejar evento cuando se oprime el botn del Mouse
public void mousePressed( MouseEvent evento )
{
barraEstado.setText( "Se oprimi en [" + evento.getX() + ", " + evento.getY() + "]" );
}
// manejar evento cuando se suelta el Mouse despus de arrastrar
public void mouseReleased( MouseEvent evento )
{
barraEstado.setText( "Se solt en [" + evento.getX() + ", " + evento.getY() + "]" );
}
Elabor: Ing. Jess Pando Barrn(Mocis)
220
// manejar el evento cuando el Mouse entra al rea
public void mouseEntered( MouseEvent evento )
{
barraEstado.setText( "Mouse entro en [" + evento.getX() + ", " + evento.getY() + "]" );
getContentPane().setBackground( Color.GREEN );
}
// manejar evento cuando el Mouse sale del rea
public void mouseExited( MouseEvent evento )
{
barraEstado.setText( "Mouse fuera de la ventana" );
getContentPane().setBackground( Color.WHITE );
}
// Manejadores de eventos de MouseMotionListener
// manejar el evento cuando el usuario arrastra el Mouse con el botn oprimido
public void mouseDragged( MouseEvent evento )
{
barraEstado.setText( "Se arrastr en [" + evento.getX() + ", " + evento.getY() + "]" );
}
// manejar el evento cuando el usuario mueve el Mouse
public void mouseMoved( MouseEvent evento )
{
barraEstado.setText( "Se movi en [" + evento.getX() + ", " + evento.getY() + "]" );
}
}
PruebaEventosMouse.java
import javax.swing.*;
class PruebaEventosMouse
{
public static void main( String args[] )
{
EventosMouse aplicacion = new EventosMouse();
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
}
Salida:
Ejemplo 2. Uso de una clase adaptadora
DemoPintor.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
Elabor: Ing. Jess Pando Barrn(Mocis)
221
public class DemoPintor extends JFrame
{
private int cuentaPuntos = 0;
// arreglo de 1000 referencias a java.awt.Point
private Point puntos[] = new Point[ 1000 ];
// configurar GUI y registrar manejador de eventos de ratn
public DemoPintor()
{
super( "Un programa simple de dibujo" );
// crear una etiqueta y colocarla en la parte SOUTH del esquema BorderLayout
getContentPane().add( new JLabel( "Arrastre el ratn para dibujar" ),BorderLayout.SOUTH );
addMouseMotionListener(new MouseMotionAdapter()
{
// almacenar coordenadas de arrastre y llamar a repaint
public void mouseDragged( MouseEvent evento )
{
if ( cuentaPuntos < puntos.length )
{
puntos[ cuentaPuntos ] = evento.getPoint();
++cuentaPuntos;
repaint();
}
}

} // fin de la clase interna annima
); // fin de la llamada a addMouseMotionListener
setSize( 300, 150 );
setVisible( true );
} // fin del constructor de DemoPintor
// dibujar valo en un cuadro delimitador de 4 por 4 en ubicacin especificada en ventana
public void paint( Graphics g )
{
super.paint( g ); // borra el rea de dibujo
for ( int i = 0; i < puntos.length && puntos[ i ] != null; i++ )
g.fillOval( puntos[ i ].x, puntos[ i ].y, 4, 4 );
}
} // fin de la clase DemoPintor
PruebaPintor.java
import javax.swing.*;
class PruebaPintor
{
public static void main( String args[] )
Elabor: Ing. Jess Pando Barrn(Mocis)
222
{
DemoPintor aplicacion = new DemoPintor();
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
}
Salida:
Comentarios
Clases adaptadoras de eventos y las interfaces que implementan en el paquete java.awt.event
Clase adaptadora de eventos Implementa a la interfaz
ComponentAdapter ComponentListener
ContainerAdapter ContainerListener
FocusAdapter FocusListener
KeyAdapter KeyListener
MouseAdapter MouseListener
MouseMotionAdapter MouseMotionListener
WindowAdapter WindowListener
El programador puede extender la clase adaptadora para heredar la implementacin predeterminada de cada
mtodo y, por ende, sobrescribir el (los) mtodo(s) necesario(s) para el manejo de eventos. La
implementacin de cada mtodo en la clase adaptadora tiene un cuerpo vaco.
En este ejemplo se utiliza un arreglo de 1000 objetos java.awt.Point para almacenar la ubicacin en
la que ocurre cada evento del arrastre del Mouse. Esto permite al mtodo Saint dibujar un pequeo
valo en cada ubicacin almacenada en el arreglo.
Cuando se invoca un mtodo utilizando slo su nombre, en realidad se invoca mediante la referencia
this, indicando que ese mtodo es llamado para la instancia actual de la clase en tiempo de ejecucin.
La lnea:
if ( cuentaPuntos < puntos.length )
se asegura que se almacenen lascoordenadas del evento solamente si hay elementos vacos en el arreglo de ser
as la lnea:
puntos[ cuentaPuntos ] = evento.getPoint();
invoca al mtodo getPoint() del objeto MouseEvent para obtener el objeto Point en donde ocurri el evento y
lo guarda en el arreglo, en el ndice cuentaPuntos.
En la lnea:
++cuentaPuntos;
Se incrementa la cuentaPuntos y despus se hace una llamada a repaint para empezar a dibujar.
Elabor: Ing. Jess Pando Barrn(Mocis)
223
Se observa que paint itera a travs de todos los objetos Point en el arreglo y dibuja un valo en cada
ubicacin. La clase Point tiene dos variables de instancia pblicas (x y y) que se utilizan directamente en la
lnea:
g.fillOval( puntos[ i ].x, puntos[ i ].y, 4, 4 );
para especificar la esquina superior izquierda del cuadro delimitador del valo. El ciclo termina, ya sea
cuando se encuentra una referencia null en el arreglo o cuando se llega al final del mismo.
Ejemplo 3. Demostracin de los clics del mouse y de cmo se diferencian los botones del mouse
DetallesMouse.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DetallesMouse extends JFrame
{
private int xPos, yPos;
// establecer cadena barra ttulo; registrar escucha ratn; ajustar tamao y mostrar ventana
public DetallesMouse()
{
super( "Clics y botones del ratn" );
addMouseListener( new ManejadorClicsRaton() );
setSize( 350, 150 );
setVisible( true );
}
// dibujar objeto String en la ubicacin donde se hizo clic con el ratn
public void paint( Graphics g )
{
// llamar al mtodo paint de la superclase
super.paint( g );
g.drawString( "Se hizo clic en: [" + xPos + ", " + yPos + "]", xPos, yPos );
}

// clase interna para manejar eventos de ratn
private class ManejadorClicsRaton extends MouseAdapter
{
// manejar evento de clic del ratn y determinar cul botn se oprimi
public void mouseClicked( MouseEvent evento )
{
xPos = evento.getX();
yPos = evento.getY();
String titulo = "Se hizo clic " + evento.getClickCount() + " Veces";
Elabor: Ing. Jess Pando Barrn(Mocis)
224

if ( evento.isMetaDown() ) // botn derecho del ratn
titulo += " con el botn derecho del ratn";

else if ( evento.isAltDown() ) // botn de en medio del ratn
titulo += " con el botn central del ratn";

else // botn izquierdo del ratn
titulo += " con el botn izquierdo del ratn";
setTitle( titulo ); // establecer barra de ttulo de la ventana
repaint();
} // fin del mtodo mouseClicked
} // fin de la clase interna privada ManejadorClicsRaton
} // fin de la clase DetallesMouse
PruebaDetallesMouse.java
import javax.swing.*;
class PruebaDetallesMouse
{
public static void main( String args[] )
{
DetallesMouse aplicacion = new DetallesMouse();
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
}
Salida:
Comentarios:
La clase MouseEvent hereda varios mtodos de la clase InputEvent, los cuales pueden diferenciar
entre los botones del mouse. Tal como lo describe la siguiente tabla:
Mtodo de InputEvent Descripcin
isMetaDown() Devuelve true cuando el usuario hace clic con el botn derecho del mouse, en un
mouse con dos o tres botones. Para simular un clic con el botn derecho en un
mouse con un botn, el usuario puede mantener presionada la tecla Meta y hacer
clic en el botn del mouse.
isAltDown() Devuelve true cuando el usuario hace clic con el botn de en medio del mouse, en
un mouse con dos o tres botones. Para simular un clic con el botn de en medio en
un mouse con un botn, el usuario puede mantener presionada la tecla Alt y hacer
Elabor: Ing. Jess Pando Barrn(Mocis)
225
clic en el botn del mouse, o el botn izquierdo del mouse, respectivamente.
6.7. Manejo de eventos de teclas
DemoTeclas.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DemoTeclas extends JFrame implements KeyListener
{
private String linea1 = "", linea2 = "", linea3 = "";
private JTextArea areaTexto;
// configurar GUI
public DemoTeclas()
{
super( "Demostracin de eventos de pulsacin de tecla" );
// establecer objeto JTextArea
areaTexto = new JTextArea( 10, 15 );
areaTexto.setText( "Oprima cualquier tecla en el teclado..." );
areaTexto.setEnabled( false );
areaTexto.setDisabledTextColor( Color.BLACK );
getContentPane().add( areaTexto );
addKeyListener( this ); // permitir al marco procesar eventos de teclas

setSize( 350, 100 );
setVisible( true );
} // fin del constructor de DemoTeclas
// manejar evento de pulsacin de cualquier tecla
public void keyPressed( KeyEvent evento )
{
linea1 = "Se oprimi tecla: " + evento.getKeyText( evento.getKeyCode() );
establecerLineas2y3( evento );
}
// manejar evento de liberacin de cualquier tecla
public void keyReleased( KeyEvent evento )
{
linea1 = "Se solt tecla: " + evento.getKeyText( evento.getKeyCode() );
Elabor: Ing. Jess Pando Barrn(Mocis)
226
establecerLineas2y3( evento );
}
// manejar evento de pulsacin de una tecla de accin
public void keyTyped( KeyEvent evento )
{
linea1 = "Se escribi tecla: " + evento.getKeyChar();
establecerLineas2y3( evento );
}
// establecer segunda y tercera lneas de salida
private void establecerLineas2y3( KeyEvent evento )
{
linea2 = "Esta tecla " + ( evento.isActionKey() ? "" : "no " ) +
"es una tecla de accin";
String temp = evento.getKeyModifiersText( evento.getModifiers() );
linea3 = "Teclas modificadoras oprimidas: " +
( temp.equals( "" ) ? "ninguna" : temp );
areaTexto.setText( linea1 + "\n" + linea2 + "\n" + linea3 + "\n" );
}

} // fin de la clase DemoTeclas
PruebaDemoTeclas.java
import javax.swing.*;
class PruebaDemoTeclas
{
public static void main( String args[] )
{
DemoTeclas aplicacion = new DemoTeclas();
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
}
Salida:
Comentarios:
Una clase que implementa a KeyListener debe proporcionar declaraciones para los mtodos
keyPressed, keyReleased y keyTyped, cada uno de los cuales recibe un objeto KeyEvent como
argumento.
La clase KeyEvent es una subclase de InputEvent.
El mtodo keyPressed es llamado en respuesta a la accin de oprimir cualquier tecla.
Elabor: Ing. Jess Pando Barrn(Mocis)
227
El mtodo keyTyped es llamado en respuesta a la accin de oprimir una tecla que no sea una tecla de
accin. (las teclas de accin son cualquier tecla de direccin: Inicio, Fin, Re Pg, Av Pg, cualquier
tecla de funcin: loq Num, Impr Pant, loq Despl, Bloq Mays y Pausa).
El mtodo keyReleased es llamado cuando la tecla se suelta despes de un evento keyPressed o
keyTyped.
Los mtodos keyPressed y keyReleased utilizan el mtodo getKeyCode de KeyEvent para obtener el
cdigo de tecla virtual de la tecla oprimida.
La clase Keyvent mantiene un conjunto de constantes (las constantes de cdigo de tecla virtual) que
representan a todas las teclas en el teclado. Estas constantes pueden compararse con el valor de
retorno de getKeyCode para probar teclas individuales del teclado. El valor devuelto por
getKeyCode se pasa al mtodo getKeyText de KeyEvent, el cual devuelve una cadena que contiene
el nombre de la tecla que se oprimi.
El mtodo isActionKey de KeyEvent determina si la tecla en el evento fue una tecla de accin.
Adems hace una llamada al mtodo getModifiers de InputEvent para determinar si se oprimi
alguna tecla modificadora como Mays, Alt y Ctrl, cuando ocurri el evento de tecla. El resultado de
este mtodo se pasa al mtodo getKeyModifiersText de KeyEvent, el cual produce una cadena que
contiene los nombres de las teclas que se oprimieron.
6.8. JTextArea
DemoAreaTexto.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DemoAreaTexto extends JFrame
{
private JTextArea areaTexto1, areaTexto2;
private JButton botonCopiar;
// configurar GUI
public DemoAreaTexto()
{
super( "Demostracin de JTextArea" );
Box cuadro = Box.createHorizontalBox();
String cadena = "sta es una cadena de\ndemostracin para\n ilustrar cmo copiar texto\nde un rea de
texto a \n" +
"otra, utilizando un\nevento externo\n";
// establecer areaTexto1
areaTexto1 = new JTextArea( cadena, 10, 15 );
cuadro.add( new JScrollPane( areaTexto1 ) );
// establecer botonCopiar
botonCopiar = new JButton( "Copiar >>>" );
cuadro.add( botonCopiar );
botonCopiar.addActionListener(new ActionListener()
{
// establecer en areaTexto2 el texto seleccionado de areaTexto1
public void actionPerformed( ActionEvent evento )
{
Elabor: Ing. Jess Pando Barrn(Mocis)
228
areaTexto2.setText( areaTexto1.getSelectedText() );
}
} // fin de la clase interna annima

); // fin de la llamada a addActionListener
// establecer areaTexto2
areaTexto2 = new JTextArea( 10, 15 );
areaTexto2.setEditable( false );
cuadro.add( new JScrollPane( areaTexto2 ) );
// agregar cuadro al panel de contenido
Container contenedor = getContentPane();
contenedor.add( cuadro ); // colocar en in BorderLayout.CENTER
setSize( 425, 200 );
setVisible( true );
} // fin del constructor de DemoAreaTexto
} // fin de la clase DemoAreaTexto
PruebaDemoAreaTexto.java
import javax.swing.*;
class PruebaDemoAreaTexto
{
public static void main( String args[] )
{
DemoAreaTexto aplicacion = new DemoAreaTexto();
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
}
Salida:
Comentarios:
La clase Box es una subclase de Container que utiliza un administrador de esquemas BoxLayout para
ordenar los componentes de la GUI, ya sea en forma horizontal o vertical. La clase Box proporciona
el mtodo esttico createHorizontalBox para crear un objeto Box que acomode los componentes de
izquierda a derecha en que stos se adjunten.
De manera predeterminada JScrollPane muestra barras de desplazamiento solamente si se requieren.
Se puede establecer las polticas de barra de desplazamiento horizontal y vertical para el objeto
JscrollPane al momento de su creacin. Si un programa tiene una referencia a un objeto JscrollPane,
el programa puede utilizar los mtodos setHorizontalScrollBarPolicy y setVerticalScrollBarPolicy de
JscrollPane para cambiar las polticas de barra de desplazamiento en cualquier momento. La clase
JscrollPane declara las constantes:
Elabor: Ing. Jess Pando Barrn(Mocis)
229
JscrollPane.VERTICAL_SCROLLBAR_ALWAYS
JscrollPane.HORIZONTALL_SCROLLBAR_ALWAYS. Para indicar que siempre debe
aparecer la barra de desplazamiento.
Las constantes:
JscrollPane.VERTICAL_SCROLLBAR_AS_NEEDED
JscrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED. Indican que debe
aparecer la barra de desplazamiento slo si es necesario (los valores predeterminados).
Las constantes:
JscrollPane.VERTICAL_SCROLLBAR_NEVER
JscrollPane.HORIZONTAL_SCROLLBAR_NEVER. Indican que nunca debe
aparecer una barra de desplazamiento.
6.9. Panel personalizado
PanelPersonalizado.java
import java.awt.*;
import javax.swing.*;
public class PanelPersonalizado extends JPanel
{
public final static int CIRCULO = 1, CUADRADO = 2;
private int figura;
// usar figura para dibujar un valo o rectngulo
public void paintComponent( Graphics g )
{
super.paintComponent( g );
if ( figura == CIRCULO )
g.fillOval( 50, 10, 60, 60 );
else if ( figura == CUADRADO )
g.fillRect( 50, 10, 60, 60 );
}
// establecer valor de figura y repintar PanelPersonalizado
public void dibujar( int figuraADibujar )
{
figura = figuraADibujar;
repaint();
}
} // fin de la clase PanelPersonalizado
PruebaPanelPersonalizado.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class PruebaPanelPersonalizado extends JFrame
Elabor: Ing. Jess Pando Barrn(Mocis)
230
{
private JPanel panelBotones;
private PanelPersonalizado miPanel;
private JButton botonCirculo, botonCuadrado;
// configurar GUI
public PruebaPanelPersonalizado()
{
super( "Prueba de PanelPersonalizado" );
// crear rea personalizada de dibujo
miPanel = new PanelPersonalizado();
miPanel.setBackground( Color.GREEN );
// establecer botonCuadrado
botonCuadrado = new JButton( "Cuadrado" );
botonCuadrado.addActionListener(new ActionListener()
{
// dibujar un cuadrado
public void actionPerformed( ActionEvent evento )
{

miPanel.dibujar( PanelPersonalizado.CUADRADO );
}
} // fin de la clase interna annima
); // fin de la llamada a addActionListener
botonCirculo = new JButton( "Crculo" );
botonCirculo.addActionListener(new ActionListener()
{
// dibujar un crculo
public void actionPerformed( ActionEvent evento )
{
miPanel.dibujar( PanelPersonalizado.CIRCULO );
}
} // fin de la clase interna annima
); // fin de la llamada a addActionListener
// establecer panel con botones
panelBotones = new JPanel();
panelBotones.setLayout( new GridLayout( 1, 2 ) );
panelBotones.add( botonCirculo );
panelBotones.add( botonCuadrado );
// adjuntar panel de botones y rea personalizada de dibujo al panel de contenido
Container contenedor = getContentPane();
contenedor.add( miPanel, BorderLayout.CENTER );
contenedor.add( panelBotones, BorderLayout.SOUTH );
setSize( 300, 150 );
setVisible( true );
} // fin del constructor PruebaPanelPersonalizado
Elabor: Ing. Jess Pando Barrn(Mocis)
231
public static void main( String args[] )
{
PruebaPanelPersonalizado aplicacion = new PruebaPanelPersonalizado();
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
} // fin de la clase PruebaPanelPersonalizado
Salida:
6.10. Mens
La clase JMenuBar (una subclase de JComponent) contiene los mtodos necesarios para dministrar
una barra de mens, la cual es un contenedor para los mens. La clase JMenu (una subclase de
javax.swing.JMenuItem) contiene los mtodos necesarios para administrar mens. Los mens
contienen elementos de men y pueden agregarsea barras de mens o a otros mens, como
submens. Cuando se hace clic en un men, ste se expande para mostrar su lista de elementos de
men.
La clase JMenuItem (una subclase de javax.swing.AbstractButton) contiene los mtodos necesarios
para administrar elementos de men. Un elemento de men es un componente de la GUI que est
dentro de un men y que, cuando se selecciona, produce un evento de accin. Un elemento de men
puede usarse para iniciar una accin, o puede ser un submen que proporcione ms elementos de
men que el usuario pueda seleccionar.
La clase JCheckBoxItem (una subclase de javax.swing.JMenuItem), contiene los mtodos necesarios
para administrar los elementos de men que pueden activarse o desactivarse. Cuando se selecciona
un objeto JCheckBoxItem, aparece una marca de verificacin a la izquierda del elemento de men.
Cuando se selecciona de nuevo el mismo objeto, se quita la marca de verificacin a la izquierda del
elemento de men.
La clase JRadioButtonMenuItem (una subclase de javax.swing.JMenuItem) contiene los mtodos
necesarios para administrar elementos de men que pueden activarse o desactivarse, de manera
parecida a los objetos JCheckBoxItem. Cuando se mantienen varios objetos JRadioButtonMenuItem
como parte de un objeto ButtonGroup, slo puede seleccionarse un elemento en el grupo a la vez.
Cuando se selecciona otro objeto se quita el crculo relleno a la izquierda del elemento de men
previamente seleccionado.
PruebaMenu.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class PruebaMenu extends JFrame
{
private final Color valoresColor[] = { Color.black, Color.blue, Color.red, Color.green };
private JRadioButtonMenuItem elementosColor[], tiposLetra[];
private JCheckBoxMenuItem elementosEstilo[];
private JLabel pantallaEtiqueta;
private ButtonGroup grupoTiposLetra, grupoColores;
private int estilo;
Elabor: Ing. Jess Pando Barrn(Mocis)
232
// configurar GUI
public PruebaMenu()
{
super( "Uso de objetos JMenu" );
// establecer men Archivo y sus elementos de men
JMenu menuArchivo = new JMenu( "Archivo" );
menuArchivo.setMnemonic( 'A' );
// establecer elemento de men Acerca de...
JMenuItem elementoAcerca = new JMenuItem( "Acerca de..." );
elementoAcerca.setMnemonic( 'c' );
menuArchivo.add( elementoAcerca );
elementoAcerca.addActionListener(new ActionListener()
{
// mostrar cuadro de dilogo de mensaje cuando el usuario
seleccione Acerca de...
public void actionPerformed( ActionEvent evento )
{

JOptionPane.showMessageDialog( PruebaMenu.this,"ste es un ejemplo\ndel uso de
mens","Acerca de", JOptionPane.PLAIN_MESSAGE );
}
} // fin de la clase interna annima
); // fin de la llamada a addActionListener

// establecer elemento de men Salir
JMenuItem elementoSalir = new JMenuItem( "Salir" );
elementoSalir.setMnemonic( 'S' );
menuArchivo.add( elementoSalir );
elementoSalir.addActionListener(new ActionListener()
{
// terminar la aplicacin cuando el usuario haga clic en
elementoSalir
public void actionPerformed( ActionEvent evento )
{
System.exit( 0 );
}
} // fin de la clase interna annima
); // fin de la llamada a addActionListener
// crear barra de mens y adjuntarla a la ventana PruebaMenu
JMenuBar barra = new JMenuBar();
setJMenuBar( barra );
barra.add( menuArchivo );
// crear men Formato, con sus submens y elementos de men
JMenu menuFormato = new JMenu( "Formato" );
menuFormato.setMnemonic( 'F' );
// crear submen Color
String colores[] = { "Negro", "Azul", "Rojo", "Verde" };
Elabor: Ing. Jess Pando Barrn(Mocis)
233
JMenu menuColor = new JMenu( "Color" );
menuColor.setMnemonic( 'C' );
elementosColor = new JRadioButtonMenuItem[ colores.length ];
grupoColores = new ButtonGroup();
ManejadorEventos manejadorEventos = new ManejadorEventos();
// crear elementos de men tipo botones de opcin para el men Color
for ( int cuenta = 0; cuenta < colores.length; cuenta++ )
{
elementosColor[ cuenta ] = new JRadioButtonMenuItem( colores[ cuenta ] );
menuColor.add( elementosColor[ cuenta ] );
grupoColores.add( elementosColor[ cuenta ] );
elementosColor[ cuenta ].addActionListener( manejadorEventos );
}
// seleccionar primer elemento del men Color
elementosColor[ 0 ].setSelected( true );
// agregar el men Formato a la barra de mens
menuFormato.add( menuColor );
menuFormato.addSeparator();
// crear submen Tipo de letra
String nombresTiposLetra[] = { "Serif", "Monospaced", "SansSerif" };
JMenu menuTiposLetra = new JMenu( "Tipo de letra" );
menuTiposLetra.setMnemonic( 'T' );
tiposLetra = new JRadioButtonMenuItem[ nombresTiposLetra.length ];
grupoTiposLetra = new ButtonGroup();
// crear elementos de men tipo botones de opcin para el men Tipos de letra
for ( int cuenta = 0; cuenta < tiposLetra.length; cuenta++ )
{
tiposLetra[ cuenta ] = new JRadioButtonMenuItem( nombresTiposLetra[ cuenta ] );
menuTiposLetra.add( tiposLetra[ cuenta ] );
grupoTiposLetra.add( tiposLetra[ cuenta ] );
tiposLetra[ cuenta ].addActionListener( manejadorEventos );
}
// seleccionar el primer elemento del men Tipo de letra
tiposLetra[ 0 ].setSelected( true );
menuTiposLetra.addSeparator();
// establecer elementos del men Estilo
String nombresEstilo[] = { "Negrita", "Cursiva" };
elementosEstilo = new JCheckBoxMenuItem[ nombresEstilo.length ];
ManejadorEstilo manejadorEstilo = new ManejadorEstilo();
// crear elementos de men tipo casilla de verificacin para el men Estilo
for ( int cuenta = 0; cuenta < nombresEstilo.length; cuenta++ )
{
elementosEstilo[ cuenta ] = new JCheckBoxMenuItem( nombresEstilo[ cuenta ] );
Elabor: Ing. Jess Pando Barrn(Mocis)
234
menuTiposLetra.add( elementosEstilo[ cuenta ] );
elementosEstilo[ cuenta ].addItemListener( manejadorEstilo );
}
// colocar men Tipo de letra en el men Formato
menuFormato.add( menuTiposLetra );
// agregar men Formato a la barra de mens
barra.add( menuFormato );

// establecer etiqueta para mostrar texto
pantallaEtiqueta = new JLabel( "Texto de ejemplo", SwingConstants.CENTER );
pantallaEtiqueta.setForeground( valoresColor[ 0 ] );
pantallaEtiqueta.setFont( new Font( "Serif", Font.PLAIN, 72 ) );
getContentPane().setBackground( Color.CYAN );
getContentPane().add( pantallaEtiqueta, BorderLayout.CENTER );
setSize( 550, 200 );
setVisible( true );
} // fin del constructor
public static void main( String args[] )
{
PruebaMenu aplicacion = new PruebaMenu();
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
// clase interna para manejar eventos de accin de los elementos de men
private class ManejadorEventos implements ActionListener {
// procesar selecciones de color y tipo de letra
public void actionPerformed( ActionEvent evento )
{
// procesar seleccin de color
for ( int cuenta = 0; cuenta < elementosColor.length; cuenta++ )

if ( elementosColor[ cuenta ].isSelected() )
{
pantallaEtiqueta.setForeground( valoresColor[ cuenta ] );
break;
}

// procesar seleccin de tipo de letra
for ( int cuenta = 0; cuenta < tiposLetra.length; cuenta++ )
if ( evento.getSource() == tiposLetra[ cuenta ] )
{
pantallaEtiqueta.setFont(new Font( tiposLetra[ cuenta ].getText(), estilo, 72 ) );
break;
}
repaint();
} // fin del mtodo actionPerformed
Elabor: Ing. Jess Pando Barrn(Mocis)
235
} // fin de la clase ManejadorEventos
// clase interna para manejar eventos de los elementos de men tipo casilla de verificacin
private class ManejadorEstilo implements ItemListener
{
// procesar selecciones de estilo de tipo de letra
public void itemStateChanged( ItemEvent e )
{
estilo = 0;
// checar seleccin de negrita
if ( elementosEstilo[ 0 ].isSelected() )
estilo += Font.BOLD;
// checar seleccin de cursiva
if ( elementosEstilo[ 1 ].isSelected() )
estilo += Font.ITALIC;
pantallaEtiqueta.setFont(new Font( pantallaEtiqueta.getFont().getName(), estilo,
72 ) );
repaint();
}
} // fin de la clase ManejadorEstilo
} // fin de la clase PruebaMenu
Comentarios:
En la mayora de los usos anteriores de showMessageDialog, el primer argumento ha sido null. El
propsito del primer argumento es especificar la ventana padre para el cuadro de dilogo. La ventana
padre ayuda a determinar en dnde va a mostrarse el cuadro de dilogo. Si la ventana padre se
especifica como null, el cuadro de dalogo aparece en el centro de la pantalla. Si la ventana padre se
especifica como null, el cuadro de dilogo aparece centrado sobre la ventana padre especificada, en
este programa, se especifica la ventana padre con PruebaMenu.this; la referencia this del objeto
PruebaMenu. Al utilizar la referencia this en una clase interna, si se especifica la palabra this por s
sola, se hace referencia al objeto de la clase interna. Para hacer referencia a la referencia this del
objeto de la clase externa, debe calificar a this con el nombre de la clase externa y un punto.
Elabor: Ing. Jess Pando Barrn(Mocis)
236
6.11. JPopupMenu
Muchas de las aplicaciones de computadora de la actualidad proporcionan lo que se conoce como
mens contextuales sensibles al contexto. En Swing, tales mens se crean con la clase JpopupMenu
(una subclase de Jcomponent). Estos mens proporcionan opciones especficas al componente para el
cual se gener el evento de desencadenamiento de men contextual. En la mayora de los sistemas,
este evento de desencadenamiento ocurre cuando el usuario oprime y suelta el botn derecho del
ratn.
El eveneto de desencadenamiento del men contextual es especfico para cada plataforma. En la
mayora de las plataformas que utilizan un ratn con varios botones, el evento de desencadenamiento
del men contextual ocurre cuando el usuario hace clic con el botn derecho del ratn en un
componente que tiene soporte para un men contextual.
Ejemplo
DemoContextual.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DemoContextual extends JFrame
{
private JRadioButtonMenuItem elementos[];
private final Color valoresColor[] = { Color.BLUE, Color.YELLOW, Color.RED };
private JPopupMenu menuContextual;
// configurar GUI
public DemoContextual()
{
super( "Uso de objetos JPopupMenu" );
ManejadorEventos manejador = new ManejadorEventos();
String colores[] = { "Azul", "Amarillo", "Rojo" };
// establecer men contextual y sus elementos
ButtonGroup grupoColores = new ButtonGroup();
Elabor: Ing. Jess Pando Barrn(Mocis)
237
menuContextual = new JPopupMenu();
elementos = new JRadioButtonMenuItem[ 3 ];
// construir cada elemento de men y agregarlo al men contextual; adems
// permitir el manejo de eventos para cada elemento de men
for ( int cuenta = 0; cuenta < elementos.length; cuenta++ )
{
elementos[ cuenta ] = new JRadioButtonMenuItem( colores[ cuenta ] );
menuContextual.add( elementos[ cuenta ] );
grupoColores.add( elementos[ cuenta ] );
elementos[ cuenta ].addActionListener( manejador );
}
getContentPane().setBackground( Color.WHITE );
// declarar un objeto MouseListener para la ventana que muestra
// un objeto JPopupMenu cuando ocurre el evento de desencadenamiento del men contextual
addMouseListener(new MouseAdapter()
{
// manejar evento de oprimir botn del ratn
public void mousePressed( MouseEvent evento )
{
checkForTriggerEvent( evento );
}
// manejar evento de soltar el botn del ratn
public void mouseReleased( MouseEvent evento )
{
checkForTriggerEvent( evento );
}
// determinar si evento debe desencadenar el men contextual
private void checkForTriggerEvent( MouseEvent evento )
{
if ( evento.isPopupTrigger() )
menuContextual.show(evento.getComponent(), evento.getX(), evento.getY() );
}
} // fin de la clase interna annima
); // fin de la llamada a addMouseListener
setSize( 300, 200 );
setVisible( true );
} // fin del constructor de PruebaContextual

// clase interna privada para manejar eventos de elemento de men
private class ManejadorEventos implements ActionListener
{
// procesar selecciones de elementos de men
public void actionPerformed( ActionEvent evento )
{
Elabor: Ing. Jess Pando Barrn(Mocis)
238
// determinar cul elemento de men fue seleccionado
for ( int i = 0; i < elementos.length; i++ )
if ( evento.getSource() == elementos[ i ] )
{
getContentPane().setBackground( valoresColor[ i ] );
return;
}
}
} // fin de la clase interna privada ManejadorEventos
} // fin de la clase PruebaContextual
PruebaContextual.java
import javax.swing.*;
class PruebaContextual
{
public static void main( String args[] )
{
DemoContextual aplicacion = new DemoContextual();
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
}
Salida:
Comentarios:
Los mtodos mousePressed y mouseReleased comprueban el evento de desencadenamiento del men
contextual. Cada mtodo llama al mtodo utilitario privado checkForTriggerEvent para determinar si
ocurri el evento de desencadenamiento del men contextual.
El mtodo isPopupTrigger de MouseEvent devuelve truesi ocurri el evento de desencadenamiento
del men contextual. De ser as, el mtodo show de JpopMenu muestra el objeto JpopupMenu. El
primer argumento del mtodo showespecifica el componente de origen, cuya posicin ayuda a
determinar en dnde aparecer el objeto Jpopupenu en la pantalla. Los ltimos dos argumentos son
la coordenada x-y en donde debe aparecer el objeto JpopupMenu.
Elabor: Ing. Jess Pando Barrn(Mocis)
239
6.12. Apariencia visual
Los componentes de la GUI ligeros de Swing eliminan muchas cuestiones de portabilidad, al proporcionar
una funcionalidad uniforme entre plataformas, y al definir una apariencia visual uniforme entre plataformas (a
la que se conoce como la apariencia visual metlica). Swing tambin proporciona la flexibilidad de
personalizar la apariencia visual, para que un programa tenga la apariencia visual al estilo Microsoft
Windows, al estilo Motif (UNIX) o al estilo Mac.
Al ejecutar el siguiente ejemplo la primera ventana muestra la apariencia visual metlica estndar, la segunda
ventana de salida muestra la apariencia visual Motif y la tercera ventana muestra la apariencia visual
Windows.
DemoAparienciaVisual.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DemoAparienciaVisual extends JFrame {
private final String cadenas[] = { "Metal", "Motif", "Windows" };
private UIManager.LookAndFeelInfo apariencias[];
private JRadioButton opcion[];
private ButtonGroup grupo;
private JButton boton;
private JLabel etiqueta;
private JComboBox cuadroCombinado;
// configurar la GUI
public DemoAparienciaVisual()
{
super( "Demo de apariencia visual" );
Container contenedor = getContentPane();
// establecer panel para regin NORTH de esquema BorderLayout
JPanel panelNorte = new JPanel();
Elabor: Ing. Jess Pando Barrn(Mocis)
240
panelNorte.setLayout( new GridLayout( 3, 1, 0, 5 ) );
// establecer etiqueta para panel NORTH
etiqueta = new JLabel( "sta es la apariencia visual Metal seleccionada",
SwingConstants.CENTER );
panelNorte.add( etiqueta );
// establecer botn para panel NORTH
boton = new JButton( "JButton" );
panelNorte.add( boton );
// establecer cuadro combinado para panel NORTH
cuadroCombinado = new JComboBox( cadenas );
panelNorte.add( cuadroCombinado );

// crear arreglo para botones de opcin
opcion = new JRadioButton[ cadenas.length ];
// establecer panel para regin SOUTH de esquema BorderLayout
JPanel panelSur = new JPanel();
panelSur.setLayout( new GridLayout( 1, opcion.length ) );
// establecer botones de opcin para panel SOUTH
grupo = new ButtonGroup();
ManejadorEventos manejador = new ManejadorEventos();
for ( int cuenta = 0; cuenta < opcion.length; cuenta++ )
{
opcion[ cuenta ] = new JRadioButton( cadenas[ cuenta ] );
opcion[ cuenta ].addItemListener( manejador );
grupo.add( opcion[ cuenta ] );
panelSur.add( opcion[ cuenta ] );
}
// adjuntar paneles NORTH y SOUTH al panel de contenido
contenedor.add( panelNorte, BorderLayout.NORTH );
contenedor.add( panelSur, BorderLayout.SOUTH );
// obtener informacin de la apariencia visual instalada
apariencias = UIManager.getInstalledLookAndFeels();
setSize( 300, 200 );
setVisible( true );
opcion[ 0 ].setSelected( true );
} // fin del constructor de DemoAparienciaVisual
// usar UIManager para cambiar la apariencia visual de la GUI
private void cambiarLaAparienciaVisual( int valor )
{
// cambiar la apariencia visual
try
{
UIManager.setLookAndFeel( apariencias[ valor ].getClassName() );
SwingUtilities.updateComponentTreeUI( this );
Elabor: Ing. Jess Pando Barrn(Mocis)
241
}
// procesar problemas al cambiar la apariencia visual
catch ( Exception excepcion )
{
excepcion.printStackTrace();
}
}

// clase interna privada para manejar eventos de botones de opcin
private class ManejadorEventos implements ItemListener
{
// procesar seleccin de apariencia visual del usuario
public void itemStateChanged( ItemEvent evento )
{
for ( int cuenta = 0; cuenta < opcion.length; cuenta++ )
if ( opcion[ cuenta ].isSelected() )
{
etiqueta.setText( "sta es la apariencia visual " +
cadenas[ cuenta ] + " seleccionada" );
cuadroCombinado.setSelectedIndex( cuenta );
cambiarLaAparienciaVisual( cuenta );
}
}
} // fin de la clase interna privada ManejadorEventos
} // fin de la clase DemoAparienciaVisual
PruebaAparienciaVisual.java
import javax.swing.*;
class PruebaAparienciaVisual
{
public static void main( String args[] )
{
DemoAparienciaVisual aplicacion = new DemoAparienciaVisual();
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
}
Salida:
Comentarios
Elabor: Ing. Jess Pando Barrn(Mocis)
242
La clase UIManager (paquete javax.swing) contiene la clase anidada LookAndFeelInfo (una clase
public static) que mantiene la informacin acerca de una apariencia visual.
En la lnea:
private UIManager.LookAndFeelInfo apariencias[];
se declara un areglo de tipo UIManager.LookAndFeelInfo.
En la lnea:
apariencias = UIManager.getInstalledLookAndFeels();
se usa el mtodo esttico getInstalledLookAndFeels() para obtener el arreglo de objetos
UIManager.LookAndFeelInfo que describe cada una de las apariencias visuales disponibles en su sistea.
Cada apariencia visual se representa mediante una clase de Java. El mtodo
getInstalledLookAndFeels no carga a cada una de esas clases. En vez de ello, proporciona los
nombres de las clases de apariencia visual disponibles, de manera que pueda seleccionarse una de
ellas. Esto reduce la sobrecargaque se genera al cargar clases adicionales que el programa no va a
utilizar.
En la lnea:
UIManager.setLookAndFeel( apariencias[ valor ].getClassName() );
Se utliza el mtodo esttico setLookAndFeel para cambiar la apariencia visual.
El mtodo getClassName de la clase UIManager.LookAndFeelInfo determina el nombre de la clase
de apariencia visual que corresponde al objeto UIManager.LookAndFeelInfo. Si la clase de
apariencia visual no se ha cargado ya, se cargar como parte de la llamada a setLookAndFeel.
En la lnea:
SwingUtilities.updateComponentTreeUI( this );
Se utiliza el mtodo esttico updateComponentTreeUI para cambiar la apariencia visual de todos
loscomponentes adjuntos a suargumento.
Elabor: Ing. Jess Pando Barrn(Mocis)
243
6.13. Interfaz de mltiples documentos
Muchas de las aplicaciones utilizan una interfaz de mltiples documentos (MDI), es decir, una ventana
principal (ventana padre) que contiene otras ventanas (ventanas hijas), para administrar varios documentos
abiertos que se procesan en paralelo.
Ejemplo 1:
DemoEscritorio.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DemoEscritorio extends JFrame
{
private JDesktopPane elEscritorio;
// configurar GUI
public DemoEscritorio()
{
super( "Uso de un objeto JDesktopPane" );
// crear barra de mens, menu y elemento de men
JMenuBar barra = new JMenuBar();
JMenu menuAgregar = new JMenu( "Agregar" );
JMenuItem nuevoMarco = new JMenuItem( "Marco interno" );
menuAgregar.add( nuevoMarco );
barra.add( menuAgregar );
setJMenuBar( barra );
// establecer escritorio
elEscritorio = new JDesktopPane();
Elabor: Ing. Jess Pando Barrn(Mocis)
244
getContentPane().add( elEscritorio );

// establecer componente de escucha para elemento de men nuevoMarco
nuevoMarco.addActionListener(new ActionListener()
{
// mostrar nueva ventana interna
public void actionPerformed( ActionEvent evento )
{
// crear marco interno
JInternalFrame marco = new JInternalFrame("Marco
interno", true, true, true, true );
// adjuntar panel al panel de contenido del marco interno
Container contenedor = marco.getContentPane();
MiJPanel panel = new MiJPanel();
contenedor.add( panel, BorderLayout.CENTER );
// establecer tamao de marco interno en el tamao de
su contenido
marco.pack();
// adjuntar marco interno al escritorio y mostrarlo
elEscritorio.add( marco );
marco.setVisible( true );
}
} // fin de la clase interna annima
); // fin de la llamada a addActionListener
setSize( 600, 460 );
setVisible( true );
} // fin del constructor

} // fin de la clase DemoEscritorio
// clase para mostrar un objeto ImageIcon en un panel
class MiJPanel extends JPanel
{
private ImageIcon iconoImagen;
private String[] imagenes = { "floresamarillas.png", "florespurpura.png","floresrojas.png",
"floresrojas2.png", "floreslavanda.png" };
// cargar imagen
public MiJPanel()
{
int numeroAleatorio = ( int ) ( Math.random() * 5 );
iconoImagen = new ImageIcon( imagenes[ numeroAleatorio ] );
}
// mostrar iconoImagen en el panel
public void paintComponent( Graphics g )
{
// llamar al mtodo paintComponent de la superclase
super.paintComponent( g );
Elabor: Ing. Jess Pando Barrn(Mocis)
245
// mostrar icono
iconoImagen.paintIcon( this, g, 0, 0 );
}
// devolver dimensiones de la imagen
public Dimension getPreferredSize()
{
return new Dimension( iconoImagen.getIconWidth(),
iconoImagen.getIconHeight() );
}
} // fin de la clase MiJPanel
PruebaEscritorio.java
import javax.swing.*;
class PruebaEscritorio
{
public static void main( String args[] )
{
DemoEscritorio aplicacion = new DemoEscritorio();
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
}
Salida:
Comentarios:
En la lnea:
Elabor: Ing. Jess Pando Barrn(Mocis)
246
elEscritorio = new JDesktopPane();
se asigna la referencia JdesktopPane (paquete javax.swing), que apunta a la variable elEscritorio, a un nuevo
objeto JdesktopPane que se utilizar paraadministrar las ventanas hijas JinternalFrame.
En la lnea:
getContentPane().add( elEscritorio );
se agrega el objeto al panel de contenido de la ventana de aplicacin. De manera predeterminada, el objeto
JdesktopPane se agrega al centro del layout BorderLayout del panel de contenido, por lo que el objeto se
expande para rellenar toda la ventana de aplicacin.
El constructor JinternalFrame requiere cinco argumentos: una cadena para la barra de ttulo de la
ventana interna, un valor boolean para indicar si el usuario puede:
o reajustar el tamao del marco interno
o cerrar ,el marco interno
o maximizar el marco interno
o minimizar el marco interno
Ejemplo 2:
DemoJTabbedPane.java
import java.awt.*;
import javax.swing.*;
public class DemoJTabbedPane extends JFrame
{
// configurar GUI
public DemoJTabbedPane()
{
super( "Demo de JTabbedPane " );
// crear objeto JTabbedPane
JTabbedPane panelConFichas = new JTabbedPane();
// establecer pane11 y agregarlo al objeto JTabbedPane
JLabel etiqueta1 = new JLabel( "panel uno", SwingConstants.CENTER );
JPanel panel1 = new JPanel();
panel1.add( etiqueta1 );
panelConFichas.addTab( "Ficha uno", null, panel1, "Primer panel" );

// establecer panel2 y agregarlo al objeto JTabbedPane
JLabel etiqueta2 = new JLabel( "panel dos", SwingConstants.CENTER );
JPanel panel2 = new JPanel();
panel2.setBackground( Color.YELLOW );
panel2.add( etiqueta2 );
panelConFichas.addTab( "Ficha dos", null, panel2, "Segundo panel" );
// establecer panel3 y agregarlo al objeto JTabbedPane
JLabel etiqueta3 = new JLabel( "panel tres" );
JPanel panel3 = new JPanel();
panel3.setLayout( new BorderLayout() );
panel3.add( new JButton( "Norte" ), BorderLayout.NORTH );
Elabor: Ing. Jess Pando Barrn(Mocis)
247
panel3.add( new JButton( "Oeste" ), BorderLayout.WEST );
panel3.add( new JButton( "Este" ), BorderLayout.EAST );
panel3.add( new JButton( "Sur" ), BorderLayout.SOUTH );
panel3.add( etiqueta3, BorderLayout.CENTER );
panelConFichas.addTab( "Ficha tres", null, panel3, "Tercer panel" );
// agregar objeto JTabbedPane al contenedor
getContentPane().add( panelConFichas );
setSize( 250, 200 );
setVisible( true );
} // fin del constructor
} // fin de la clase DemoJTabbedPane
PruebaDemoJTabbedPane.java
import javax.swing.*;
class PruebaDemoJTabbedPane
{
public static void main( String args[] )
{
DemoJTabbedPane demoPanelConFichas = new DemoJTabbedPane();
demoPanelConFichas.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
}
Salida:
Comentarios:
Un objeto JtabbedPane ordena los componentes de la GUI en capas, en donde slo una capa est
visible en un momento dado. Los usuarios acceden a cada una de las capas mediante una ficha.
Cuando los usuarios hacen clic en una ficha, se muestra la capa apropiada.
El primer argumento del mtodo addTab es una cadena que especifica el ttulo de la ficha, el
segundo es una referencia Icon que especifica un icono a mostrar en la ficha. Si el objeto Icon es una
referencia null, no se muestra una imagen. El tercer argumento es una referencia Component que
representa el componente de la GUI a mostrar cuando el usuario hace clic en la ficha.
Elabor: Ing. Jess Pando Barrn(Mocis)
248
6.14. Administradores de esquemas: BoxLayout y GridBagLayout
Ejemplo 1 BoxLayout
Ordena los componentes de la GUI en forma horizontal a lo largo del eje x, o en forma vertical a lo largo del
eje y de un contenedor. La clase Box declara un contenedor con BoxLayout como su administrador de
esquemas predeterminado, y proporciona mtodos estticos para crear un objeto Box con un esquema
BoxLayout horizontal o vertical.
DemoBoxLayout.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DemoBoxLayout extends JFrame
{
// configurar GUI
public DemoBoxLayout()
{
super( "Demo de BoxLayout" );
// crear contenedores Box con esquema BoxLayout
Box horizontal1 = Box.createHorizontalBox();
Box vertical1 = Box.createVerticalBox();
Box horizontal2 = Box.createHorizontalBox();
Box vertical2 = Box.createVerticalBox();
final int TAMANIO = 3; // nmero de botones en cada contenedor Box
// agregar botones al objeto Box horizontal1
for ( int cuenta = 0; cuenta < TAMANIO; cuenta++ )
Elabor: Ing. Jess Pando Barrn(Mocis)
249
horizontal1.add( new JButton( "Botn " + cuenta ) );
// crear montante y agregar botones al objeto Box vertical1
for ( int cuenta = 0; cuenta < TAMANIO; cuenta++ )
{
vertical1.add( Box.createVerticalStrut( 25 ) );
vertical1.add( new JButton( "Botn " + cuenta ) );
}
// crear pegamento horizontal y agregar botones al objeto Box horizontal2
for ( int cuenta = 0; cuenta < TAMANIO; cuenta++ )
{
horizontal2.add( Box.createHorizontalGlue() );
horizontal2.add( new JButton( "Botn " + cuenta ) );
}
// crear rea rgida y agregar botones al objeto Box vertical2
for ( int cuenta = 0; cuenta < TAMANIO; cuenta++ )
{
vertical2.add( Box.createRigidArea( new Dimension( 12, 8 ) ) );
vertical2.add( new JButton( "Botn " + cuenta ) );
}
// crear pegamento vertical y agregar botones al panel
JPanel panel = new JPanel();
panel.setLayout( new BoxLayout( panel, BoxLayout.Y_AXIS ) );
for ( int cuenta = 0; cuenta < TAMANIO; cuenta++ )
{
panel.add( Box.createGlue() );
panel.add( new JButton( "Botn " + cuenta ) );
}
// crear un objeto JTabbedPane
JTabbedPane fichas = new JTabbedPane( JTabbedPane.TOP,
JTabbedPane.SCROLL_TAB_LAYOUT );
// colocar cada contendor en panel con fichas
fichas.addTab( "Cuadro horizontal", horizontal1 );
fichas.addTab( "Cuadro vertical con montantes", vertical1 );
fichas.addTab( "Cuadro horizontal con pegamento", horizontal2 );
fichas.addTab( "Cuadro vertical con reas rgidas", vertical2 );
fichas.addTab( "Cuadro vertical con pegamento", panel );
getContentPane().add( fichas ); // colocar panel con fichas en el panel de contenido
setSize( 400, 220 );
setVisible( true );
} // fin del constructor

} // fin de la clase DemoBoxLayout
PruebaDemoBoxLayout.java
Elabor: Ing. Jess Pando Barrn(Mocis)
250
import javax.swing.*;
class PruebaDemoBoxLayout
{
public static void main( String args[] )
{
DemoBoxLayout aplicacion = new DemoBoxLayout();
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
}
Salida:
Comentarios:
En la lnea:
vertical1.add( Box.createVerticalStrut( 25 ) );
se agrega un montante vertical al contenedor, mediante el mtodo esttico createVerticalStrut. Un montante
vertical es un componente de la GUI invisible, el cual tiene una altura fija en pxeles y se utiliza para
garantizar una cantidad fija de espacio entre los componentes de la GUI. El argumento determina la altura del
montante en pxeles. Cuando se cambia el tamao del contenedor, la distancia entre los componentes de la
GUI que estn separados por montantes no cambia. La clase Box tambin declara el mtodo
createHorizontalStrut para esquemas BoxLayout horizontales.
En la lnea:
horizontal2.add( Box.createHorizontalGlue() );
se agrega el pegamento horizontal al contenedor, mediante el mtodo esttico createHorizontalGlue. El
pegamento horizontal es un componente de la GUI invisible que puede usarse entre los componentes de la
GUI de tamao fijo para ocupar el espacio adicional. Generalmente, el espacio adicional aparece a la derecha
del ltimo componente de la GUI horizontal, o debajo del ltimo componente de la GUI vertical, en un
esquema BoxLayout. El pegamento permite que se agregue espacio adicional entre los componentes de la
GUI. Cuando se cambia el tamao del contenedor, los componentes separados por pegamento conservan el
mismo tamao, pero el pegamento se estira o se contrae para ocupar el espacio entre los dems componentes.
La clase Box tambin declara el mtodo createVerticalGlue para esquemas BoxLayout verticales.
En la lnea:
vertical2.add( Box.createRigidArea( new Dimension( 12, 8 ) ) );
Elabor: Ing. Jess Pando Barrn(Mocis)
251
se agrega un rea rgidaal contenedor, mediante el mtodo esttico createRigidArea. Un rea rgida es un
componente de la GUI invisible, el cual siempre tiene una anchura y altura fija en pxeles, el argumento es un
objeto Dimension que especifica la anchura y la altura del rea rgida.
En la lnea:
panel.add( Box.createGlue() );
se agrega un componente pegamento al contenedor, mediante el mtodo esttico createGlue. Este componente
se expande o se contrae con base al tamao del objeto Box.
Ejemplo 2 GridBagLayout
Este esquema es similar a GridLayout, ya que tambin ordena los componentes en una cuadrcula. Sin
embargo, es ms flexible. Los componentes pueden variar en tamao (es decir, pueden ocuapr varias filas y
columnas) y pueden agregarse en cualquier orden.
El primer paso es determinar la apariencia de la GUI (esbozo en papel). Primero dibuje la GUI, despus
dibuje una cuadrcula sobre la GUI, dividiendo los componentes en filas y columnas.
Ejemplo
Un objeto GridBagConstraints describe cmo colocar un componente en un esquema GridBagLayout.
Campo de GridBagConstraints Descripcin
fill Ajusta el tamao del componente en la direccin especificada (NONE,
Elabor: Ing. Jess Pando Barrn(Mocis)
252
HORIZONTAL, VERTICAL, BOTH) cuando el rea en pantalla es ms
grande que el componente
gridx La columna en la que se colocar el componente
gridy La fila en la que se colocar el componente
gridWidth El nmero de columnas que ocupa el componente
gridheight El nmero de filas que ocupa el componente
weightx La porcin de espacio adicional que se asignar horizontalmente. La
ranura de la cuadrcula puede hacerse ms ancha cuando hay espacio
adicional disponible
weighty La porcin de espacio adicional que se asignar verticalmente. La ranura
de la cuadrcula puede hacerse ms alta cuando hay espacio adicional
disponible
DemoGridBag.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DemoGridBag extends JFrame
{
private Container contenedor;
private GridBagLayout esquema;
private GridBagConstraints restricciones;

// configurar GUI
public DemoGridBag()
{
super( "GridBagLayout" );
contenedor = getContentPane();
esquema = new GridBagLayout();
contenedor.setLayout( esquema );
// instanciar restricciones de GridBagLayout
restricciones = new GridBagConstraints();
// crear componentes de GUI
JTextArea areaTexto1 = new JTextArea( "AreaTexto1", 5, 10 );
JTextArea areaTexto2 = new JTextArea( "AreaTexto2", 2, 2 );
String nombres[] = { "Hierro", "Acero", "Cobre" };
JComboBox cuadroCombinado = new JComboBox( nombres );
JTextField campoTexto = new JTextField( "CampoTexto" );
JButton boton1 = new JButton( "Botn 1" );
JButton boton2 = new JButton( "Botn 2" );
JButton boton3 = new JButton( "Botn 3" );
// weightx y weighty para areaTexto1 son 0: el valor predeterminado
// anchor para todos los componentes es CENTER: el valor predeterminado
restricciones.fill = GridBagConstraints.BOTH;
agregarComponente( areaTexto1, 0, 0, 1, 3 );

// weightx y weighty para boton1 son 0: el valor predeterminado
Elabor: Ing. Jess Pando Barrn(Mocis)
253
restricciones.fill = GridBagConstraints.HORIZONTAL;
agregarComponente( boton1, 0, 1, 2, 1 );

// weightx y weighty para cuadroCombinado son 0: el valor predeterminado
// fill es HORIZONTAL
agregarComponente( cuadroCombinado, 2, 1, 2, 1 );
// boton2
restricciones.weightx = 1000; // puede hacerse ms ancho
restricciones.weighty = 1; // puede hacerse ms largo
restricciones.fill = GridBagConstraints.BOTH;
agregarComponente( boton2, 1, 1, 1, 1 );

// fill es BOTH para boton3
restricciones.weightx = 0;
restricciones.weighty = 0;
agregarComponente( boton3, 1, 2, 1, 1 );

// weightx y weighty para campoTexto son 0, fill es BOTH
agregarComponente( campoTexto, 3, 0, 2, 1 );
// weightx y weighty para areaTexto2 son 0, fill es BOTH
agregarComponente( areaTexto2, 3, 2, 1, 1 );
setSize( 300, 150 );
setVisible( true );
} // fin del constructor de DemoGridBag
// mtodo para establecer restricciones
private void agregarComponente( Component componente,
int fila, int columna, int anchura, int altura )
{
// establecer gridx y gridy
restricciones.gridx = columna;
restricciones.gridy = fila;
// establecer gridwidth y gridheight
restricciones.gridwidth = anchura;
restricciones.gridheight = altura;
// establecer restricciones y agregar componente
esquema.setConstraints( componente, restricciones );
contenedor.add( componente );
}
} // fin de la clase DemoGridBag
PruebaDemoGridBag.java
import javax.swing.*;
class PruebaDemoGridBag
{
public static void main( String args[] )
{
Elabor: Ing. Jess Pando Barrn(Mocis)
254
DemoGridBag aplicacion = new DemoGridBag();
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
}
Salida:
Ejemplo 3 GridBagLayout
DemoGridBag2.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DemoGridBag2 extends JFrame
{
private GridBagLayout esquema;
private GridBagConstraints restricciones;
private Container contenedor;

// configurar GUI
public DemoGridBag2()
{
super( "GridBagLayout" );
contenedor = getContentPane();
esquema = new GridBagLayout();
contenedor.setLayout( esquema );
// instanciar restricciones de GridBagLayout
restricciones = new GridBagConstraints();
// crear componentes de GUI
String metales[] = { "Cobre", "Aluminio", "Plata" };
JComboBox cuadroCombinado = new JComboBox( metales );
JTextField campoTexto = new JTextField( "CampoTexto" );
String tiposLetra[] = { "Serif", "Monospaced" };
JList lista = new JList( tiposLetra );
String nombres[] = { "cero", "uno", "dos", "tres", "cuatro" };
JButton botones[] = new JButton[ nombres.length ];
for ( int cuenta = 0; cuenta < botones.length; cuenta++ )
botones[ cuenta ] = new JButton( nombres[ cuenta ] );
Elabor: Ing. Jess Pando Barrn(Mocis)
255
// definir restricciones del componente de GUI campoTexto
restricciones.weightx = 1;
restricciones.weighty = 1;
restricciones.fill = GridBagConstraints.BOTH;
restricciones.gridwidth = GridBagConstraints.REMAINDER;
agregarComponente( campoTexto );
// botones[0] -- weightx y weighty son 1: fill es BOTH
restricciones.gridwidth = 1;
agregarComponente( botones[ 0 ] );
// botones[1] -- weightx y weighty son 1: fill es BOTH
restricciones.gridwidth = GridBagConstraints.RELATIVE;
agregarComponente( botones[ 1 ] );
// botones[2] -- weightx y weighty son 1: fill es BOTH
restricciones.gridwidth = GridBagConstraints.REMAINDER;
agregarComponente( botones[ 2 ] );
// cuadroCombinado -- weightx es 1: fill es BOTH
restricciones.weighty = 0;
restricciones.gridwidth = GridBagConstraints.REMAINDER;
agregarComponente( cuadroCombinado );

// botones[3] -- weightx es 1: fill es BOTH
restricciones.weighty = 1;
restricciones.gridwidth = GridBagConstraints.REMAINDER;
agregarComponente( botones[ 3 ] );
// botones[4] -- weightx y weighty son 1: fill es BOTH
restricciones.gridwidth = GridBagConstraints.RELATIVE;
agregarComponente( botones[ 4 ] );
// lista -- weightx y weighty son 1: fill es BOTH
restricciones.gridwidth = GridBagConstraints.REMAINDER;
agregarComponente( lista );
setSize( 300, 200 );
setVisible( true );

} // fin del constructor
// agregar un componente al contenedor
private void agregarComponente( Component componente )
{
esquema.setConstraints( componente, restricciones );
contenedor.add( componente ); // agregar componente
}

} // fin de la clase DemoGridBag2
PruebaDemoGridBag2.java
Elabor: Ing. Jess Pando Barrn(Mocis)
256
import javax.swing.*;
class PruebaDemoGridBag2
{
public static void main( String args[] )
{
DemoGridBag2 aplicacion = new DemoGridBag2();
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
}
Salida:
Comentarios:
Hay una variacin de GridBagLayout que no utiliza a las variables gridx y gridy. En vez de estas
variables, se utilizan las constantes RELATIVE y REMAINDER de
GridBagConstraints.RELATIVE especifica que el penltimo componente de cierta fila deber
colocarse a la derecha del componente anterior en esa fila. REMAINDER especifica que un
componente es el ltimo en una fila. Cualquier componente que no sea el penltimo o el ltimo en
una fila, deber especificar valores para las variables gridWidth y gridheight.
7. Proyecto Cliente-Servidor
Por ltimo se agrega dos proyectos de una conexin Cliente-Servidor implementado por el alumno: Juan
Carlos Cern Guerrero de la carrera de Ingeniera en Sistemas
Proyecto 1
InterfazGraficaChat.java
////////////////////////// IMPORTANDO PAQUETES /////////////////////////////////
import java.net.*;
import java.io.*;
import java.awt.*;
public class InterfazGraficaChat extends Frame implements Runnable
{
/////////////////////////// DECLARANDO VARIABLES //////////////////////////////
protected DataInputStream i;
Elabor: Ing. Jess Pando Barrn(Mocis)
257
protected DataOutputStream o;
protected MenuBar menuBar1;
protected Menu opciones;
protected MenuItem salir;
protected static TextArea salida;
protected static TextArea usuarios;
protected TextField entrada;
protected Thread listener;
/////////// CONSTRUCTOR CON IMPLEMENTACION IMPLICITA DE GUI //////////////////
public InterfazGraficaChat(String title, InputStream i, OutputStream o)
{
super (title);
this.i = new DataInputStream (new BufferedInputStream (i));
this.o = new DataOutputStream (new BufferedOutputStream (o));
setLayout (new BorderLayout ());
setMenuBar(menuBar1 = new MenuBar());
menuBar1.add(opciones = new Menu("OPCIONES"));
opciones.add(salir = new MenuItem("SALIR"));
add ("West",usuarios = new TextArea (20,23));
add ("East",salida = new TextArea (20,50));
usuarios.setEditable (false);
usuarios.setBackground( Color.yellow) ;
salida.setBackground( Color.green) ;
salida.setEditable (false);
add ("South", entrada = new TextField (30));
usuarios.setText(" USUARIOS CONECTADOS \n --------------------------- \n");
salida.setText( " JUAN CARLOS CERON GUERRERO \n"+
" 2-C ING.SISTEMAS.COMP \n"+
" APLICACION CHAT BASADA EN \n"+" ChatApplet DE MERLIN HUGHES \n"+
" PARA EFECTOS DE ESTUDIO \n--------------------------------------------"+
"\n CONECTANDO CON EL SERVIDOR \n INICIALIZANDO \n CONECTADO"+
" \n BIENBENIDO AL CHAT DE ITSOEH.COM.MX \n ----------------------------"+
"---------------------------------------------------------------------\n");
EventosChat obj = new EventosChat(salir);
salir.addActionListener(obj);
pack ();
show ();
entrada.requestFocus ();
listener = new Thread (this);///// INSTANCIANDO THREAD-HEBRA-HILO //////////
listener.start ();//////////////// INICIANDO EL THREAD-HEBRA-HILO //////////
}
/////////////////////////////////////////////////////////////////////////////
public static void actualizar(String linea)
{
salida.append(linea);
}//InterfazGraficaChat.actualizar(String)// LLAMA AL METODO ESTATICO
//QUE ESCRIBE EN EL GUI
/////////////////////////////////////////////////////////////////////////////
public static void actualizarUsuarios(String linea1)
{
usuarios.append(linea1);
}//InterfazGraficaChat.actualizarUsuarios(String)/ LLAMA AL METODO ESTATICO
//QUE ESCRIBE EN EL GUI
/////////////////////////////////////////////////////////////////////////////
////////////THREAD-HEBRA-HILO////////////////////////////////////////////////
/////SE EJECUTA PARALELO A ESTOS PROCESOS ///////////////////////////////////
Elabor: Ing. Jess Pando Barrn(Mocis)
258
public void run()
{
try
{
while (true)
{
String line = i.readUTF();
salida.appendText (line + "\n");
}
}
catch (IOException ex)
{
ex.printStackTrace ();
}
finally
{
listener = null;
entrada.hide ();
validate ();
try
{
o.close ();
}

catch (IOException ex)
{
ex.printStackTrace ();
}
}
}

public boolean handleEvent (Event e)
{
if ((e.target == entrada) && (e.id == Event.ACTION_EVENT))
{
try
{
o.writeUTF ((String) e.arg);
o.flush ();
}
catch (IOException ex)
{
ex.printStackTrace();
listener.stop ();
}
entrada.setText ("");
return true;
}/////////// TRATANDO EVENTO DE CIERRE DE VENTANA MEDIANTE HERENCIA ////////
else if ((e.target == this) && (e.id == Event.WINDOW_DESTROY))
{
System.out.println("HA CERRADO LA VENTANA");
System.out.println("CESION TERMINADA \n FIN DEL PROGRAMA"+
" \n JUAN CARLOS CERON GUERRERO\n"+
" 2-C ING.SISTEMAS COMP.");
System.exit(0);
Elabor: Ing. Jess Pando Barrn(Mocis)
259
if (listener != null)
listener.stop ();/////////DETENIENDO EL THREAD-HEBRA-HILO //////////////
hide (); /////////////Y PASANDO A ESTADO MUERTO /////////////////
return true;
}
return super.handleEvent (e);
}
}///////////////////////////// FIN DEL CODIGO //////////////////////////////////
EventosChat.java
////////////////////////// IMPORTANDO PAQUETES /////////////////////////////////
import java.net.*;
import java.io.*;
import java.util.*;
import java.awt.event.*;
import java.awt.*;
public class EventosChat extends Thread implements ActionListener
{
//////////////////////// DECLARANDO VARIABLES /////////////////////////////////
protected Socket s;
protected DataInputStream i;
protected DataOutputStream o;
private MenuItem salir;
private Frame servidor;
//CONSTRUCTOR QUE RECIBE EL #DE SOCKET Y ASIGNA ENTRADA Y SALIDA PARA LOS
DATOS
public EventosChat(Socket s) throws IOException
{
this.s = s;
i = new DataInputStream (new BufferedInputStream (s.getInputStream ()));
o = new DataOutputStream (new BufferedOutputStream (s.getOutputStream ()));
}
////// SOBRECARGANDO AL METODO CONSTRUCTOR PARA RECIBIR EL MENU //////////
public EventosChat(MenuItem salir)
{
this.salir=salir;
}
////// IMPLEMENTANDO UNICO METODO DE INTERFAZ ActionListener /////////////////
public void actionPerformed(ActionEvent e)
{
System.out.println("HA ELEGIDO SALIR");
System.out.println(" SESION FINALIZADA \n FIN DEL PROGRAMA \n ");
System.out.println("JUAN CARLOS CERON GUERRERO \n 2-C ING. SISTEMAS");
System.exit(0);
}
////////////////////// INICIANDO EL THREAD-HEBRA-HILO /////////////////////////
protected static Vector handlers = new Vector();
public void run ()
{
String name = s.getInetAddress ().toString ();
try
{
broadcast (" EL USUARIO "+name + " HA ENTRADO ");
Elabor: Ing. Jess Pando Barrn(Mocis)
260
handlers.addElement(this);
while (true)
{
String msg = i.readUTF ();
broadcast (name + " - " + msg);
InterfazGraficaServidor.actualizar(" EL USUARIO "+name +
"/ HA ENVIADO EL MENSAJE.\n"+msg+"\n");// LLAMANDO AL METODO ESTATICO
} // QUE ESCRIBE SOBRE LA SALIDA DEL SERVIDOR//
}

catch (IOException ex)// RECIBIENDO Y TRATANDO POSIBLE ECEPCION DE ////////
{ ///// COMUNICACION ENTRE CLIENTE Y SERVIDOR////////////
ex.printStackTrace ();
}

finally
{
handlers.removeElement (this);// DETECTANDO SI EL USUARIO FINALIZA ///////
broadcast (name + " HA SALIDO ");///////LA APLICACION CLIENTE ////////////
InterfazGraficaServidor.actualizar("EL USUARIO "+name +"/ HA SALIDO.\n");
try
{
s.close ();
}

catch (IOException ex)
{
ex.printStackTrace();
}
}
}
protected static void broadcast (String message)
{
synchronized (handlers)
{
Enumeration e = handlers.elements ();
while (e.hasMoreElements ())
{
EventosChat c = (EventosChat) e.nextElement ();
try
{
synchronized (c.o)
{
c.o.writeUTF (message);
}

c.o.flush ();
}

catch (IOException ex)
{
c.stop ();//DETENIENDO EL THREAD-HEBRA-HILO Y PASANDO A ESTADO MUERTO/
}

}
}
Elabor: Ing. Jess Pando Barrn(Mocis)
261
}
}///////////////////////////// FIN DEL CODIGO //////////////////////////////////
PruebaChat.java
import java.util.*;
import java.net.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
public class PruebaChat
{
public static void main (String args[]) throws IOException
{
System.out.println(" SESION INICIADA ");
Socket s = new Socket ("192.10.1.32",4321);//-ESPECIFICAR EL IP DEL HOST
new InterfazGraficaChat("PROYECTO (1) UNIDAD 5 SALA DE CHAT " +
"127.0.0.1" +
":" +4321,s.getInputStream (), s.getOutputStream ());
InterfazGraficaChat.actualizar("- SESION INICIADA -\n");
InterfazGraficaChat.actualizarUsuarios(s.getInetAddress().toString());//---------
}
}
InterfazGraficaServidor.java
import java.awt.*;
public class InterfazGraficaServidor
{
private Frame ventana;
private Panel panel1, panel2;
private MenuBar menuBar1;
private Menu opciones;
private MenuItem salir;
private Label label1;
private static TextArea consola;
public InterfazGraficaServidor()
{
ventana = new Frame(" PROYECTO (1) UNIDAD 5: CONSOLA DEL SERVIDOR");
menuBar1 = new MenuBar();
opciones = new Menu("OPCIONES");
salir = new MenuItem(" SALIR ");
panel1 = new Panel();
panel2 = new Panel();
label1= new Label(" JUAN CARLOS CERON GUERRERO \n 2-C ING.SISTEMAS COMP.");
consola = new TextArea(25,58);
menuBar1.add(opciones);
opciones.add(salir);
}
void visualizar()
{
ventana.setBackground( Color.blue ) ;
Elabor: Ing. Jess Pando Barrn(Mocis)
262
consola.setBackground( Color.green) ;
panel1.setBackground( Color.orange ) ;
panel2.setBackground( Color.black ) ;
panel2.setLayout(new FlowLayout());
label1.setBackground( Color.orange) ;
consola.setEditable(false);
consola.append("SERVIDOR DE CHAT - CHAT SENTINEL - V 1.0 \n INICIALIZANDO"+
"... \n ---------------------------------------------------------------\n"+
"EN LINEA \n");
ventana.setMenuBar(menuBar1);
panel1.add(label1);
panel2.add(consola);
ventana.add(panel1,BorderLayout.NORTH);
ventana.add(panel2,BorderLayout.SOUTH);
EventosServidor obj=new EventosServidor(ventana,salir);
ventana.addWindowListener(obj);
salir.addActionListener(obj);
ventana.setVisible(true);
// ventana.setSize(499,570);
ventana.pack();
}
public static void actualizar(String linea)
{
consola.append(linea);
}//InterfazGraficaServidor.actualizar(String)// LLAMA AL METODO ESTATICO
} //QUE ESCRIBE EN EL GUI
EventosServidor.java
import java.net.*;
import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
public class EventosServidor implements WindowListener, ActionListener
{
Frame servidor;
MenuItem salir;
///////////// CONSTRUCTOR QUE RECIBE LA VENTANA DEL SERVIDOR ///////////////
public EventosServidor(Frame servidor, MenuItem salir)
{
this.servidor=servidor;
this.salir=salir;
}

public EventosServidor(int port) throws IOException
{
ServerSocket server = new ServerSocket(port);
while (true)
{
Socket cliente = server.accept ();
System.out.println (" \n EL USUARIO " + cliente.getInetAddress ()+
"/ SE HA CONECTADO ");
String linea=(" EL USUARIO " + cliente.getInetAddress ()+
"/ SE HA CONECTADO \n");
Elabor: Ing. Jess Pando Barrn(Mocis)
263
String linea1=(""+ cliente.getInetAddress ()+"");//-------------
InterfazGraficaServidor.actualizar(linea);
System.out.println ("Accepted from " + cliente.getInetAddress ());
EventosChat c = new EventosChat (cliente);
c.start ();
}
}

public void actionPerformed(ActionEvent e)
{
System.out.println("HA ELEGIDO SALIR");
System.out.println(" SESION FINALIZADA \n FIN DEL PROGRAMA \n ");
System.out.println("JUAN CARLOS CERON GUERRERO \n 2-C ING. SISTEMAS");
System.exit(0);
}

public void windowClosing(WindowEvent e) //--- CERRADO DE VENTANA
{
System.out.println("HA CERRADO LA VENTANA");
System.out.println(" SESION FINALIZADA \n FIN DEL PROGRAMA \n ");
System.out.println("JUAN CARLOS CERON GUERRERO \n 2-C ING. SISTEMAS");
System.exit(0);
}
public void windowOpened(WindowEvent e)
{}
public void windowIconified(WindowEvent e)
{}
public void windowDeiconified(WindowEvent e)
{}
public void windowClosed(WindowEvent e)
{}
public void windowActivated(WindowEvent e)
{}
public void windowDeactivated(WindowEvent e)
{
}
}
PruebaServidor.java
import java.net.*;
import java.io.*;
import java.util.*;
import java.awt.event.*;
public class PruebaServidor
{
public static void main (String args[]) throws IOException
{
InterfazGraficaServidor consolaServidor=new InterfazGraficaServidor();
consolaServidor.visualizar();
InterfazGraficaServidor.actualizar("EN ESPERA DE USUARIOS \n");
System.out.println(" EN ESPERA DE USUARIOS ");
new EventosServidor(4321);
Elabor: Ing. Jess Pando Barrn(Mocis)
264
}
}
Proyecto 2
InterfazGraficaServidor.java
import java.awt.*;
public class InterfazGraficaServidor
{
private Frame ventana;
private Panel panel1, panel2;
private MenuBar menuBar1;
private Menu opciones;
private MenuItem salir;
private Label label1;
private static TextArea consola;
public InterfazGraficaServidor()
{
ventana = new Frame(" PROYECTO (3) UNIDAD 7: CONSOLA DEL SERVIDOR");
menuBar1 = new MenuBar();
opciones = new Menu("OPCIONES");
salir = new MenuItem(" SALIR ");
panel1 = new Panel();
panel2 = new Panel();
label1= new Label(" JUAN CARLOS CERON GUERRERO \n 2-C ING.SISTEMAS COMP.");
consola = new TextArea(25,58);
menuBar1.add(opciones);
opciones.add(salir);
}
void visualizar()
{
ventana.setBackground( Color.black ) ;
consola.setBackground( Color.green) ;
panel1.setBackground( Color.red ) ;
panel2.setBackground( Color.black ) ;
panel2.setLayout(new FlowLayout());
label1.setBackground( Color.green) ;
consola.setEditable(false);
consola.append(" SERVIDOR V 1.0 \n INICIALIZANDO"+
"... \n -------------------------------------------------------------"+
"------------------------------------------------------------------\n"+
" EN LINEA");
ventana.setMenuBar(menuBar1);
panel1.add(label1);
panel2.add(consola);
ventana.add(panel1,BorderLayout.NORTH);
ventana.add(panel2,BorderLayout.SOUTH);
EventosServidor obj=new EventosServidor(ventana,salir);
ventana.addWindowListener(obj);
salir.addActionListener(obj);
ventana.setVisible(true);
// ventana.setSize(499,570);
Elabor: Ing. Jess Pando Barrn(Mocis)
265
ventana.pack();
}
public static void actualizar(String linea)
{
consola.append(linea);
}//InterfazGraficaServidor.actualizar(String);// LLAMA AL METODO ESTATICO
} //QUE ESCRIBE EN EL GUI
EventosServidor.java
////////////////////////// IMPORTANDO PAQUETES /////////////////////////////////
import java.net.*;
import java.io.*;
import java.util.*;
import java.awt.event.*;
import java.awt.*;
import java.util.Date;
import java.sql.*;
public class EventosServidor extends WindowAdapter implements ActionListener
{
private Frame ventana;
private MenuItem salir;
EventosServidor()
{

}
EventosServidor(Frame ventana, MenuItem salir)
{
this.ventana=ventana;
this.salir=salir;
}

public void comenzar()
{
try
{
// Creamos un Socket Servidor.
String f1,f2,f3;
ServerSocket servidor=new ServerSocket(4321);
Date hora= new Date();
int s = hora.getSeconds();
int m = hora.getMinutes();
int h = hora.getHours();
// Esperamos que se conecte un cliente.
System.out.println("Esperando la conexion de un cliente ....");
InterfazGraficaServidor.actualizar("\n Esperando la conexion de un cliente ....");

Socket cliente=servidor.accept(); //Este metodo es bloqueante

System.out.println("ip"+ cliente.getInetAddress());
System.out.println("nom cli"+ cliente.getInetAddress().getHostName());
System.out.println("Recibida la conexion de un cliente\n");
Elabor: Ing. Jess Pando Barrn(Mocis)
266
InterfazGraficaServidor.actualizar("\n Recibida la conexion de un cliente \n");
System.out.println("Sirvo al cliente " + cliente.getInetAddress());
InterfazGraficaServidor.actualizar("\n Sirvo al cliente " + cliente.getInetAddress());
BufferedReader entrada;
PrintWriter salida,salida1,salida2;
// Creamos el buffer para recibir datos, a traves del socket asignado
// a la conexion del cliente.
entrada= new BufferedReader(new InputStreamReader(cliente.getInputStream()));
// Creamos el buffer para enviar al cliente informacion a traves del socket.
salida =new PrintWriter(cliente.getOutputStream(),true);
salida1 =new PrintWriter(cliente.getOutputStream(),true);
salida2 =new PrintWriter(cliente.getOutputStream(),true);

String msg;
while (true)
{ // Bucle infinito

msg=entrada.readLine(); // Leemos una linea recibida por el socket.
System.out.println("Mensaje del cliente: "+msg);
InterfazGraficaServidor.actualizar("\n Mensaje del cliente: "+msg);
int opcion= Integer.parseInt(msg);
switch(opcion)
{
case 1: // hora de inicio del servidor
salida.println(hora.getHours()+":"+hora.getMinutes()+":"+hora.getSeconds());
break;
case 2:
salida.println(hora.getDay()+"/"+hora.getMonth()+"/"+hora.getYear());
//salida.println(msg.toUpperCase()); // Enviamos al cliente la informacion recibida, pero en letra
mayuscula.
break;
case 3:
Date hora2= new Date();
int s2 = hora2.getSeconds();
int m2 = hora2.getMinutes();
int h2 = hora2.getHours();

if (s > s2)
{
s2 = (60-s)+s2;
m2--;
}
else
s2 = s2 - s;

if (m > m2)
{
m2 = (60-m)+m2;
h2--;
}
else
m2 = m2 -m;

if (h > h2)
h2 = (24-h)+h2;
Elabor: Ing. Jess Pando Barrn(Mocis)
267

else
h2= h2 - h;

// en segundos, minutos y horas esta el tiempo de ejecucion del servidor
salida.println(h2+":"+m2+":"+s2);
break;
case 4:
Date horaactual= new Date();
salida.println(horaactual.getHours()+":"+horaactual.getMinutes()+":"+horaactual.getSeconds());
break;
}


} // Fin del bucle infinito
}
// Tratamos las excepciones
catch (SocketException e)
{
System.err.println("Error en una operacion de socket");
}
catch (IOException e) {
System.err.println("Error en una operacion de entrada/salida");
}

}


public void actionPerformed(ActionEvent e)
{
System.out.println("HA ELEGIDO SALIR");
System.out.println(" SESION FINALIZADA \n FIN DEL PROGRAMA \n ");
System.out.println("JUAN CARLOS CERON GUERRERO \n 2-C ING. SISTEMAS");
System.exit(0);
}

public void windowClosing(WindowEvent e) //--- CERRADO DE VENTANA
{
System.out.println("HA CERRADO LA VENTANA");
System.out.println(" SESION FINALIZADA \n FIN DEL PROGRAMA \n ");
System.out.println("JUAN CARLOS CERON GUERRERO \n 2-C ING. SISTEMAS");
System.exit(0);
}
}
InterfazGraficaCliente.java
import java.awt.*;
public class InterfazGraficaCliente
{
private Frame ventana;
private Panel panel1, panel2,panel3,panel4;
private MenuBar menuBar1;
Elabor: Ing. Jess Pando Barrn(Mocis)
268
private Menu opciones;
private MenuItem salir;
private Label label1;
private static TextArea consola;
private Button boton1,boton2,boton3,boton4;
public InterfazGraficaCliente()
{
ventana = new Frame(" PROYECTO (3) UNIDAD 7: MENU CLIENTE ");
menuBar1 = new MenuBar();
opciones = new Menu("OPCIONES");
salir = new MenuItem(" SALIR ");
panel1 = new Panel();
panel2 = new Panel();
panel3 = new Panel();
panel4 = new Panel();
label1 = new Label(" JUAN CARLOS CERON GUERRERO \n 2-C ING.SISTEMAS COMP.");
boton1 = new Button(" HORA DE INICIO DEL SERVIDOR ");
boton2 = new Button(" OBTENER LA FECHA ");
boton3 = new Button(" TIEMPO DE SERVICIO SERVIDOR ");
boton4 = new Button(" HORA ACTUAL ");
consola = new TextArea(10,40);
menuBar1.add(opciones);
opciones.add(salir);
}
void visualizar()
{
ventana.setBackground( Color.black) ;
consola.setBackground( Color.green) ;
panel1.setBackground( Color.red) ;
panel2.setBackground( Color.black ) ;
panel3.setBackground( Color.red) ;
panel2.setLayout(new GridLayout(4,1,20,20));
label1.setBackground( Color.green) ;
boton1.setBackground( Color.green) ;
boton2.setBackground( Color.green) ;
boton3.setBackground( Color.green) ;
boton4.setBackground( Color.green) ;
consola.setEditable(false);
consola.append(" APLICACION CLIENTE \n INICIALIZANDO"+
"... \n ----------------------------------------------------------------"+
"-------------\n"+
"EN LINEA \n");
ventana.setMenuBar(menuBar1);
panel1.add(label1) ;
panel2.add(boton1) ;
panel2.add(boton2) ;
panel2.add(boton3) ;
panel2.add(boton4) ;
panel3.add(consola);
panel4.add(panel2) ;
panel4.add(panel3) ;
ventana.add(panel1,BorderLayout.NORTH);
ventana.add(panel4,BorderLayout.SOUTH);
Elabor: Ing. Jess Pando Barrn(Mocis)
269
EventosCliente obj=new EventosCliente(boton1,boton2,boton3,boton4,salir,ventana);
ventana.addWindowListener(obj);
salir.addActionListener(obj);
boton1.addActionListener(obj);
boton2.addActionListener(obj);
boton3.addActionListener(obj);
boton4.addActionListener(obj);
ventana.setVisible(true);
// ventana.setSize(499,570);
ventana.pack();
}
public static void actualizar(String linea)
{
consola.append(linea);
}//InterfazGraficaCliente.actualizar(String);// LLAMA AL METODO ESTATICO
} //QUE ESCRIBE EN EL GUI

EventosCliente.java
////////////////////////// IMPORTANDO PAQUETES /////////////////////////////////
import java.net.*;
import java.io.*;
import java.util.*;
import java.awt.event.*;
import java.awt.*;
public class EventosCliente extends WindowAdapter implements ActionListener
{
private static Socket socket;
private static BufferedReader lectura;
private static PrintWriter escritura;
private static String a;
EventosCliente()throws IOException
{
socket=new Socket ("192.10.1.32",4321);//Soket enlazado al servidor
lectura=new BufferedReader(new InputStreamReader (socket.getInputStream()));
}
private Button boton1,boton2,boton3,boton4;
private MenuItem salir;
Frame ventana;
EventosCliente(Button boton1,Button boton2,Button boton3,Button boton4,MenuItem salir,Frame ventana)
{
this.boton1=boton1;
this.boton2=boton2;
this.boton3=boton3;
this.boton4=boton4;
this.salir = salir;
this.ventana=ventana;
}

static void enviar(String a)throws IOException
{
Elabor: Ing. Jess Pando Barrn(Mocis)
270
escritura=new PrintWriter (socket.getOutputStream(),true);
escritura.println(a);
// Leemos lo que nos llega del servidor, y lo mostramos por pantalla.
InterfazGraficaCliente.actualizar("Mensaje del servidor: \n"+lectura.readLine()+"\n");
}

public void actionPerformed(ActionEvent x)
{
Button b=(Button) x.getSource();
String text=b.getActionCommand();
if(text.equals(boton1.getActionCommand()))
{
System.out.println("1");
try{
EventosCliente.enviar("1");
}
catch (Exception y) {}
}
else if(text.equals(boton2.getActionCommand()))
{
System.out.println("2");
try{
EventosCliente.enviar("2");}
catch (Exception y) {}
}
else if(text.equals(boton3.getActionCommand()))
{
System.out.println("3");
try{
EventosCliente.enviar("3");}
catch (Exception y) {}
}
else if(text.equals(boton4.getActionCommand()))
{
System.out.println("4");
try{
EventosCliente.enviar("4");}
catch (Exception y) {}
}
else// if(text.equals(salir.getActionCommand()))
{
System.out.println("HA ELEGIDO SALIR");
System.out.println(" SESION FINALIZADA \n FIN DEL PROGRAMA \n ");
System.out.println("JUAN CARLOS CERON GUERRERO \n 2-C ING.
SISTEMAS");
System.exit(0);
}
}

public void windowClosing(WindowEvent e)
{
System.out.println("HA CERRADO LA VENTANA");
System.out.println(" SESION FINALIZADA \n FIN DEL PROGRAMA \n ");
System.out.println("JUAN CARLOS CERON GUERRERO \n 2-C ING. SISTEMAS");
System.exit(0);
}
Elabor: Ing. Jess Pando Barrn(Mocis)
271
}
PruebaServidor.java
import java.net.*;
import java.io.*;
public class PruebaServidor
{
public static void main (String args[]) throws IOException
{
InterfazGraficaServidor consolaServidor=new InterfazGraficaServidor();
consolaServidor.visualizar();
EventosServidor x=new EventosServidor();
x.comenzar() ;
}
}
PruebaCliente.java
import java.net.*;
import java.io.*;
public class PruebaCliente
{
public static void main (String args[]) throws IOException
{
InterfazGraficaCliente Gui = new InterfazGraficaCliente();
Gui.visualizar();
Gui.actualizar("- SESION INICIADA -\n");
EventosCliente x=new EventosCliente();
// x.comenzar();
}
}
8.0 BIBLIOGRAFA
Anlisis y Diseo Orientado a Objetos con aplicaciones
Grady Booch
Addison Wesley. Longman
Elabor: Ing. Jess Pando Barrn(Mocis)
272
Java 2. Fundamentos de programacin
Herbert Schildt
McGraw-Hill
Java Cmo Programar
Deitel/Deitel
Prentice Hall
Curso en Programacin Avanzada en Java en Espaol (documento .pdf)
Java 2
Steven Holzner
Coriolis
Manual prctico en Espaol Java 2 (documento .pdf)
Java Sun Espaol (documento .pdf)
Elabor: Ing. Jess Pando Barrn(Mocis)
273

También podría gustarte