Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Versión 1.0
5.8 Componentes de
178
texto
5.9 Componentes
184
canvas y ScrollPane
5.10 Componentes 193
El presente manual es una recopilación de diversas fuentes que reúne los aspectos
más relevantes del lenguaje Java que tanta inquietud ha causado entre los programadores y
también mucha confusión en cuál es la fuente idónea para aprender dicha tecnología, cada
libro o manual tiene su propia e interesante aportación, lo novedoso que se presenta en esta
documentación es que extrae lo mejor de cada fuente bibliográfica relacionando los
contenidos con los los parámetros que establece Sun y los planes de estudio del área de
Informática y Sistemas. El manual es un soporte para el catedrático y el estudiante ya que
incluye una diversidad de ejemplos por cada tema centrándose en la sencillez de los
mismos y dejando la complejidad de elementos distractores, de esta manera, los programas
desarrollados sirven como plantilla y guía para entender el concepto y que va a permitir a
los estudiantes conformar aplicaciones más elaboradas.
Adicionalmente ofrece la facilidad de entender y desarrollar aplicaciones en el
lenguaje Java basado en la potencialidad que ofrece la Programación Orientada a Objetos
haciendo hincapié en los aspectos primarios de un lenguaje orientado a objetos como son:
• Abstracción
• Encapsulamiento
• Modularidad
• Jerarquía
Esta documentación inicia con los antecedentes de Java y profundiza en los temas
de la POO, arreglos, herencia e Interfaz Gráfica 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 estándar J2EE.
Java fue diseñado en 1990 por James Gosling, de Sun Microsystems, como software para
dispositivos electrónicos de consumo. Curiosamente, todo este lenguaje fue diseñado antes de que diese
comienzo la era World Wide Web, puesto que fue diseñado para dispositivos electrónicos como calculadoras,
microondas y la televisión interactiva.
En los primeros años de la década de los noventa, Sun Microsystems decidió intentar introducirse en
el mercado de la electrónica de consumo y desarrollar programas para pequeños dispositivos electrónicos.
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 inglés), aunque tuvo que cambiar de denominación, 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.
1. Creciente necesidad de interfaces mucho más cómodas e intuitivas que los sistemas de ventanas que
proliferaban hasta el momento.
2. Fiabilidad del código y facilidad de desarrollo. Gosling observó que muchas de las características
que ofrecían C o C++ aumentaban de forma alarmante el gran coste de pruebas y depuración. Por
ello en sus ratos libres creó un lenguaje de programación donde intentaba solucionar los fallos que
encontraba en C++.
3. Enorme diversidad de controladores electrónicos. Los dispositivos electrónicos se controlan
mediante la utilización de microprocesadores de bajo precio y reducidas prestaciones, que varían
cada poco tiempo y que utilizan diversos conjuntos de instrucciones. Java permite escribir un código
común para todos los dispositivos.
Por todo ello, en lugar de tratar únicamente de optimizar las técnicas de desarrollo y dar por sentada
la utilización 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 programación lo más sencillo
posible, con el objeto de que se pudiese adaptar con facilidad a cualquier entorno de ejecución.
Basándose en el conocimiento y estudio de gran cantidad de lenguajes, este grupo decidió recoger las
características esenciales que debía tener un lenguaje de programación 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 consistía en un sistema de control
completo de los aparatos electrónicos 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 representación de
la casa de forma animada y el control se llevaba a cabo mediante una pantalla sensible al tacto. En el sistema
aparecía ya Duke, la actual mascota de Java.
1
http://pisuerga.inf.ubu.es/lsi/Invest/Java/Tuto/I_2.htm
Una vez que en Sun se dieron cuenta de que a corto plazo la televisión interactiva no iba a ser un
gran éxito, instaron a FirstPerson a desarrollar nuevas estrategias que produjeran beneficios. Entre ellas se
encontraba la aplicación de Java a Internet, la cual no se consideró productiva en ese momento.
Aunque muchas de las fuentes consultadas señalan 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 podría llegar a
ser el campo adecuado para disputar a Microsoft su supremacía en el terreno del software, y vio en Oak el
instrumento idóneo para llevar a cabo estos planes.
Para poder presentarlo en sociedad se tuvo que modificar el nombre de este lenguaje de
programación y se tuvo que realizar una serie de modificaciones de diseño para poderlo adaptar al propósito
mencionado. Así Java fue presentado en sociedad en agosto de 1995.
Algunas de las razones que llevaron a Bill Joy a pensar que Java podría llegar a ser rentable son:
• Java es un lenguaje orientado a objetos: Esto es lo que facilita abordar la resolución de cualquier tipo
de problema.
• Es un lenguaje sencillo, aunque sin duda potente.
• La ejecución del código 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 operación le sea permitida de forma explícita. De este modo, los
datos del usuario quedan a salvo de la existencia de virus escritos en Java. La ejecución segura y
controlada del código Java es una característica única, que no puede encontrarse en ninguna otra
tecnología.
• Es totalmente multiplataforma: Es un lenguaje sencillo, por lo que el entorno necesario para su
ejecución es de pequeño tamaño y puede adaptarse incluso al interior de un navegador.
Existen muchas críticas a Java debido a su lenta velocidad de ejecución, aproximadamente unos 20
veces más 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 representación intermedia denominada código de
byte para solventar los problemas de portabilidad. Los códigos de byte posteriormente se tendrán que
transformar en código máquina en cada máquina en que son utilizados, lo que ralentiza considerablemente el
proceso de ejecución.
La solución que se deriva de esto parece bastante obvia: fabricar ordenadores capaces de comprender
directamente los códigos de byte. Éstas serían unas máquinas que utilizaran Java como sistema operativo y
que no requerirían en principio de disco duro porque obtendrían 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 máquinas ha sido Oracle, que en enero
de 1996 presentó en Japón su primer NC (Network Computer), basado en un procesador RISC con 8
Megabytes de RAM. Tras Oracle, han sido compañías del tamaño de Sun, Apple e IBM las que han anunciado
desarrollos similares.
El único problema aparente es la seguridad para que Java se pueda utilizar para transacciones
críticas. Sun va a apostar por firmas digitales, que serán clave en el desarrollo no sólo de Java, sino de
Internet.
Versiones de Java2
• Java 1
o Java 1.0 (Enero 1996) - 8 paquetes, 212 clases - Primera versión pública. La presión hizo
que se hiciera pública demasiado pronto, lo cual significa que el diseño 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, serialización de objetos, API de JavaBeans,
archivos jar, internacionalización, API Reflection (Reflexión), JDBC (Java Data base
Connectivity), RMI (Remote Method Invocation). Se añade la firma del código y la
autentificación. Es la primera versión 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 resolución de
errores y a la mejora del rendimiento; se producen algunos cambios menores como la
inclusión de JNDI (Java Naming and Directory Interface) y la API Java Sound. También
incluye un nuevo compilador de alto rendimiento JIT (Just In Time).
o Java 1.4 (2002) - 103 paquetes, 2175 clases - También conocido como Merlin, es la versión
actual. Mejora notablemente el rendimiento y añade 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
criptografía mediante las Java Cryptography Extension (JCE), la inclusión 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 - También conocido como Tiger,
renombrado por motivos de marketing como Java 5.0. Incluye como principales novedades:
tipos genéricos (generics)
autoboxing/unboxing conversiones impliticas entre tipos primitivos y los wrappers
correspondientes.
Enumerados
Bucles simplificados
printf
Funciones con número de parámetros variable
Metadatos en clases y métodos.
2
http://www.javahispano.org/news.item.action?id=987142393
b) Se selecciona Sistema
d) Se selecciona en Variables del sistema la variable Path y después se elige el botón Modificar
Por ejemplo:
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 declaración 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 declaración de clase en Java, la cual debe ir seguida
inmediatamente por el nombre de la clase.
• La línea.
Es el punto de inicio de toda aplicación en Java. Los paréntesis después de main indican que éste es
un bloque de construcción del programa, al cual se le llama método. Las declaraciones de clases en Java
generalmente contienen no o más métodos. En una aplicación en Java, sólo uno de esos métodos debe
llamarse main y debe definirse como lo muestra el primer programa, de no ser así, el intérprete java no
ejecutará la aplicación. La palabra clave void indica que este método realizará una tarea pero no devolverá
ningún tipo de información cuando complete su tarea.
• System.out se conoce como el objeto de salida estándar, permite a las aplicaciones en Java mostrar
conjuntos de caracteres en la ventana de comandos, desde la cual se ejecuta la aplicación en Java.
Si el programa no contiene errores de sintaxis, el comando anterior crea un nuevo archivo llamado
Programa1.class, el cual contiene los códigos de bytes de Java que representan la aplicación. Estos códigos de
bytes serán interpretados por Java cuando se le indique que debe ejecutar el programa.
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 código 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)
{
Salida:
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]);
}
}
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 razón que Java se conoce como un
lenguaje fuertemente tipificado.
Cuando se declaran variables de alguno de los tipos primitivos fuera de un método, se les asignan
automáticamente valores predeterminados, a menos que se inicialicen en forma explícita. 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.
class Programa7
{
public static void main(String args[])
{
int a=10;
int b=30;
int c=a+b;
System.out.println("c="+c);
/* 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:
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:
1) Ecuación 1
y= m
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 métodos estáticos parseInt, parseDouble, parseByte, parseBoolean, etc. de las clases respectivas
convierten su argumento String en el tipo de datos deseado.
2) Ecuación 2
a3
z= 3
b+d
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);
3) Ecuación 3
a b ln( ab )
c
p= e{ } −
a
ln(a + b) b
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 aplicación que reciba tres enteros del usuario y evalué la siguiente ecuación:
z = (a + b * c) 2
2. Escriba una aplicación que reciba del usuario el radio de un círculo como un float y que imprima
el diámetro, circunferencia y área de ese círculo. Utilice la constante predefinida Math.PI para el
valor de p.
Diámetro=2r
Circunferencia = 2pr
Area = pr2
Operadores.java
importjavax.swing.JOptionPane;
public class Operadores
{
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");
}
}
Múltiple
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;
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);
}
}
}
ContSumador.java
class ContSumador
{
public static void main(String args[])
{
Ejercicios de series
1 1 1 1
1) 1+ + + + + ... + no. de términos
2 3 4 5
5 10 15 20 25
2) , , , , ,..., no. de términos
2 4 6 8 10
1 3 5
2 4 6
4) + + + .... + no. de términos
3 6 9
51 10 2 15 3
5) + + + .... + no. de términos
4 2 8 4 12 6
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);
}
}
1 2 3
9) + + + .... + no. de términos
1! 2! 3!
2. Escribe una aplicación que estime el valor de la constante matemática e, utilizando la fórmula
1 1 1
e = 1+ + + + ...
1! 2! 3!
x x2 x3
e = 1+ +
x
+ + ...
1! 2! 3!
4. Escribe una aplicación que calcule el producto de los enteros impares del a al 15 y que muestre los
resultados en un cuadro de diálogo de mensaje.
5. Un almacén de pedidos por correo vende cinco productos cuyos precios de venta son los siguientes:
a. Producto 1 $2.98
b. Producto 2 $4.50
El programa debe utilizar una instrucción switch para determinar el precio de venta de cada
producto. Use un ciclo controlado por centinela para determinar cuándo debe el programa dejar de iterar para
mostrar los resultados.
6. Diseña una aplicación que pueda demostrar las tablas de verdad de los operadores AND (&&), OR
(||), NOT (!) y XOR (^), de acuerdo a la siguiente referencia.
Operador AND
Expresión 1 Expresión 2 Resultado
1 1 1
1 0 0
0 1 0
0 0 0
Operador OR
Expresión 1 Expresión 2 Resultado
1 1 1
1 0 1
0 1 1
0 0 0
Operador XOR
Expresión 1 Expresión 2 Resultado
1 1 0
1 0 1
0 1 1
0 0 0
Operador NOT
Expresión 1 Resultado
1 0
0 1
7.
Desarrolla una aplicación para calcular el valor de π a partir de la serie infinita
4 4 4 4 4
π= 4− + − + − + ...
3 5 7 9 11
Visualiza una tabla que permita observar la evaluación de cada término hasta n.
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:
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
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);
}
}
Demo.java
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 después del número se está obligando a convertir el dato en flotante y por lo
tanto ya no marca error en la compilación, tal como lo muestra el siguiente ejemplo.
Demo.java
Salida:
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);
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"));
}
}
Se diseñará una clase que encapsule información acerca de vehículos como autos, camionetas y
camiones. Esta clase se llama Vehiculo y almacenará tres elementos de información acerca del vehículo: el
número 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;
Comentarios:
• La clase Vehiculo define tres variables de instancia, esta clase no contiene ningún método (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 sólo una
descripción, no crea un objeto real.
• La línea:
De la clase PruebaVehiculo crea un objeto minivan que es una instancia de Vehiculo. De esta manera,
tendrá “realidad física”.
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
métodos
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);
}
}
Modificación de la interfaz para instanciar los dos objetos en una sola línea
}
}
Vehiculo.java
class Vehiculo
{
int Pasajeros;
int CapacidadCombustible;
int ConsumoCombustible;
}
DosVehiculos.java
class DosVehiculos
{
public static void main(String args[])
{
int rango1,rango2;
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);
Comentarios:
• La línea:
Desempeña 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 declaración crea una copia física del objeto y asigna a minivan una referencia a ese
objeto. Esto se hace usando el operador new.
El operador new asigna dinámicamente memoria (asignada en tiempo de ejecución) 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 dinámicamente.
La combinación de los dos pasos en el enunciado anterior se puede reescribir para mostrar cada paso
individualmente como sigue:
La primera línea 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 línea crea un nuevo
objeto Vehiculo y asigna una referencia para minivan. Ahora, minivan se enlaza con un objeto.
El primer ejemplo se puede rediseñar para que la referencia al objeto esté en dos líneas:
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);
}
Salida:
PruebaVehiculo5.java
class PruebaVehiculo5
{
public static void main(String args[])
{
carro1.Pasajeros=7;
System.out.println(carro1.Pasajeros); // 7
System.out.println(carro2.Pasajeros); // 7
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 operación de asignación, las variables con referencia a objetos actúan diferente a como lo hacen
las variables de tipo simple, como int. Cuando se asigna una variable de tipo simple a otra, la situación
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 asignación de
carro1 a carro2 simplemente hace que carro2 se refiera al mismo objeto de carro1.
Vehiculo.java
class Vehiculo
{
int Pasajeros;
int CapacidadCombustible;
int ConsumoCombustible;
void rango()
{
System.out.println("El rango es: "+CapacidadCombustible*ConsumoCombustible);
}
}
Comentarios
• La línea:
void rango()
Declara un método de nombre rango sin parámetros. 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[])
{
minivan.Pasajeros=7;
minivan.CapacidadCombustible=16;
minivan.ConsumoCombustible=21;
CarroDeportivo.Pasajeros=2;
CarroDeportivo.CapacidadCombustible=4;
CarroDeportivo.ConsumoCombustible=12;
System.exit(0);
}
}
Comentarios
• La línea:
minivan.rango();
Invoca el método rango() de minivan. Es decir, llama al método rango() relativo al objeto minivan,
usando el nombre del objeto seguido por el operador de punto. Cuando un método es llamado, el control del
programa se transfiere al método; cuando el método termina, el control se transfiere a quien lo llama y se
reanuda la ejecución de la línea de código siguiente al llamado.
Clase8.java
class Clase8
{
public int a=15;
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:
Clase9.java
class Clase9
{
private int a=15;
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
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;
InterfazClase11.java
class InterfazClase11
{
public static void main(String args[])
{
int y,z;
Clase11 obj = new Clase11();
Métodos 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);
Salida:
Las clases a menudo proporcionan métodos 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 métodos establecer y obtener pero a menudo así sucede.
Como ejemplo de nomenclatura, un método para establecer la variable de instancia tasaInteres se
llamaría típicamente establecerTasaInteres, y un método para obtener la tasaDeInteres se llamaría
típicamente obtenerTasaInteres. Los métodos establecer también se conocen comúnmente como métodos
mutadores (set) (porque generalmente cambian un valor). Los métodos obtener también se conocen como
métodos de acceso (get) o (métodos de consulta).
Parece ser que propocionar herramientas para establecer y obtener es esencialmente lo mismo que
hacer que las variables de instancia públicas. Ésta es una sutileza de Java que hace del lenguaje algo tan
deseable para la ingeniería de software. Si una variable de instancia se declara como public, cualquier método
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 método obtener public eviden
temente parece permitir a otros métodos el acceso a la variable; sin embargo, el método 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
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);
Salida:
Sobrecarga de métodos
En Java, dos o más métodos, dentro de la misma clase, pueden compartir el mismo nombre, con la condición
de que sus declaraciones de parámetro sean diferentes. Cuando este sea el caso, se dice que los métodos son
sobrecargados y el proceso se refiere a sobrecarga de métodos. Un método sobrecargado es una de las
maneras cómo Java implementa el polimorfismo.
En general, para sobrecargar un método simplemente se declaran versiones diferentes de él, ya que el
compilador se encarga del resto. Se debe observar una restricción importante: el tipo y/o número de los
parámetros de cada método sobrecargado debe diferir. No es suficiente que dos métodos que difieran sólo en
sus tipos de retornos. (Los tipos de retornos en todos los casos no dan suficiente información para que Java
decida cuál método usar). El método sobrecargado puede también diferir en sus tipos de retornos. Cuando se
llama un método sobrecargado, se ejecuta la versión del método cuyos parámetros coincidan con los
argumentos.
DemoSobrecarga.java
class DemoSobrecarga
{
void Demo1()
{
System.out.println("Sin parámetros ");
}
void Demo1(int a)
{
System.out.println("Un parámetro: "+a);
}
int Demo1(int a, int b)
{
System.out.println("Dos parámetros :"+a+" "+b);
return a+b;
}
double Demo1(double a, double b)
{
System.out.println("Dos parámetros doubles : "+a+" "+b);
return a+b;
}
}
PruebaDemoSobrecarga.java
class PruebaDemoSobrecarga
{
public static void main(String args[])
Comentarios:
• El Método Demo1 es cuatro veces sobrecargado. La primera versión no lleva parámetros; la segunda
lleva un parámetro entero; la tercera, dos parámetros enteros y la cuarta, dos parámetros double. Se
observa que las dos primeras versiones de Demo1 no retornan un valor y las dos siguientes retornan
un valor. Esto es perfectamente válido, la sobrecarga no afecta de ninguna manera por el tipo de
retorno de un método.
La diferencia en los tipos de retorno es una diferencia insuficiente para los propósitos de la
sobrecarga.
Ejemplo 2. Los tipos de conversión automática pueden afectar la resolución de un método 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);
Salida:
Comentarios:
• En este ejemplo, sólo dos versiones de Método1() están definidas: una que tiene un parámetro int y
otra con un parámetro double. Sin embargo, es posible pasar Método1() a un valor byte, short o float.
En el caso de byte y short, Java automáticamente las convierte a int. De modo que Método1(int) es
invocada. En el caso de float, el valor se convierte a double y Método(double) es llamada.
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;
Salida:
Comentarios:
• Las conversiones automáticas se aplican sólo si no hay coincidencia directa entre un parámetro y un
argumento. El anterior programa se adiciona un método que especifica un parámetro byte. Puesto
que hay una versión de Método1 que tiene un argumento byte, cuando Método1 se llama con un
argumento byte, Método1(byte) se invoca y no ocurre la conversión automática a int.
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
Salida:
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 más 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.
Ejemplo:
ImpMetodosThis1.java
class ImpMetodosThis1
{
void f(int x)
{
System.out.println("dentro del método 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 sólo hay un método llamado f(). ¿Cómo puede este método saber si está siendo
invocado para el objeto a o b?.
Para permitir la escritura de código con una sintaxis adecuada orientada a objetos en la que “se envia
un mensaje a un objeto”, el compilador se encarga del código clandestino. Hay un primer parámetro secreto
que se pasa al método f(), y ese parámetro es la referencia al objeto que está siendo manipulado. Por tanto, las
dos llamadas a los métodos anteriores, se convierten en algo parecido a:
ImpMetodosThis1.f(a,10);
ImpMetodosThis1.f(b,10);
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:
DemoThis.java
class DemoThis
{
PruebaThis.java
class PruebaThis
{
public static void main(String args[])
{
DemoThis obj1=new DemoThis(10);
System.out.println(obj1.get());
}
}
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());
Ejemplo 2. Uso de this para diferenciar a las variables de instancia y los parámetros
DemoThis2.java
class DemoThis2
{
int x,y;
DemoThis2(int x, int y)
{
PruebaThis2.java
class PruebaThis2
{
public static void main(String args[])
{
DemoThis2 obj1=new DemoThis2(10,20);
System.out.println(obj1.get1()+" "+obj1.get2());
}
}
El control de acceso a miembros se consigue a través 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 código en el programa. Esto incluye métodos definidos dentro de otras
clases.
Cuando un miembro de una clase se especifica como private, se puede tener acceso a ese miembro
sólo mediante otro miembro de su misma clase. Así, métodos en otras clases no pueden acceder a miembros
private de otra clase.
Accesos.java
class Accesos
{
private int alfa; // acceso privado
public int beta; // acceso público
int gamma; // acceso por defecto es público
void setAlfa(int a)
{
class PruebaAccesos
{
public static void main(String args[])
{
Accesos obj1=new Accesos();
obj1.setAlfa(100);
System.out.println(obj1.getAlfa());
Comentarios:
• Como se puede ver en la clase Accesos, alfa se especifica como private, beta como public y gamma
pública por defecto. Como alfa es privada, no se puede tener acceso a ella mediante código fuera de
su clase. Por lo tanto, dentro de la clase PruebaAccesos, alfa no se puede usar directamente, se debe
tener acceso a través de sus métodos de acceso públicos: setAlfa() y getAlfa().
Aunque el acceso a alfa por un código fuera de Accesos no se permite, los métodos definidos dentro
de la clase Accesos pueden acceso libremente, como se puede apreciar con los métodos setAlfa() y getAlfa().
Conclusión: un miembro privado puede libremente ser usado por otros miembros de su clase, pero
no puede tener acceso a ella mediante un código fuera de su clase.
Cuando un miembro se declara static, se puede tener acceso a este antes de crear algunos objetos
de su clase y sin referencia a ningún objeto. Se puede declarar los métodos y las variables como static. El
ejemplo más común de un miembro static es main(). Este método se declara como static porque debe ser
llamado por el sistema operativo cuando inicia una aplicación 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 método static y un método normal consiste en que el método static puede ser
llamado mediante su nombre de clase, sin haber creado ningún objeto de esa clase. Como un ejemplo se tiene
el método sqrt(), que es un método static dentro de la clase estándar Math de Java.
Ejemplo 2.
MetodoEstatico.java
class MetodoEstatico
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:
class MetodoEstatico
{
static int valor = 100;
int d=2;
static int Dividir()
{
return valor/d;
}
}
Salida al compilar:
BloqueEstatico.java
class BloqueEstatico
{
static double raiz2;
static double raiz3;
// metodo constructor
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:
1. Se declara una clase como public. Si la clase no es public, sólo podrá ser utilizada por otras
clases dentro del mismo paquete.
2. Se elije el nombre del paquete y se agrega una declaración package al archivo de código fuente
para la declaración de la clase reutilizable. Sólo puede haber una declaración package en un
archivo de código fuente en Java, y ésta debe ir antes de cualquier otra declaración o instrucción
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 distribución estándar de Java.
Ejemplo 1.
EjemploPaquete.java
package paquetes;
public class EjemploPaquete
{
private int x;
private int y;
private int z;
public EjemploPaquete()
{
}
Compilación:
Dentro de esta carpeta se encuentra el archivo EjemploPaquete.class. Después se codifica la interfaz (la
clase que va a usar el paquete).
UsoEjemploPaquete.java
import paquetes.EjemploPaquete;
Esta clase se compila normalmente con javac, al ejecutarlo se obtiene la siguiente salida:
• Sólo las declaraciones package, las declaraciones import y los comentarios pueden aparecer fuera de
las llaves de la declaración de una clase.
• Un archivo de código fuente en Java tiene el siguiente orden: primero una declaración package (si la
hay), luego las declaraciones import (si las hay), y después las declaraciones de clase. Sólo una de
las declaraciones de clase en un archivo puede ser pública. Las demás clases en el archivo se colocan
también 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 convención 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 estación de trabajo para el nombre completo.
• Cuando se compila un archivo en Java que contiene una declaración package, el archivo de clase
resultante se coloca en la estructura de directorio especificado por la declaración package. Por
ejemplo la declaración 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 también directorios. Los nombres de directorio en la declaración package especifican
la ubicación 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 opción de línea de comandos (-d) hace que el compilador
javac cree los directorios apropiados, con base en la declaración package de la clase. Esta opción
también especifica en dónde crear (o ubicar) los directorios. Por ejemplo al ejecutar la sentencia de
compilación:
javac –d . Tiempo1
se creará una rama de directorios en donde existirá la clase Tiempo1 en el directorio progjava.
• Si no se utiliza la opción –d, entonces se deberá copiar o mover el archivo de clase al directorio del
paquete apropiado, después de compilarlo.
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 colisión 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 estándar de Java que se incluye con el J2SDK.
Después busca los paquetes adicionales. Java 2 cuenta con un mecanismo de extensión que
permite que se agreguen nuevos paquetes (opcionales) a Java para fines de desarrollo y
ejecución. Si la clase no se encuentra en la clase estándar de Java ni en las clases de extensión,
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 sólo del directorio actual. Sin embargo, la
ruta de clases puede modificarse de la siguiente manera:
Por otra parte se comenta acerca de las notaciones “oficiales” en diferentes plataformas:
Notaciones Plataforma
Pascal .NET Java
NombreMiembro Clases Clases
Métodos
Ejemplo: DemoClase Propiedades
Estructuras
Camello
nombreMiembro Atributos Métodos
Parámetros Atributos
Ejemplo: demoMetodo Parámetros
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);
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:
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)
{
PruebaFunciones.java
import mx.edu.instituto.lab1.est01.P02;
import mx.edu.instituto.lab1.est01.P03;
Arreglos
La tecnología Java tiene dos maneras de declarar arreglos
char vector1[];
Punto vector2[]; //donde Punto es una clase
O de esta forma
char [] vector1;
Punto [] vector2;
Después 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 dirección del nuevo objeto creado:
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");
}
Salida:
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 posición de los corchetes puede cambiar de posición antes o después 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
{
vector1[x++]=i;
System.out.println("vector1["+i+"]="+i);
}
int obtenerDatos()
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
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];
}
}
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]);
}
}
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);
}
}
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++)
}
}
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];
}
}
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[])
{
}
}
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();
}
Números 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
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
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]);
}
}
}
La relación “es un” representa a la herencia; en este tipo de relación, un objeto de una subclase
puede tratarse también como un objeto de sus superclases. Por ejemplo, un auto es un vehículo.
En contraste, la relación “tiene un” identifica a la composición; en este tipo de relación, un
objeto contiene una o más referencias a objetos como miembros. Por ejemplo, un auto tiene un volante
de dirección.
A menudo, un objeto de una clase “es un” objeto de otra clase también. Por ejemplo, en la
geometría un rectángulo es un cuadrilátero (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 rectángulo
es un tipo específico de cuadrilátero, pero es incorrecto decir que todo cuadrilátero es un rectángulo.
FiguraBidimensional FiguraTridimensional
Cada flecha (en UML la representación es con la punta de flecha vacía) en la jerarquía
representa una relación “es un”. Por ejemplo, se puede decir: Un Círculo “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 podría declararse en Java de la siguiente manera:
|Las relaciones de herencia forman estructuras jerárquicas en forma de árbol. Una superclase
existe en una relación jerárquica 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 común pueden tratarse como objetos de esa superclase (es decir, dichos objetos tienen una
relación “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 vehículos pero no todos los vehículos son
autos.
Un problema con la herencia es que una subclase puede heredar métodos que no necesita, o que
no debe tener. A pesar de que un método de superclase sea apropiado para una subclase, a menudo esa
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 métodos de una subclase no pueden tener acceso a los miembros private de su
superclase).
Los métodos de una subclase pueden referirise a los miembros public y protected que se hereden
de la superclase con sólo utilizar los nombres de los miembros. Cuando un método de la subclase
sobreescribe al método de la superclase, éste último puede utilizarse desde la subclase si se antepone a
su nombre la palabra clave super y un punto.
Empleado
public class Empleado {
public String nombre = “ “;
+nombre : String = “ “
public double salario;
+salario : double
public Date fechaCump;
+fechaCump : Date
public String obtenerDetalles()
{
+obtenerDetalles() : String
...
}
}
Como se observa se duplican los datos de las dos clases. Por lo tanto, una clase para minimizar
este “error” llamada sublclase
Administrador
public class Administrador extends Empleado {
+departamento : String public String departamento;
En los lenguajes orientados a objetos existen mecanismos especiales que permiten definir una
clase en términos de una definición de clase previa.
Java permite extender una sola clase a otra. Esta restricción 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.
+nombre : String = “ “
+salario : double
+fechaCump : Date
+obtenerDetalles() : String
Administrador
Ingeniero
+departamento : String Secretaria
Director
+adjudicarVehiculo : double
+incrementarConcesion()
Control de acceso
• Las variables y los métodos pueden tener cuatro niveles de acceso: public, protected, default
o private. Las clases pueden ser públicas o default.
• Una variable o método que está marcado como private es accesible únicamente por métodos
que son miembros de la misma clase como las variables y métodos private.
• Una variable, método o clase tiene una accesibilidad por default si no tiene un modificador
de protección explícito como parte de su declaración . Tal accesibilidad significa que el
acceso es permitido desde cualquier método en las clases que son miembros del mismo
paquete. Esto es frecuentemente llamado “package-friendly”.
• Un método o variable protected es accesible desde el método en las clases que son
miembros del mismo paquete y desde cualquier método en cualquier subclase.
• Una variable o método marcado con el modificador public es universalmente accesible.
Criterios de Accesibilidad
Métodos overriding
Ejemplos de herencia
Padre.java
class Padre
{
Padre()
{
System.out.println("Este es el constructor de la clase Padre");
}
Hijo.java
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");
}
Perro.java
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
PruebaPadreHijo2.java
class PruebaPadreHijo2
{
public static void main(String args[])
{
Hijo2 objHijo = new Hijo2();
}
}
Padre3.java
class Padre3
{
Padre3()
{
System.out.println("Este es el constructor de la clase Padre");
}
}
Hijo3.java
}
}
PruebaPadreHijo3.java
class PruebaPadreHijo3
{
public static void main(String args[])
{
Hijo3 objHijo = new Hijo3();
}
}
Salida:
Padre4.java
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
Salida:
SuperClase2.java
class SuperClase2
{
SuperClase2()
{
System.out.println("Constructor de la superclase");
}
String metodoSuper()
{
return "Metodo de la SuperClase";
}
}
SubClase2.java
PruebaSuperClase2.java
Empleado5.java
Empleado5(String n, double s)
{
establecerValores(n,s);
}
Administrador5.java
de:"+departamento;
}
}
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
Empleado6(String n, double s)
{
establecerValores(n,s);
}
Administrador6.java
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:
Salida:
public class A
{
A()
{
System.out.println("Dentro del constructor A");
}
}
B.java
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
Salida:
Herencia y Composición
Empleado7.java
Administrador7.java
Fecha2.java
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]);
Salida:
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:
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();
Salida:
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()
{
}
}
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();
}
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()
{
}
}
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();
}
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:
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");
}
}
System.out.println("\n");
// Marca error de tipos incompatibles
// CastingHijo obj = new CastingPadre();
System.out.println("objPadre=objHijo");
objPadre=objHijo;
objPadre.visualizarPadre();
objPadre.visualizar();
// Marca un error
//objPadre.visualizarHijo();
System.out.println("\n");
System.out.println("objPadre=(CastingPadre)objHijo");
objPadre=(CastingPadre)objHijo;
objPadre.visualizar();
System.out.println("\n");
}}
Salida:
Una compañía3 paga a sus empleados en forma semanal. La compañía tiene cuatro tipos de empleados:
• Empleados asalariados que reciben un salario semanal fijo, sin importar el número de horas
trabajadas.
• Empleados por horas, que reciben un sueldo por hora y pago por tiempo extra.
• Empleados por comisión, que reciben un porcentaje de sus ventas.
• Empleados asalariados por comisión, que reciben un salario base más un porcentaje de sus ventas.
Para este periodo de pago la compañía ha decidido compensara a los empleados asalariados por
comisión, agregando un 10% a sus salarios.
La compañía desea implementar una aplicación en Java que realice sus cálculos de nómina en forma
polimórfica.
3
Ejemplo tomado del libro de Deitel & Deitel pag. 408
EmpleadoBaseMasComision
Empleado.java
EmpleadoAsalariado.java
EmpleadoPorComision.java
EmpleadoPorHoras.java
EmpleadoBaseMasComision.java
PruebaSistemaNomina.java
import java.text.DecimalFormat;
import javax.swing.JOptionPane;
Salida:
se invoca el método getClass en el objeto para obtener la clase en tiempo de ejecución (objeto
Class) de ese objeto. Luego se invoca al método getName en el objeto devuelto por getClass, para
obtener el nombre de la clase.
Clases internas
Salida:
3. Manejo de excepciones
Definición: Una excepción es un evento que ocurre durante la ejecución del programa que interrumpe el flujo
normal de las sentencias.
Muchas clases de errores pueden utilizar excepciones desde serios problemas de hardware, como la avería de
un disco duro, a los simples errores de programación, como tratar de acceder a un elemento de un array fuera
Mediante el uso de excepciones para manejar errores, los programas Java tienen las siguientes ventajas frente
a las técnicas de manejo de errores tradicionales:
Por ejemplo, supongamos que tenemos una función que lee un archivo completo dentro de la
memoria. En pseudo-código, la función se podría parecer a esto:
leerArchivo{
abrir el archivo;
determinar su tamaño;
asignar suficiente memoria;
leer el archivo a la memoria;
cerrar el archivo;
}
A primera vista esta función 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 función, se tendría que añadir mucho código para la detección y
el manejo de errores. El aspecto final de la función se parecería 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;
}
Se observa en el código anterior que existe exagerados caminos para determinar y controlar los errores
Java proporciona una solución elegante al problema del tratamiento de rrores: las excepciones. Las
excepciones le permiten escribir el flujo principal de su código y tratar los casos excepcionales en otro lugar.
Si la función leerArchivo utilizara excepciones en lugar de las técnicas de
manejo de errores tradicionales se podría parecer a esto:
leerArchivo {
try {
abrir el archivo;
determinar su tamaño;
asignar suficiente memoria;
leer el archivo a la memoria;
cerrar el archivo;
} catch (falloAbrirArchivo) {
hacerAlgo;
} catch (falloDeterminacionTamaño) {
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. Además, el factor de aumento de código es de un 250% -- comparado
con el 400% del ejemplo anterior.
Una segunda ventaja de las excepciones es la posibilidad del propagar el error encontrado sobre la pila de
llamadas a métodos. Supongamos que el método leerArchivo es el cuarto método en una serie de llamadas a
métodos anidadas realizadas por un programa principal: metodo1 llama
a metodo2, que llama a metodo3, que finalmente llama a leerArchivo.
metodo1 {
Supongamos también que metodo1 es el único método interesado en el error que ocurre dentro de
leerArchivo. Tradicionalmente las técnicas de notificación del error forzarían a metodo2 y metodo3 a
propagar el código de error devuelto por leerArchivo sobre la pila de llamadas hasta que el código de error
llegue finalmente a metodo1 -- el único método
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 ejecución Java busca hacia atrás en la pila de llamadas para
encontrar cualquier método que esté interesado en manejar una excepción particular. Un método Java puede
"esquivar" cualquier excepción lanzada dentro de él, por lo tanto permite a los métodos que están por encima
de él en la pila de llamadas poder capturarlo. Sólo los métodos interesados en el error deben preocuparse de
detectarlo.
metodo1 {
try {
call metodo2;
} catch (excepcion) {
procesodelError;
}
}
metodo2 throws excepcion {
call metodo3;
}
Sin embargo, como se puede ver desde este pseudo-código, requiere cierto esfuerzo por parte de los métodos
centrales. Cualquier excepción verificada que pueda ser lanzada dentro de un método forma parte del
interface de programación público del método y debe ser especificado en la clausula throws del método. Así
el método informa a su llamador sobre las excepciones que puede lanzar, para que el llamador pueda decidir
consciente e inteligentemente qué hacer con esa excepción.
Se observa de nuevo la diferencia del factor de aumento de código y el factor de incertitumbre entre las dos
técnicas de manejo de errores. El código que utiliza excepciones es más compacto y más fácil de entender.
Frecuentemente las excepciones se dividen en categorías o grupos. Por ejemplo, podríamos imaginar un grupo
de excepciones, cada una de las cuales representara un tipo de error específico que pudiera ocurrir durante la
manipulación de un array: el índice está fuera del rango del tamaño 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. Además,
podemos imaginar que algunos métodos querrían manejar todas las excepciones de esa categoría (todas las
excepciones de array), y otros métodos podría manejar sólo algunas excepciones
específicas (como la excepción de índice no válido).
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 específico de excepción y cada clase 'nodo' (una clase con una o más subclases)
representa un grupo de excepciones relacionadas.
catch (InvalidIndexException e) {
...
}
ArrayException es una clase nodo y representa cualquier error que pueda ocurrir durante la manipulación de
un objeto array, incluyendo aquellos errores representados específicamente por una de sus subclases. Un
método puede capturar una excepción basada en este grupo o tipo general especificando cualquiera de las
superclases de la excepción en la sentencia catch. Por ejemplo, para capturar todas las excepciones de
array, sin importar sus tipos específicos, un manejador de excepción especificaría un argumento
ArrayException:
catch (ArrayException e) {
...
}
Este manejador podría capturar todas las excepciones de array, incluyendo InvalidIndexException,
ElementTypeException, y NoSuchElementException. Se puede descubrir el tipo de excepción preciso que ha
ocurrido comprobando el parámetro del manejador e.
Incluso podríamos seleccionar un manejador de excepciones que controlara cualquier excepción con este
manejador:
Los manejadores de excepciones que son demasiado generales, como el mostrado aquí, pueden hacer que el
código 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 excepción específico 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 ejecución 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:
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:
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");
}
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);
}
}}
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
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);
}
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:
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:
La AWT prove components básicos GUI que son usados en el diseño de applets y aplicaciones. Un
componente es un objeto que tiene una representación gráfica 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
verificación.
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 métodos requeridos por todos los componentes AWT.
Tal vez el más 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 más frecuentemente se usan.
Componentes GUI
Rl paquete java.awt
Este paquete contiene las clases que generan los componentes GUI. La siguiente figura muestra la
distribución de este paquete.
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 título y esquinas en donde se puede fácilmente rediseñar 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 programación
Java.
• Frames
• Panels
• Applets
• Dialogs
4.1 Frames
La clase Frame es una subclase de la clase Window. Es una ventana con un título y esquinas para redefinir el
tamaño. La clase Frame hereda sus características de la clase Container, de esta manera se pueden agregar
objetos con el método add.
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();
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:
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);
Después de que se crea un objeto Panel se debe agregar a un objeto Window o Framw, esto se hace usando el
método 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:
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();
}
}
4.3 Dialogs
Un componente Dialog esta asociado con un contenedor Frame. Es una ventana de libre posición 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 static void main(String args[])
{
DemoDialog demo = new DemoDialog("Demostracion del Frame1");
demo.ejecutar();
}
}
Salida:
DemoDialog2.java
}
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");
}
}
public static void main(String args[])
{
DemoDialog2 demo = new DemoDialog2("Demostracion del
Frame1");
demo.ejecutar();
}
}
Salida:
• FlowLayout
• BorderLayout
• GridLayout
• CardLayout
• GridBagLayout
El Administrador BorderLayout
Una disposisicón (arreglo) BorderLayout sitúa a los componetes dentro de áreas geográficas. 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;
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);
Salida:
DemoBorderLayout3.java
import java.awt.*;
public class DemoBorderLayout3
{
private Frame f;
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);
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();
}
}
La distribución 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 renglón y los componentes son
agregados a otro renglón. El efecto es idéntico 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 Panel p;
public DemoFlowLayout()
{
f = new Frame("Demo del FlowLayout");
p=new Panel();
}
p.setSize(100,100);
p.setBackground(Color.yellow);
p.setVisible(true);
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:
Una distribución de este tipo coloca los componentes en una tabla y cada componente ocupa una celda de
igual tamaño.
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));
f.pack();
f.setVisible(true);
}
public static void main(String args[])
{
DemoGrid demo=new DemoGrid("Demo de un GridLayout");
demo.ejecutar();
}
Salida:
• Los componente son agregados secuencialmente de izquierda a derecha, de arriba hacia abajo. Si el
número de componentes agregados es menor que el número de componentes designados en el
constructor para la clase GridLayout, el espacio reservado para estos componentes quedará vacante.
• Todos los componentes tienen el mismo tamaño.
• 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;
p1=new Panel();
p2=new Panel();
botonLimpiar=new Button("Clear");
botonSalir=new Button("Quit");
campo1=new TextField(40);
area1=new TextArea(5,40);
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;
p1=new Panel();
p2=new Panel();
p3=new Panel();
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:
ExamenGui.java
import java.awt.*;
private Frame f;
ExamenGui()
p1 = new Panel();
p2=new Panel();
p3=new Panel();
p4=new Panel();
void pegarObjetos()
p1.add(txt1);
p1.add(txt2);
p1.add(txt3);
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();
obj.pegarObjetos();
Salida:
5. Manejo de eventos
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" ) ;
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" ) ;
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 ) {}
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 ) ;
Salida:
Ejemplo 4
En este ejemplo se integran dos métodos a la clase para controlar el evento del Mouse y el de la ventana,
usando una implementación (herencia múltiple) y el this para activar los métodos
DemoEventos.java
import java.awt.* ;
import java.awt.event.* ;
public class DemoEventos implements ActionListener,WindowListener
{
Frame frame ;
Label etiqueta ;
Salida:
focusGained(FocusEvent)
Focus FocusListener
focusLost(FocusEvent)
Adjustment AdjustmentListener adjustmentValueChanged(Adjustment)
componentMoved(ComponentEvent)
componentHidden (ComponentEvent)
Component ComponentListener
componentResized(ComponentEvent)
componentShown(ComponentEvent)
windowClosing(WindowEvent)
windowOpened(WindowEvent)
windowIconified(WindowEvent)
Window WindowListener windowDeiconified(WindowEvent)
windowClosed(WindowEvent)
windowActivated(WindowEvent)
windowDeactivated(WindowEvent)
componentAdded(ContainerEvent)
Container ContainerListener
componentRemoved(ContainerEvent)
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 ;
}
import java.awt.* ;
import java.awt.event.* ;
public class DemoEventosMoverMouse {
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 ) ;
}
Salida:
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 métodos tanto los que se usan como los que no
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. }
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.
Ejemplo 6
DemoEventosMoverMouse2.java
import java.awt.* ;
import java.awt.event.* ;
public class DemoEventosMoverMouse2 {
public DemoEventosMoverMouse2()
{
frame = new Frame( "DualListenerDemo" ) ;
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
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;
}
}
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()
{
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:
EjerGui1.java
import java.awt.event.*;
import java.awt.*;
ManejadorEventos()
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;
System.exit( 0 ) ;
campo2.setText(campo1.getText());
if ( text.equals( bot1.getActionCommand() ) )
campo3.setText(bot1.getLabel());
else
if(text.equals( bot2.getActionCommand() ))
import java.awt.* ;
import java.awt.event.* ;
private Frame f;
EjerGui1()
txtCampo1=new TextField(10);
txtCampo2=new TextField(10);
txtCampo3=new TextField(10);
txtArea=new TextArea(3,30);
void visualizarGUI()
f.setLayout(new GridLayout(7,1));
f.add(et1);
f.add(txtCampo1);
f.add(et2);
f.add(txtCampo2);
f.add(et3);
f.add(txtCampo3);
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);
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() ;
}
Salida:
Los siguientes ejemplos están divididos en tres clases para implementar y modificar más rápido
Ejemplo
import java.awt.* ;
import java.awt.event.* ;
public class EventoBoton extends WindowAdapter implements ActionListener
{
if ( text.equals( bSalir.getActionCommand() ) )
System.exit( 0 ) ;
else
{
c++ ;
bContador.setLabel( "contador : " + c ) ;
}
}
import java.awt.* ;
import java.awt.event.* ;
class DemoBoton2
{
private Frame f ;
private Button botonContador ;
private Button botonSalir ;
private int contador ;
public DemoBoton2()
{
}
public void ejecutar()
{
EventoBoton objeto = new EventoBoton(botonSalir, botonContador);
botonContador.addActionListener( objeto ) ;
botonSalir.addActionListener( objeto ) ;
f.addWindowListener( objeto ) ;
class PruebaDemoBoton2
{
setBounds( int,int,int,int );
setBounds( Rectangle );
La posición y tamaño si se especifica en coordenadas absolutas, puede hacer más difícil la consecución de una
apariencia uniforme, en diferentes plataformas, del interfaz, según algunos autores; pero, a pesar de ello, es
interesante saber cómo se hace.
Hay dos versiones sobrecargadas de setBounds(). Una de ellas permite que tamaño y posición se indiquen a
través de cuatro enteros: ordenadas, abscisas, ancho y alto. La otra versión requiere que se utilice un objeto
Rectangle, que se pasa como parámetro al método. Esta última versión es más flexible, porque la clase
Rectangle tiene siete constructores diferentes que pueden ser utilizados para crear la caja que indicará la
posición y tamaño del componente.
Ejemplo
import java.awt.*;
}
void visualizar()
{
f.setLayout(null);
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:
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()
{
}
public void ejecutar()
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
{
switch (operador)
{
case '1':
t1.setText("boton 1");
break;
case '2':
t2.setText("boton 2");
break;
case '3':
t3.setText("boton 3");
break;
}
}
PruebaVariosBotones.java
class PruebaVariosBotones
{
Ejemplo 2
GuiVariosBotones2.java
import java.awt.* ;
import java.awt.event.* ;
class GuiVariosBotones2
{
private Frame f ;
private Button b1,b2,b3 ;
public GuiVariosBotones2()
{
}
public void ejecutar()
{
f.setLayout( new GridLayout( 6, 1 ) ) ;
EventosVariosBotones2 obj = new EventosVariosBotones2(b1,b2,b3,t1,t2,t3);
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
{
PruebaVariosBotones2.java
class PruebaVariosBotones2
{
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 ) ;
}
leer.addItemListener( procesar ) ;
pintar.addItemListener( procesar ) ;
correr.addItemListener( procesar ) ;
f.addWindowListener( procesar ) ;
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
{
System.exit( 0 ) ;
}
}
PruebaDemoCheckbox.java
class PruebaDemoCheckbox
{
public static void main( String [] args )
{
demo.ejecutar() ;
}
}
Salida:
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.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() ;
if ( etiqueta.equals( "Lunes" ) )
}
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() ) ;
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;
}
System.out.println( itemsSeleccionados[ i ] ) ;
System.out.println() ;
PruebaList.java
class PruebaList
{
public static void main( String [] args )
{
GuiList demo = new GuiList() ;
demo.ejecutar() ;
}
}
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 ) ;
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 ;
PruebaGuiText1.java
Salida:
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 ;
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;
PruebaGuiText2.java
class PruebaGuiText2
{
public static void main( String args [] )
{
GuiText2 demo = new GuiText2( "Demo 2 de textos" ) ;
demo.ejecutar() ;
}}
Salida:
Un canvas es un área rectangular vacia de la pantalla dentro de la cual una aplicación puede dibujar, desplegar
textos, banderizar imágenes 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;
public DemoCanvas()
{
f = new Frame( "Demo Canvas" ) ;
canvas= new SketchCanvas() ;
boton = new Button( "Limpiar" ) ;
}
/////////////////////////////////////////////////////
public SketchCanvas()
{
vector = new Vector() ;
setSize( 200, 200 ) ;
addMouseMotionListener( this ) ;
addMouseListener( this ) ;
}
Salida:
ScrollPane
DemoScrollPane.java
import java.awt.* ;
import java.awt.event.* ;
import java.awt.image.* ;
PruebaDemoScrollPane.java
DemoScrollPane demo =
demo.ejecutar() ;
}
}
Salida:
Dialogos
DemoVentanaDialogo.java
import java.awt.* ;
import java.awt.event.* ;
import java.io.* ;
PruebaDemoVentanaDialogo.java
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 ) ;
EventosDemoMenu1.java
import java.awt.* ;
import java.awt.event.* ;
public class EventosDemoMenu1 extends WindowAdapter implements ActionListener
{
private MenuItem llamar ;
PruebaDemoMenu1.java
demo.ejecutar() ;
}
}
Salida:
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 ) ;
}
}
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 ) ;
}
PruebaDemoColor.java
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 ;
nombreLista.addItemListener( obj ) ;
estiloLista.addItemListener( obj ) ;
tamanoLista.addItemListener( obj ) ;
nombreLista.select( fuenteIndex ) ;
estiloLista.select( estiloIndex ) ;
tamanoLista.select( tamanoIndex ) ;
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() ;
PruebaDemoFuente.java
Salida:
4
Resumen de los capítulos 13,14 del libro de Deitel & Deitel
Component
Container
JComponent
Una clase Container administra una colección 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 método que se origina en la clase Container es add, el cual se utiliza para adjuntar componentes
al panel de contenido (un objeto Container). Otro método 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 tamaño de sus componentes.
La clase Jcomponent es la superclase de la mayoría de los componentes de Swing. Esta clase declara
los atributos y comportamientos comunes de todas las subclases de Jcomponent.
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
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);
}}
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class EventosDemoCampo implements ActionListener
{
private JTextField campoTexto1, campoTexto2, campoTexto3;
private JPasswordField campoPassword;
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);
}
}
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");
botonSimple.addActionListener(obj);
botonElegante.addActionListener(obj);
contenedor.add(botonSimple);
botonElegante.setRolloverIcon(imagen2);
contenedor.add(botonElegante);
setSize(275,250);
setVisible(true);
}
}
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class EventosDemoBoton implements ActionListener
{
private JButton botonSimple, botonElegante;
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:
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");
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;
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:
DemoBotonOpcion.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public DemoBotonOpcion()
{
super( "Prueba de RadioButton" );
contenedor.add( campo );
contenedor.add( botonSimple );
contenedor.add( botonNegrita );
contenedor.add( botonCursiva );
contenedor.add( botonNegritaCursiva );
PruebaBotonOpcion.java
import javax.swing.*;
class PruebaBotonOpcion
{
public static void main( String args[] )
{
DemoBotonOpcion aplicacion = new DemoBotonOpcion();
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
}
Salida:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public DemoCuadroComb()
{
super( "Prueba de JComboBox" );
// establecer objeto JComboBox y registrar su manejador de eventos con una clase interna anónima
cuadroCombImagenes.addItemListener(new ItemListener()
{
public void itemStateChanged( ItemEvent evento )
{
// determinar si la casilla de verificación está
seleccionada
if ( evento.getStateChange() ==
ItemEvent.SELECTED )
etiqueta.setIcon(
iconos[cuadroCombImagenes.getSelectedIndex() ] );
}
contenedor.add( cuadroCombImagenes );
PruebaCuadroComb.java
import javax.swing.*;
class PruebaCuadroComb
{
public static void main( String args[] )
{
DemoCuadroComb aplicacion = new DemoCuadroComb();
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
}
Salida:
Ejemplo 1
DemoList.java
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
private final String nombresColores[] = { "Negro", "Azul", "Cyan", "Gris oscuro", "Gris", "Verde", "Gris
claro",
"Magenta", "Naranja", "Rosa", "Rojo", "Blanco",
"Amarillo" };
public DemoList()
{
super( "Prueba de JList" );
contenedor = getContentPane();
contenedor.setLayout( new FlowLayout() );
listaColores.addListSelectionListener(new ListSelectionListener()
{
public void valueChanged( ListSelectionEvent evento )
{
contenedor.setBackground(colores[
listaColores.getSelectedIndex() ] );
PruebaList.java
import javax.swing.*;
class PruebaList
{
public static void main( String args[] )
{
DemoList aplicacion = new DemoList();
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
}
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 selección múltiple" );
botonCopiar.addActionListener(new ActionListener()
{
public void actionPerformed( ActionEvent evento )
{
// colocar valores seleccionados en listaCopia
listaCopia.setListData(
listaColores.getSelectedValues() );
}
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 método setSelectionMode de JList esepcifica el modo de selección de la lista. La clase
ListSelectionModel (del paquete javax.swing) declara tres constantes que especifican el modo de
selección de un objeto JList:
o SINGLE_SELECTION permite seleccionar solamente un
elemento en un momento dado.
o SINGLE_SELECTION es para una lista de selección múltiple y
permite la selección de varios elementos contiguos
o MULTIPLE_INTERVAL_SELECTION es para una lista de
selección múltiple que no restringe el número de elementos que
pueden seleccionarse.
EventoMouse.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
PruebaEventosMouse.java
import javax.swing.*;
class PruebaEventosMouse
{
public static void main( String args[] )
{
EventosMouse aplicacion = new EventosMouse();
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
}
Salida:
DemoPintor.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
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();
}
}
PruebaPintor.java
import javax.swing.*;
class PruebaPintor
{
public static void main( String args[] )
Salida:
Comentarios
• Clases adaptadoras de eventos y las interfaces que implementan en el paquete java.awt.event
El programador puede extender la clase adaptadora para heredar la implementación predeterminada de cada
método y, por ende, sobrescribir el (los) método(s) necesario(s) para el manejo de eventos. La
implementación de cada método en la clase adaptadora tiene un cuerpo vacío.
• En este ejemplo se utiliza un arreglo de 1000 objetos java.awt.Point para almacenar la ubicación en
la que ocurre cada evento del arrastre del Mouse. Esto permite al método Saint dibujar un pequeño
óvalo en cada ubicación almacenada en el arreglo.
• Cuando se invoca un método utilizando sólo su nombre, en realidad se invoca mediante la referencia
this, indicando que ese método es llamado para la instancia actual de la clase en tiempo de ejecución.
• La línea:
se asegura que se almacenen lascoordenadas del evento solamente si hay elementos vacíos en el arreglo de ser
así la línea:
invoca al método 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 línea:
++cuentaPuntos;
Se incrementa la cuentaPuntos y después se hace una llamada a repaint para empezar a dibujar.
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. Demostración de los clics del mouse y de cómo se diferencian los botones del mouse
DetallesMouse.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
// establecer cadena barra título; registrar escucha ratón; ajustar tamaño y mostrar ventana
public DetallesMouse()
{
super( "Clics y botones del ratón" );
g.drawString( "Se hizo clic en: [" + xPos + ", " + yPos + "]", xPos, yPos );
}
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 métodos de la clase InputEvent, los cuales pueden diferenciar
entre los botones del mouse. Tal como lo describe la siguiente tabla:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
// configurar GUI
public DemoTeclas()
{
super( "Demostración de eventos de pulsación de tecla" );
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 métodos
keyPressed, keyReleased y keyTyped, cada uno de los cuales recibe un objeto KeyEvent como
argumento.
• La clase KeyEvent es una subclase de InputEvent.
• El método keyPressed es llamado en respuesta a la acción de oprimir cualquier tecla.
6.8. JTextArea
DemoAreaTexto.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
// configurar GUI
public DemoAreaTexto()
{
super( "Demostración de JTextArea" );
String cadena = "Ésta es una cadena de\ndemostración para\n ilustrar cómo 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 )
// establecer areaTexto2
areaTexto2 = new JTextArea( 10, 15 );
areaTexto2.setEditable( false );
cuadro.add( new JScrollPane( areaTexto2 ) );
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 método estático 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 políticas de barra de desplazamiento horizontal y vertical para el objeto
JscrollPane al momento de su creación. Si un programa tiene una referencia a un objeto JscrollPane,
el programa puede utilizar los métodos setHorizontalScrollBarPolicy y setVerticalScrollBarPolicy de
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 sólo 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.
import java.awt.*;
import javax.swing.*;
if ( figura == CIRCULO )
g.fillOval( 50, 10, 60, 60 );
else if ( figura == CUADRADO )
g.fillRect( 50, 10, 60, 60 );
}
PruebaPanelPersonalizado.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
// configurar GUI
public PruebaPanelPersonalizado()
{
super( "Prueba de PanelPersonalizado" );
// establecer botonCuadrado
botonCuadrado = new JButton( "Cuadrado" );
botonCuadrado.addActionListener(new ActionListener()
{
// dibujar un cuadrado
public void actionPerformed( ActionEvent evento )
{
miPanel.dibujar(
PanelPersonalizado.CUADRADO );
}
botonCirculo.addActionListener(new ActionListener()
{
// dibujar un círculo
public void actionPerformed( ActionEvent evento )
{
miPanel.dibujar( PanelPersonalizado.CIRCULO );
}
} // fin de la clase interna anónima
); // fin de la llamada a addActionListener
Salida:
6.10. Menús
La clase JMenuBar (una subclase de JComponent) contiene los métodos necesarios para dministrar
una barra de menús, la cual es un contenedor para los menús. La clase JMenu (una subclase de
javax.swing.JMenuItem) contiene los métodos necesarios para administrar menús. Los menús
contienen elementos de menú y pueden agregarsea barras de menús o a otros menús, como
submenús. 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 métodos 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 acción. Un elemento de menú
puede usarse para iniciar una acción, o puede ser un submenú que proporcione más elementos de
menú que el usuario pueda seleccionar.
La clase JCheckBoxItem (una subclase de javax.swing.JMenuItem), contiene los métodos necesarios
para administrar los elementos de menú que pueden activarse o desactivarse. Cuando se selecciona
un objeto JCheckBoxItem, aparece una marca de verificación a la izquierda del elemento de menú.
Cuando se selecciona de nuevo el mismo objeto, se quita la marca de verificación a la izquierda del
elemento de menú.
La clase JRadioButtonMenuItem (una subclase de javax.swing.JMenuItem) contiene los métodos
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, sólo puede seleccionarse un elemento en el grupo a la vez.
Cuando se selecciona otro objeto se quita el círculo relleno a la izquierda del elemento de menú
previamente seleccionado.
PruebaMenu.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
// configurar GUI
public PruebaMenu()
{
super( "Uso de objetos JMenu" );
// crear elementos de menú tipo botones de opción 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 );
}
menuTiposLetra.addSeparator();
getContentPane().setBackground( Color.CYAN );
getContentPane().add( pantallaEtiqueta, BorderLayout.CENTER );
repaint();
// clase interna para manejar eventos de los elementos de menú tipo casilla de verificación
private class ManejadorEstilo implements ItemListener
{
Comentarios:
Ejemplo
DemoContextual.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
// configurar GUI
public DemoContextual()
{
super( "Uso de objetos JPopupMenu" );
getContentPane().setBackground( Color.WHITE );
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 métodos mousePressed y mouseReleased comprueban el evento de desencadenamiento del menú
contextual. Cada método llama al método utilitario privado checkForTriggerEvent para determinar si
ocurrió el evento de desencadenamiento del menú contextual.
• El método isPopupTrigger de MouseEvent devuelve truesi ocurrió el evento de desencadenamiento
del menú contextual. De ser así, el método show de JpopMenu muestra el objeto JpopupMenu. El
primer argumento del método showespecifica el componente de origen, cuya posición ayuda a
determinar en dónde aparecerá el objeto Jpopupenu en la pantalla. Los últimos dos argumentos son
la coordenada x-y en donde debe aparecer el objeto JpopupMenu.
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 metálica). Swing también 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 metálica estándar, 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.*;
// configurar la GUI
public DemoAparienciaVisual()
{
super( "Demo de apariencia visual" );
PruebaAparienciaVisual.java
import javax.swing.*;
class PruebaAparienciaVisual
{
public static void main( String args[] )
{
DemoAparienciaVisual aplicacion = new DemoAparienciaVisual();
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
}
Salida:
• En la línea:
apariencias = UIManager.getInstalledLookAndFeels();
SwingUtilities.updateComponentTreeUI( this );
Muchas de las aplicaciones utilizan una interfaz de múltiples 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.*;
// configurar GUI
public DemoEscritorio()
{
super( "Uso de un objeto JDesktopPane" );
menuAgregar.add( nuevoMarco );
barra.add( menuAgregar );
setJMenuBar( barra );
// cargar imagen
public MiJPanel()
{
int numeroAleatorio = ( int ) ( Math.random() * 5 );
iconoImagen = new ImageIcon( imagenes[ numeroAleatorio ] );
}
// mostrar icono
iconoImagen.paintIcon( this, g, 0, 0 );
}
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:
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 línea:
getContentPane().add( elEscritorio );
• El constructor JinternalFrame requiere cinco argumentos: una cadena para la barra de título de la
ventana interna, un valor boolean para indicar si el usuario puede:
o reajustar el tamaño 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.*;
// configurar GUI
public DemoJTabbedPane()
{
super( "Demo de JTabbedPane " );
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 sólo 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 método addTab es una cadena que especifica el título 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.
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 métodos estáticos para crear un objeto Box con un esquema
BoxLayout horizontal o vertical.
DemoBoxLayout.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
// configurar GUI
public DemoBoxLayout()
{
super( "Demo de BoxLayout" );
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 línea:
vertical1.add( Box.createVerticalStrut( 25 ) );
• En la línea:
horizontal2.add( Box.createHorizontalGlue() );
• En la línea:
• En la línea:
panel.add( Box.createGlue() );
se agrega un componente pegamento al contenedor, mediante el método estático createGlue. Este componente
se expande o se contrae con base al tamaño del objeto Box.
Ejemplo 2 GridBagLayout
Este esquema es similar a GridLayout, ya que también ordena los componentes en una cuadrícula. Sin
embargo, es más flexible. Los componentes pueden variar en tamaño (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, después
dibuje una cuadrícula sobre la GUI, dividiendo los componentes en filas y columnas.
Ejemplo
DemoGridBag.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
// configurar GUI
public DemoGridBag()
{
super( "GridBagLayout" );
contenedor = getContentPane();
esquema = new GridBagLayout();
contenedor.setLayout( esquema );
// boton2
restricciones.weightx = 1000; // puede hacerse más ancho
restricciones.weighty = 1; // puede hacerse más largo
restricciones.fill = GridBagConstraints.BOTH;
agregarComponente( boton2, 1, 1, 1, 1 );
PruebaDemoGridBag.java
import javax.swing.*;
class PruebaDemoGridBag
{
public static void main( String args[] )
{
Salida:
Ejemplo 3 GridBagLayout
DemoGridBag2.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
// configurar GUI
public DemoGridBag2()
{
super( "GridBagLayout" );
contenedor = getContentPane();
esquema = new GridBagLayout();
contenedor.setLayout( esquema );
PruebaDemoGridBag2.java
Salida:
Comentarios:
• Hay una variación 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 penúltimo 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 penúltimo 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 conexión Cliente-Servidor implementado por el alumno: Juan
Carlos Cerón Guerrero de la carrera de Ingeniería en Sistemas
Proyecto 1
InterfazGraficaChat.java
EventosChat.java
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 ();
}
c.o.flush ();
}
}
}
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 ) ;
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;
}
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);
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);
EventosServidor.java
EventosServidor()
{
System.out.println("ip"+ cliente.getInetAddress());
System.out.println("nom cli"+ cliente.getInetAddress().getHostName());
System.out.println("Recibida la conexion de un cliente\n");
String msg;
while (true)
{ // Bucle infinito
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;
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");
}
InterfazGraficaCliente.java
import java.awt.*;
public class InterfazGraficaCliente
{
private Frame ventana;
private Panel panel1, panel2,panel3,panel4;
private MenuBar menuBar1;
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);
EventosCliente.java
EventosCliente()throws IOException
{
socket=new Socket ("192.10.1.32",4321);//Soket enlazado al servidor
lectura=new BufferedReader(new InputStreamReader (socket.getInputStream()));
}
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 BIBLIOGRAFÍA
• Java 2
Steven Holzner
Coriolis