Академический Документы
Профессиональный Документы
Культура Документы
FACULTAD DE INGENIERÍA
AUTORES:
1
Java Avanzado Programa de Tecnología en Cómputo
Java Avanzado
Excepciones:
Errores y excepciones
Excepciones básicas.
Tipos de flujo
Clase BufferedReader
Serialización de Objetos
2
Java Avanzado Programa de Tecnología en Cómputo
Interfaz Serialiazable
Clase Date
Clase Calendar
Clase GregorianCalendar
Threads en java
Prioridades
Método sleep()
Método yield()
3
Java Avanzado Programa de Tecnología en Cómputo
Interfaz Runnable
Componentes Swing
Direcciones IP y puertos
¿Qué es un socket?
4
Java Avanzado Programa de Tecnología en Cómputo
Excepciones:
Errores y excepciones
Así mismo hay errores que surgen en tiempo de ejecución, al igual que las
excepciones que solo ocurren en esta etapa de ejecución y la diferencia
entre ambos es que los errores en tiempo de ejecución son situaciones serias
que tienen que ver con situaciones extraordinarias al programa, como puede
ser un problema con la máquina virtual, la falta de memoria, la muerte
inesperada de un Thread, etc, y por lo mismo ya no es posible recuperar la
ejecución de programa.
Excepciones básicas.
Para Java, tanto los errores como las excepciones también son objetos que
descienden de la clase java.lang.Throwable, y dependiendo del tipo de
situación que ocurra, va a ser el tipo de error o excepción lanzada.
5
Java Avanzado Programa de Tecnología en Cómputo
System.out.println((String)x)
6
Java Avanzado Programa de Tecnología en Cómputo
Hay que señalar que puede haber varios bloques catch, tantos como
excepciones se requiera capturar y darles un tratamiento especial.
Por ejemplo
package excepciones;
/**
* Programa que divide dos números, sin emplear el manejo
* de excepciones
* @author PROTECO
*
*/
public class Calculadora1 {
7
Java Avanzado Programa de Tecnología en Cómputo
void printStackTrace() .
Imprime la excepción lanzada y su origen detallado en la
salida estándar de error.
void printStackTrace(PrintWriter s) .
Realiza lo mismo que el anterior, pero imprime
la salida en el PrintWriter especificado.
8
Java Avanzado Programa de Tecnología en Cómputo
throw Exception
Por ejemplo:
package excepciones;
/**
* Programa que divide dos números, manejando
* excepciones y validando que el denominador
* no sea cero
* @author PROTECO
*
*/
public class Calculadora3 {
9
Java Avanzado Programa de Tecnología en Cómputo
void causa(){
System.out.println("Carencia de producto");
}
}
package excepciones.maquina;
/**
* Esta clase define una excepción a partir del a
* excepción MáquinaException
* @author PROTECO
*
*/
class Incompleto extends MaquinaException{
public Incompleto(String mensaje){
super(mensaje);
}
/*
10
Java Avanzado Programa de Tecnología en Cómputo
11
Java Avanzado Programa de Tecnología en Cómputo
int l;
l = mac.seleccionaProducto(tempCod, tempDiner);
try {
mac.verificarExistencia(l);
} catch (FaltaProducto fP) {
System.out.println(fP.toString() + " Dinero devuelto ");
fP.causa();
}
}
}
12
Java Avanzado Programa de Tecnología en Cómputo
Podemos distinguir básicamente dos tipos de flujos: Los flujos de bytes, y los
flujos de caracteres.
El tratamiento del flujo de bytes viene gobernado por dos clases abstractas
que son InputStream y OutputStream. Cada una de estas clases abstractas
tienen varias subclases concretas que controlan las diferencias ente los
distintos dispositivos de I/O que se pueden utilizar. Así mismo, estas dos
clases son las que definen los métodos que sus subclases tendrán
implementados y, de entre todas, destacan las clases read() y write() que
leen y escriben bytes de datos respectivamente.
Este es un modo que Java nos proporciona para manejar caracteres pero al
nivel más bajo todas las operaciones de I/O son orientadas a byte.
13
Java Avanzado Programa de Tecnología en Cómputo
Para poder leer datos desde la entrada estándar es necesario primero revisar
un poco la clase System, la cual es conocida por el System.out.println, que
nos permite escribir una cadena de caracteres en la pantalla.
Tambien se puede observar que existen otros dos atributos además del
atributo out, dentro de la clase System, esto es el atributo err, que
representa la salida estandar de error, que es tambien un PrintStream y que
por lo tanto tiene el mismo comportamiento que el atributo out. Y además
está también el atributo in que nos representa la estrada estándar, esto es el
teclado.
14
Java Avanzado Programa de Tecnología en Cómputo
15
Java Avanzado Programa de Tecnología en Cómputo
/**
* Obtiene información de un archivo, y en caso de ser un directorio,
* lista el contenido del mismo y obtiene información de los archivos
* contenidos en el mismo
*
* @author Ricardo Castañeda / PROTECO
*/
public class EjemploFile {
File f;
public EjemploFile(String path) {
f=new File(path);
if(f.exists()){
System.out.println("\nNom bre del archivo: " + f.getName());
System.out.println("\tTamaño: " + f.length());
System.out.println("\tRuta absoluta: " + f.getAbsolutePath());
System.out.println("\tPuede leerse: " + f.canRead());
System.out.println("\tPuede editarse: " + f.canWrite());
System.out.println("\tEs archivo regular: " + f.isFile());
System.out.println("\tEs oculto: " + f.isHidden());
System.out.println("\tModificado por última vez: " + new Date(
f.lastModified()));
System.out.println("\tEs directorio: " + f.isDirectory());
if(f.isDirectory()){
System.out.println("\n- --------Contenido del directorio:
"+path+"- -------");
/*
*El método list() devuelve un arreglo con el contenido de un
*/directorio
String [] lista=f.list();
for(int i=0;i<lista.length;i++){
new EjemploFile(path+"\ \"+lista[i]);
}
}
}else{
System.out.println("El "+path+" archivo no existe");
}
}
public static void main(String[] args) {
EjemploFile ejemplofile = new EjemploFile(args[0]);
}
}
16
Java Avanzado Programa de Tecnología en Cómputo
En cuanto a la clase FileDescriptor, solo se dirá que los objetos de esta clase
son una estructuras que nos permite hacer referencia a un archivo abierto,
un socket, un pipe, o alguna otra fuente de bytes.
17
Java Avanzado Programa de Tecnología en Cómputo
Por último solo hay que imprimir las cadenas obtenidas en la salida estándar.
package io;
import java.io.*;
/**
* Lee el archivo especificado por la línea de comandos y abre un
* flujo a nivel de bytes, que posteriormente es convertido en un flujo
* de caracteres para poder ser impreso en pantalla
*/
public class LeeArchivo {
public static void main(String[] args) {
try{
File f=new File(args[0]);
FileInputStream fis=new FileInputStream(f);
InputStreamReader isr=new InputStreamReader(fis);
BufferedReader br=new BufferedReader(isr);
String linea;
while((linea=br.readLine())!=null){
System.out.println(linea);
}
br.close();
isr.close();
fis.close();
}catch(FileNotFoundException fnfe){
System.out.println("No fue posible encontrar el archivo:
"+args[0]);
}catch(IOException ioe){
System.out.println(ioe.getMessage());
}catch(IndexOutOfBoundsException ioobe){
System.out.println("USO: java LeeArchivo nombreArchivo");
}
}
}
18
Java Avanzado Programa de Tecnología en Cómputo
19
Java Avanzado Programa de Tecnología en Cómputo
}
Almacenar datos leídos desde el teclado en un archivo
Este ejemplo es una combinación del código que hace la lectura del teclado,
y del anterior, con la diferencia de que ahora el flujo de salida hacia el
archivo se trabajará a nivel de caracteres. Esto se logra mediante el uso de
la clase PrintStream, que por medio de su método println(), nos permite
escribir líneas de caracteres, que obtendremos mediante la lectura del
teclado.
package io;
import java.io.*;
/**
* Este programa leerá líneas desde el teclado
* y las guardará en el archivo especificado
* hasta que la línea solo tenga la palabra
* "adios"
* @author Ricardo J. Castañeda M. / PROTECO
*
*/
public class TecladoArchivo {
public static String leeTeclado() throws IOException{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
return br.readLine();
}
public static void main(String[] args){
String cadena;
File archivo;
FileOutputStream fos;
PrintStream ps;
try{
archivo=new File(args[0]);
/*
* Este flujo escribirá caracteres al final del
* archivo en vez de sobrescribir su contenido
*/
fos=new FileOutputStream(archivo, true);
/*
*Con este PrintStream se escribirán líneas de
*caracteres en el flujo de salida hacia el
*archivo
*/
ps=new PrintStream(fos);
do{
cadena=TecladoArchivo.leeTeclado();
ps.println(cadena);
}while(!cadena.equals("adios"));
fos.close();
ps.close();
}catch(IOException ioe){
System.out.println(ioe.getMessage());
}catch(Exception e){
System.out.println(e.getMessage());
}
20
Java Avanzado Programa de Tecnología en Cómputo
}
}
Serialización de objetos
Interfaz Serializable
21
Java Avanzado Programa de Tecnología en Cómputo
String carrera;
int semestre;
Date registro;
/*
* El estado de este atributo no se guardará debido al
* modificacor transient
*/
transient long milis;
22
Java Avanzado Programa de Tecnología en Cómputo
23
Java Avanzado Programa de Tecnología en Cómputo
24
Java Avanzado Programa de Tecnología en Cómputo
La clase Vector ofrece diversos métodos para poder manejar sus elementos.
Entre ellos se pueden listar los siguientes:
25
Java Avanzado Programa de Tecnología en Cómputo
void trimToSize() . Modifica la capacidad del Vector al tamaño actual del Vector.
/**
* Esta clase ejemplifica los métodos de la clase
* java.util.Vector
* @author Ricardo Castañeda M. / PROTECO
*
*/
public class MetodosVector {
/**
* Recorre el vector y manda a llamar a un
* metodo de la clase Alumno
* @param v Se le proporciona un vector de alumnos
*/
public static void recorreVector(Vector v){
Alumno tmp;
for(int i=0;i<v.size();i++){
System.out.println("\nElemento "+i);
/*
* Dado que el metodo get de la clase
* Vector regresa un elemento, se debe realizar
* un cast para especificar que tipo de objeto
* es el que regresa.
*/
tmp=(Alumno)v.get(i);
tmp.decirDatos();
}
}
/**
* Remueve los elementos cuyo indice sea un numero
* par
* @param v Se le proporciona un vector de alumnos
*/
26
Java Avanzado Programa de Tecnología en Cómputo
27
Java Avanzado Programa de Tecnología en Cómputo
vectorAlumnos.capacity());
System.out.println("Elementos del vector: "+vectorAlumnos.size());
MetodosVector.remuevePares(vectorAlumnos);
MetodosVector.recorreVector(vectorAlumnos);
System.out.println("\nCapacidad del vector: "+
vectorAlumnos.capacity());
System.out.println("Elementos del vector: "+vectorAlumnos.size());
/*
* Se aplica el metodo trimToSize para reducir la
* capacidad del vector a que sea igual al numero de
* elementos que contiene
*/
vectorAlumnos.trimToSize();
System.out.println("\nDespués de aplicar el método trimTosize()");
System.out.println("Capacidad del vector: "+
vectorAlumnos.capacity());
System.out.println("Elementos del vector: "+vectorAlumnos.size());
}
}
/**
* Servirá como clase auxiliar para el ejemplo del vector
* @author Ricardo Castañeda M. / PROTECO
*
*/
class Alumno{
private String nombre;
private String numCuenta;
private String carrera;
public Alumno(String nombre, String numCuenta,String carrera){
this.nombre=nombre;
this.numCuenta=numCuenta;
this.carrera=carrera;
}
public void decirDatos(){
System.out.println("\tMi nombre es: "+nombre);
System.out.println("\tMi numero de cuenta es: "+numCuenta);
System.out.println("\tMi carrera es: "+carrera);
}
}
Clase Date
La clase Date nos da la representación de una fecha y una hora, así mismo
proporciona métodos para el manejo de fechas y horas. Sin embargo debido
a que se basa en el formato de fecha americano, no permitía el uso de
28
Java Avanzado Programa de Tecnología en Cómputo
fechas de otros países. Por esta razón a partir del JDK1.1 se emplea la clase
abstracta Calendar, para proporcionar la internacionalización de fechas, por
lo cual la mayoría de métodos de la clase Date son obsoletos, con excepción
de los siguientes:
Clase Calendar
29
Java Avanzado Programa de Tecnología en Cómputo
• El atributo int AM_PM puede tomar dos valores: las constantes enteras
AM y PM
Los atributos de la clase Calendar pueden obtenerse por medio del método
int get(int field).
Ejemplo:
package util;
import java.util.*;
/**
* Esta clase ejemplifica el funcionamiento
30
Java Avanzado Programa de Tecnología en Cómputo
31
Java Avanzado Programa de Tecnología en Cómputo
32
Java Avanzado Programa de Tecnología en Cómputo
33
Java Avanzado Programa de Tecnología en Cómputo
}
}
Clase GregorianCalendar
34
Java Avanzado Programa de Tecnología en Cómputo
package util;
import java.util.StringTokenizer;
/**
* Comportamiento básico de la clase
* StringTokenizer
*
*/
public class TokenizerBasico {
public static void main(String[] args) {
/*
* Realiza el proceso de separación de tokens con la
* cadena proporcionada y el delimitador de campo
* predefinido que es el espacio en blanco
*/
StringTokenizer stnz=new StringTokenizer("Esta es una prueba");
/*
*El método hasMoreTokens() devuelve true si hay
*más tokens, y falso en caso contrario
*/
while(stnz.hasMoreTokens()){
/*
* El método nextToken() regresa una cadena
* correspondiente al siguiente token
*/
System.out.println(stnz.nextToken());
}
}
}
35
Java Avanzado Programa de Tecnología en Cómputo
package util;
import java.util.StringTokenizer;
/**
* Esta clase ejemplifica el uso de la clase
* StringTokenizer cuando se quiere separar una
* cadena con un delimitador específico
*/
public class TokenizerDelim {
public static void main(String[] args) {
String cadena="soy:un:hombre:muy:honrado";
/*
* Se crea un objeto StringTokenizer, cuyo delimitador
* de campo es ":"
*/
StringTokenizer stnz=new StringTokenizer(cadena,":");
/*
* Se crea un objeto StringTokenizer, cuyo delimitador
* de campo es ":", que además tomará al delimitador
* como otro token adicional
*/
StringTokenizer stnz2=new StringTokenizer(cadena,":",true);
while(stnz.hasMoreTokens())
System.out.print(stnz.nextToken()+" ");
System.out.println("\n");
while(stnz2.hasMoreTokens())
System.out.print(stnz2.nextToken()+" ");
}
}
Paquete java.util.zip
Para poder realizar la compresión hay que entender primero algunas clases
que nos permiten realizar esta operación. Para este caso se mencionarán las
clases que nos permiten crear un archivo de formato ZIP.
Clase ZipFile
Esta clase es usada para leer entradas desde un archivo ZIP que se
especifica a través de alguno de los métodos constructores de la clase, ya
sea como un objeto de la clase File, o bien a través de un String que indique
la ruta y nombre del archivo de interés.
36
Java Avanzado Programa de Tecnología en Cómputo
Enumeration entries() . Regresa una enumeración con las entradas del archivo
ZIP
Clase ZipEntry
Esta clase es usada para representar una entrada en un archivo ZIP. Para
instanciar esta clase podemos utilizar el siguiente constructor, que creará
una entrada en el archivo ZIP con el nombre especificado.
Esta clase tiene métodos que nos permiten obtener y fijar información del
archivo comprimido que representa la entrada, por ejemplo:
37
Java Avanzado Programa de Tecnología en Cómputo
long getTime() .
Devuelve la fecha de la última modificación del archivo,
expresada en milisegundos.
Clase ZipOutputStream
Para controlar este tipo de flujo, esta clase tiene los siguientes métodos,
propios, además de los heredados de la clase OutputStream.
void putNextEntry(ZipEntry e) .
Comienza escribir una nueva entrada del archivo
ZIP y posiciona el flujo para iniciar la entrada de datos.
void closeEntry() .
Cierra la entrada actual y posiciona el flujo para escribir la
siguiente entrada.
void finish() .
Termina de escribir el contenido en el flujo de salida del archivo
ZIP sin cerrar el flujo sobre el que se contruyó
Clase ZipInputStream
Esta clase implementa un flujo de entrada para leer archivos en formato ZIP.
Incluye soporte para entradas comprimidas y descomprimidas. De manera
38
Java Avanzado Programa de Tecnología en Cómputo
Entre los métodos que podemos mencionar de esta clase se encuentran los
siguientes:
ZipEntry getNextEntry() .
Lee la siguiente entrada del archivo ZIP y posiciona el
flujo al comienzo de la entrada de datos.
void closeEntry() .
Cierra la entrada actual y posiciona el flujo para que lea la
siguiente entrada.
int available() .
Regresa 0 después de que el final del archivo (EOF) ha sido
alcanzado por la entrada de datos actual, si no siempre regresa 1.
Unas clases importantes del paquete son Adler32 y CRC32, estas clases
implementan la interface java.util.zip.Checksum y calculan la suma de
comprobación requerida para la compresión de datos. El algoritmo Adler32
se conoce por ser mas rápido que el CRC32, y éste ultimo es conocido por
ser más confiable.
Clase CheckedInputStream
39
Java Avanzado Programa de Tecnología en Cómputo
Clase CheckedOutputStream
import java.io.*;
import java.util.zip.*;
/**
* Un ejemplo de almacenamiento con ZIP
* Utiliza la compreción de tipo ZIP para
* comprimir y empaquetar cualquier número
* de archivos indicados por la línea de
* comandos
*/
public class ComprimeZip{
/*
* Las excepciones serán lanzadas a consola
*/
public static void main(String[] args) throws IOException{
/*
* El archivo se llamará prueba.zip, y a partir de
* ello se construye un FileOutputStream
*/
FileOutputStream f= new FileOutputStream(new File("prueba.zip"));
40
Java Avanzado Programa de Tecnología en Cómputo
/*
* Se construye un CheckedOutputStream a partir del
* FileOutputStream y se elije el algoritmo CRC32
* para tener una suma de comprobación
*/
CheckedOutputStream csum= new CheckedOutputStream(f,new CRC32());
/*
* A partir del CheckedOutputStream se crea un
* ZipOutputStream que será el flujo encargado de
* la compresión de los archivos y agregarlos como
* entradas al archivo ZIP
*/
ZipOutputStream salida= new ZipOutputStream(csum);
/*
* Se agrega un comentario al archivo
*/
salida.setComment("Una prueba de compresión Zip con java");
for(int i=0;i<args.length;i++){
System.out.println("Escribiendo el archivo "+args[i]);
/*
* Se leen cada uno de los archivos como un
* flujo de en modo de bytes para asi poder
* comprimir cualquier tipo de archivo
*/
FileInputStream entrada=new FileInputStream(args[i]);
/*
* Se crea una nueva entrada por cada archivo.
*/
salida.putNextEntry(new ZipEntry(args[i]));
int c;
while((c=entrada.read())!=-1)
salida.write(c);
salida.closeEntry();
entrada.close();
}
salida.close();
/*
* suma de comprobacón válida unicamente cerrado el archivo
*/
System.out.println("Suma de comprobacion..."
+csum.getChecksum().getValue());
}
}
41
Java Avanzado Programa de Tecnología en Cómputo
Listo. El hilo esta preparado para entrar en ejecución pero el planificador aun
no ha decidido su puesta en marcha
42
Java Avanzado Programa de Tecnología en Cómputo
De todos los métodos que se pueden observar los que no deben utilizarse
por estar considerados como obsoletos son stop() , suspend() y resume() .Su
funcionalidad se ha sustituido por otros métodos.
43
Java Avanzado Programa de Tecnología en Cómputo
package threads;
/**
* Ejemplo básico de creación de multihilos
* @author PROTECO
*
*/
public class HeredandoThread extends Thread {
/*
* Se sobrescribe este método para definir el código
* a realizarse cuando se ejecute en Thread
*/
public void run(){
System.out.println("Esta es una instancia de nuestra clase: "
+getName());
}
public static void main(String[] args) {
/*
* Se crean dos objetos de la clase HeredandoThread
*/
HeredandoThread ht1=new HeredandoThread();
HeredandoThread ht2=new HeredandoThread();
/*
* Se inicia la ejecución de los hilos con el
* método start()
*/
ht1.start();
ht2.start();
System.out.println("Hilo principal: "
+Thread.currentThread().getName());
}
}
44
Java Avanzado Programa de Tecnología en Cómputo
45
Java Avanzado Programa de Tecnología en Cómputo
ht1.setName("Hilo A");
ht2.setName("Hilo B");
Esto se debe a que los hilos tienen prioridades que van en número del 1 al
10 donde 0 es lo más bajo y 10 es lo más alto, o bien definidos por las
constantes enteras MAX_PRIORITY, MIN_PRIORITY y NORM_PRIORITY, de la clase
Thread. Como se pude observar en el código anterior, la prioridad de los tres
hilos es 5 que corresponde a NORM_PRIORITY, que es la prioridad predefinida.
Cuando dos o más hilos tienen la misma prioridad, influye el órden en que
cada uno empezó a ejecutarse. Si lo vemos de esta manera el hilo principal
fue el primero en ejecutarse y por lo tanto tiene prioridad sobre los otros dos,
por esa razón imprime sus datos antes que los hilos que se ejecutaron
después. Sabiendo esto modifiquemos el código para modificar la prioridad
del hilo principal.
package threads;
/**
* Esta clase ejemplifica como manipular la
* ejecución de los hilos modificando prioridades
* @author Ricardo Castañeda M. / PROTECO
*
*/
public class HeredandoThreadP extends Thread {
public HeredandoThreadP(String nombre){
super(nombre);
}
public void run(){
System.out.println("Esta es una instancia de nuestra clase: "
+getName()+"prioridad: "+getPriority());
46
Java Avanzado Programa de Tecnología en Cómputo
Nótese como al disminuir la prioridad del hilo principal, ahora los otros dos
hilos pueden ejecutarse primero y por lo tanto imprimir sus datos antes que
el hilo principal.
Método sleep()
Otra manera de hacer que el hilo principal permita que los otros dos hilos
ejecuten su código es durmiendo el hilo principal un tiempo con el método
sleep() .
package threads;
/**
* Esta clase ejemplifica como manipular la
* ejecución de los hilos con el método sleep()
* @author Ricardo Castañeda M. / PROTECO
*
*/
public class HeredandoThreadS extends Thread {
public HeredandoThreadS(String nombre){
super(nombre);
}
public void run(){
System.out.println("Esta es una instancia de nuestra clase: "
+getName()+" prioridad: "+getPriority());
}
47
Java Avanzado Programa de Tecnología en Cómputo
Thread.currentThread().setName("Hilo principal");
System.out.println("Hilo principal: "
+Thread.currentThread().getName()
+" prioridad: "+Thread.currentThread().getPriority());
}
}
Método yield().
Thread.currentThread().setName("Hilo principal");
System.out.println("Hilo principal: "
+Thread.currentThread().getName()
+" prioridad: "+Thread.currentThread().getPriority());
}
}
48
Java Avanzado Programa de Tecnología en Cómputo
El método yield() causa que el hilo actual haga una pausa momentáneamente
para permitir que otros hilos continúen con su ejecución.
void wait() .
Hace que un hilo haga una pausa en su ejecución hasta que algún
otro hilo le notifique que puede continuar
void notify() . Notifica a otro hilo en espera que puede continuar con su
ejecución.
void notifyAll() . Notifica a todos los hilos en espera que pueden continuar con
su ejecución.
49
Java Avanzado Programa de Tecnología en Cómputo
}
/**
* Esta clase se ejecutará en hilo propio
*
* @author PROTECO
*
*/
class Segundo extends Thread {
private int segundos = 0;
if (segundos == 59) {
/*
* Notifica a minuto que puede
* continuar ejecutándose
*/
minutoTic.tic();
segundos = 0;
} else
segundos++;
System.out.println(segundos);
}
}
50
Java Avanzado Programa de Tecnología en Cómputo
51
Java Avanzado Programa de Tecnología en Cómputo
que está en espera a que Segundo llegue al 59 para poder continuar con su
ejecución, y además el objeto de la clase TicToc es el que hace posible la
sincronización entre ambos mediante los métodos sincronizados esperarTic() y
tic() .
La interfaz Runnable
Hasta ahora hemos descrito que para crear hilos hay que implementar la
interfaz Runnable, pero aun no hemos creado hilos. Volvamos a la clase
Thread y veamos el siguiente constructor.
package threads;
/**
* Ejemplo de creación de hilos a partir de la interfaz
* Runnable
* @author Ricardo Castañeda M. / PROTECO
52
Java Avanzado Programa de Tecnología en Cómputo
*
*/
public class ImplementandoRunnable implements Runnable{
static int hilosCreados=0;
53
Java Avanzado Programa de Tecnología en Cómputo
54
Java Avanzado Programa de Tecnología en Cómputo
Clase JFrame
package gui;
import javax.swing.JFrame;
/**
* Este ejemplo muestra como crear una
* GUI básica a partir de la clase
* JFrame de swing
*
* @author PROTECO
*
*/
/*
* Se hereda de la clase JFrame para
* aprovechar sus características
*/
public class FrameBasico extends JFrame {
public FrameBasico(String title){
/*
* Se llama al constructor de la
* clase padre que recibe un String
* que será el título del JFrame, pero
* además el JFrame obtenido no será
* visible
*/
super(title);
/*
* setVisible() es un método heredado de
* la clase Component, por lo que se puede
* utilizar de la misma manera para cualquier
* clase heredada de Component y que nos va
* a permitir ocultar o mostrar el componente
*/
setVisible(true);
55
Java Avanzado Programa de Tecnología en Cómputo
/*
* Ocurre lo mismo para setSize() definido en
* la clase Component y cuya utilidad es definir
* el tamaño inicial con que se mostratá el
* componente
*/
setSize(300,200);
}
public static void main(String args[]){
new FrameBasico("Mi primera GUI");
}
}
package gui;
import java.awt.Image;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import java.awt.Color;
/**
* Esta clase ejemplifica algunos métodos que
* nos permiten tener un JFrame un poco más
* elaborado
* @author Ricardo Castañeda M. / PROTECO
*
*/
public class FrameBasico2 extends JFrame{
56
Java Avanzado Programa de Tecnología en Cómputo
57
Java Avanzado Programa de Tecnología en Cómputo
this.setIconImage(icono);
}catch(Exception e){
System.out.println(e.getMessage());
}
}
public static void main(String[] args) {
new FrameBasico2("JFrame corregido y aumentado");
}
}
Otras clases utilizadas en este ejemplo tienen que ver con el manejo de
imágenes. Veamos primero la clase Image, definida también en java.awt.
58
Java Avanzado Programa de Tecnología en Cómputo
nuevo icono del JFrame, por lo cual utilizamos una clase llamada ImageIO,
que es parte del paquete javax.imageio que nos permite controlar
operaciones de entrada y salida de imágenes, y que en este caso mediante
su método estático read(File f) , nos permite tener un objeto Image a partir de
un archivo.
• FlowLayout
• BorderLayout
• GridLayout
• GridBagLayout
• CardLayout
• BoxLayout
FlowLayout y JPanel
ComponentOrientation.LEFT_TO_RIGTH
ComponentOrientation.RIGTH_TO_LEFT
package gui;
import javax.swing.*;
/**
* Muestra el comportamiento del
* FlowLayout, que no se especifica en
* este ejemplo por que es el LayoutManager
* predefinido
* @author PROTECO
*
*/
public class Flow extends JFrame {
59
Java Avanzado Programa de Tecnología en Cómputo
/*
* La clase JPanel representa al
* contenedor genérico, y nos permite
* agrupar varios elementos. Además
* el JPanel puede ser agregado a otro
* contenedor
*/
JPanel jpnl;
public Flow(String arg0){
super(arg0);
jpnl=new JPanel();
for(int i=1;i<=5;i++)
/*
* Se agregan elementos al
* contenedor por medio del
* método add()
*/
/*
* Se obtiene el panel contenedor del
* JFrame para poder agregarle nuestro
* JPanel
*/
jpnl.add(new JButton("Boton"+i));
this.getContentPane().add(jpnl);
setSize(300,200);
setVisible(true);
}
public static void main(String[] args) {
new Flow("FlowLayout");
}
}
BorderLayout
60
Java Avanzado Programa de Tecnología en Cómputo
BorderLayout.NORTH
BorderLayout.SOUTH
BorderLayout.EAST
BorderLayout..WEST
BorderLayout.CENTER
61
Java Avanzado Programa de Tecnología en Cómputo
this.getContentPane().add(jpnl);
setSize(300,200);
setVisible(true);
}
public static void main(String[] args) {
new Border("BorderLayout");
}
}
GridLayout
Este layout manager ocupa como modelo una matriz de nxm, en cuyas
celdas se acomodan los elementos de manera secuencial. El contenedor es
dividido en celdas del mismo tamaño, y un componente es agregado en cada
celda.
package gui;
import java.awt.GridLayout;
import javax.swing.*;
/**
* Muestra el comportamiento del
* BorderLayout
* @author PROTECO
*
*/
public class Grid extends JFrame {
JPanel jpnl;
GridLayout gl;
public Grid(String arg0){
super(arg0);
jpnl=new JPanel();
/*
* Se define un GridLayout de
* 3 renglones y 5 columnas
*/
gl=new GridLayout(3,5);
/*
* Ahora se define el LayoutManager
* con el método setLayout(),
*/
jpnl.setLayout(gl);
/*
* Se obtiene el número de columnas
* y de renglones para determinar el
* número de elementos dinámicamente,
* utilizando los métodos getColumns()
62
Java Avanzado Programa de Tecnología en Cómputo
Componentes Swing
JButton
63
Java Avanzado Programa de Tecnología en Cómputo
import java.awt.*;
import javax.swing.*;
/**
* Esta clase muestra la creación y
* personalización de JButtons
* @author Ricardo Castañeda M. / PROTECO
*
*/
public class Button extends JFrame {
JPanel jpnl;
JButton btn1;
JButton btn2;
JButton btn3;
/*
* Se agrega el panel al
* JFrame
*/
getContentPane().add(jpnl);
setVisible(true);
setSize(300,200);
64
Java Avanzado Programa de Tecnología en Cómputo
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
/**
* @return Un boton de colores personalizados
*/
public JButton getBtn1(){
if(btn1==null){
btn1=new JButton("btn1");
/*
* Se utilizan los métodos setBackground
* y setForeground definidos en la clase
* JContainer
*/
btn1.setBackground(Color.BLUE);
btn1.setForeground(Color.GREEN);
}
return btn1;
}
/**
* @return Un boton deshabilitado
*/
public JButton getBtn2(){
if(btn2==null){
btn2=new JButton("btn2");
/*
* Para deshabilitar el boton se utiliza
* el método setEnable(boolean b), de la
* clase AbstractButton
*/
btn2.setEnabled(false);
}
return btn2;
}
/**
*
* @return Un boton con un icono
*/
public JButton getBtn3(){
if(btn3==null){
/*
* Utilizamos en constructor que nos
* proporciona un boton sin etiqueta
*/
btn3=new JButton();
try{
/*
* Creamos un objeto ImageIcon, a partir
* del nombre del archivo.
* La clase ImageIcon implementa la interface
* Icon, y que por polimorfismo es válido
* utilizarlo como Icon
*/
ImageIcon icon=new ImageIcon("proteco.jpg");
/*
* Este método se utiliza para colocar un
* icono en el boton
65
Java Avanzado Programa de Tecnología en Cómputo
*/
btn3.setIcon(icon);
}catch(Exception e){
System.out.println(e.getMessage());
}
btn3.setBackground(Color.WHITE);
}
return btn3;
}
public static void main(String[] args) {
new Button("JButton");
}
}
JLabel
Representa un área para mostrar una cadena de texto pequeñ, una imágen o
ambos. Las etiquetas no reaccionan a los eventos de entrada, como
resultado no pueden tener el foco del teclado.Veamos los constructores de
esta clase y un ejemplo.
package gui;
import javax.swing.*;
import java.awt.GridLayout;
/**
* Ejemplo JLabel
* @author Ricardo Castañeda M / PROTECO
*
*/
public class Label extends JFrame {
JPanel jpnl;
JLabel jlbl1;
JLabel jlbl2;
ImageIcon icon;
public Label(String title){
super(title);
icon=new ImageIcon("proteco.jpg");
jpnl=new JPanel(new GridLayout(3,1));
/*
66
Java Avanzado Programa de Tecnología en Cómputo
}
}
JTextField
Los constructores de esta clase son los siguientes, además del predefinido
que nos construye un JTextField sin ningún texto predeterminado.
Los principales métodos de esta clase son los que nos permiten trabajar con
el texto que contiene, o bien que podemos agregar a un componente de este
tipo, que también están definidos en la clase JTextComponent y son:
67
Java Avanzado Programa de Tecnología en Cómputo
void copy() .
Transfiere el rango seleccionado actual en el modelo de texto
asociado, al portapapeles del sistema, dejando el contenido del modelo de
texto.
void cut() .
Transfiere el rango seleccionado actual en el modelo de texto
asociado, al portapapeles del sistema, removiendo el contenido del modelo
de texto.
void paste() .
Transfiere el contenido del portapapeles del sistema al modelo de
texto asociado.
Interface ActionListener
68
Java Avanzado Programa de Tecnología en Cómputo
/*
* Se declaran los componentes del panel
* como private
*/
private JLabel jLblTelefono = null;
private JTextField jTFNombre = null;
private JLabel jLblNombre = null;
private JTextField jTFDireccion = null;
private JLabel jLblDireccion = null;
private JTextField jTFTelefono = null;
private JButton jBtnEnviar = null;
private JButton jBtnLimpiar = null;
/*
* El constructor llama al constructor
* de la clase padre y llama al método
* initializa(), que define las condiciones
* iniciales de los componentes
*/
public Forma() {
super();
initialize();
}
/**
* This method initializes this
*
* @return void
*/
private void initialize() {
jLblDireccion = new JLabel();
jLblDireccion.setText("Direccion");
jLblNombre = new JLabel();
jLblNombre.setText("Nombre");
jLblTelefono = new JLabel();
jLblTelefono.setText("Telefono");
this.setSize(300, 200);
this.setLayout(new GridLayout(4,2));
this.setVisible(true);
this.add(jLblNombre);
this.add(getJTFNombre());
this.add(jLblDireccion);
this.add(getJTFDireccion());
this.add(jLblTelefono);
this.add(getJTFTelefono());
this.add(getJBtnEnviar(), getJBtnEnviar().getName());
this.add(getJBtnLimpiar(), null);
}
69
Java Avanzado Programa de Tecnología en Cómputo
/*
* Se definen métodos get() que no serviran
* para obtener los componentes encapsulados
* e incializarlos en caso de que no haya sido.
*/
public JTextField getJTFDireccion() {
if (jTFDireccion == null) {
jTFDireccion = new JTextField();
}
return jTFDireccion;
}
/**
* Este metodo limpia los JTextField
*
*/
public void reset(){
/*
* Con el método setText podemos definir
* el texto que llevarán los Componentes
* como los JLabels y los JTextField
*/
this.jTFDireccion.setText("");
this.jTFNombre.setText("");
70
Java Avanzado Programa de Tecnología en Cómputo
this.jTFTelefono.setText("");
}
/*
* Este se declara en la interfaz ActionListener
* pero se define en esta clase para que escuche
* eventos.
*/
public void actionPerformed(ActionEvent e) {
if(e.getSource()==this.jBtnLimpiar)
this.reset();
if(e.getSource()==this.jBtnEnviar){
System.out.println("Nombre: "+jTFNombre.getText());
System.out.println("Nombre: "+jTFDireccion.getText());
System.out.println("Nombre: "+jTFTelefono.getText());
}
}
public static void main(String[] args) {
/*
* Se crea un objeto JFrame que servirá
* de contenedor de nuestro JPanel
*/
JFrame test=new JFrame("JPanel Forma");
Forma forma=new Forma();
test.getContentPane().add(forma);
test.setVisible(true);
test.setSize(300,200);
}
}
JTextArea y JScrollPane
Estas dos clases usualmente se utilizan juntas, por lo que las estudiaremos
de igual forma. La clase JTextArea representa un area multilíneas que
despliega texto plano y de manera análoga a la clase JTextField, desciende
de la clase JTextComponent, y por lo tanto los métodos vistos en la clase
JTextField son válidos tambien para esta clase.
71
Java Avanzado Programa de Tecnología en Cómputo
/**
* Esta clase es un panel con elementos
* de un formulario
* @author Ricardo Castañeda M / PROTECO
*
*/
public class Forma2 extends JPanel implements ActionListener{
...
72
Java Avanzado Programa de Tecnología en Cómputo
/*
* En este metodo regresa nuestra JTextArea y la inicializa
* en caso de necesitarse
*/
public JTextArea getJTxtAObservaciones() {
if (jTxtAObservaciones == null) {
jTxtAObservaciones = new JTextArea();
}
return jTxtAObservaciones;
}
73
Java Avanzado Programa de Tecnología en Cómputo
...
}
JComboBox
/**
* Esta clase es un panel con elementos
* de un formulario.
* Se intorducen elementos de la clase
* JComboBox
* @author Ricardo Castañeda M / PROTECO
*
*/
public class Forma3 extends JPanel implements ActionListener{
...
/*
74
Java Avanzado Programa de Tecnología en Cómputo
75
Java Avanzado Programa de Tecnología en Cómputo
/*
* Ocurre lo mismo si el pais es
* Estados Unidos o Canada
*/
}else if(pais.equals("Estados Unidos")){
jCmbBxCiudad.addItem("Atlanta");
jCmbBxCiudad.addItem("Miami");
jCmbBxCiudad.addItem("Las Vegas");
}else if(pais.equals("Canada")){
jCmbBxCiudad.addItem("Montreal");
jCmbBxCiudad.addItem("Ottawa");
jCmbBxCiudad.addItem("Toronto");
}else{
jCmbBxCiudad.addItem("Seleccione el pais");
}
}
...
/*
* Se definen los métodos get para los JComboBox para
* obtenerlos, o inicializarlos y obtenerelos si fuera
* el caso
*/
private JComboBox getJCmbBxPais() {
if (jCmbBxPais == null) {
jCmbBxPais = new JComboBox();
/*
* Se agregan 3 elementos al
* JComboBox
*/
jCmbBxPais.addItem("Mexico");
jCmbBxPais.addItem("Estados Unidos");
jCmbBxPais.addItem("Canada");
jCmbBxPais.addActionListener(this);
}
return jCmbBxPais;
}
Lo primero será crear la clase envolvente y que cada entrada del formulario
sea un atributo de la clase. Posteriormente definir métodos que nos permitan
tanto ingresar registros al archivo, así como obtener esos registros.
76
Java Avanzado Programa de Tecnología en Cómputo
package gui.formulario;
import java.io.*;
import java.util.StringTokenizer;
import java.util.Vector;
/**
* Clase envolvente para poder almacenar los
* datos de un contacto en un archivo
* @author Ricardo Castañeda M / PROTECO
*
*/
public class Contacto {
/*
* Se declaran los atributos private para encapsularlos
*/
private String nombre="";
private String direccion="";
private String telefono="";
private String observaciones="";
private String pais="";
private String ciudad="";
/*
* Se definen los metodos set, para poder dar valores
* a los atributos
*/
public void setNombre(String nombre){
this.nombre=nombre;
}
public void setDireccion(String direccion){
this.direccion=direccion;
}
public void setTelefono(String telefono){
this.telefono=telefono;
}
public void setObservaciones(String obs){
this.observaciones=obs;
}
public void setPais(String pais){
this.pais=pais;
}
public void setCiudad(String ciudad){
this.ciudad=ciudad;
}
/*
* Se definen los métodos get para poder obtener el
* valor de los atributos
*/
public String getNombre(){
return this.nombre;
}
public String getDireccion(){
return this.direccion;
}
public String getTelefono(){
return this.telefono;
}
77
Java Avanzado Programa de Tecnología en Cómputo
/*
* En este m?todo se concatenan los valores y
* se guardan en el archivo especificado en una
* sola linea por registro
*/
public void almacenaContacto(File archivo) throws IOException{
File file=archivo;
FileOutputStream fos=new FileOutputStream(file,true);
PrintWriter pw=new PrintWriter(fos);
String entry="";
entry=nombre+":"
+direccion+":"
+telefono+":"
+observaciones+":"
+pais+":"
+ciudad;
pw.println(entry);
pw.close();
fos.close();
}
/*
* Este método lee el archivo especificado y construye
* objetos de la clase Contacto a partir de los datos
* obtenidos del archivo, para después guardar los
* objetos en un Vector que será el que resgresará al
* terminar.
*/
public static Vector regresaContactos(File archivo)
throws IOException{
Contacto c=null;
Vector v=new Vector(0,1);
File file=archivo;
FileInputStream fis=new FileInputStream(file);
BufferedReader br=new BufferedReader(
new InputStreamReader(fis));
String linea;
while((linea=br.readLine())!=null){
c=new Contacto();
StringTokenizer st=new StringTokenizer(linea,":");
String nombre=st.nextToken();
c.setNombre(nombre);
c.setDireccion(st.nextToken());
c.setTelefono(st.nextToken());
c.setObservaciones(st.nextToken());
c.setPais(st.nextToken());
c.setCiudad(st.nextToken());
78
Java Avanzado Programa de Tecnología en Cómputo
v.add(c);
}
br.close();
fis.close();
return v;
}
Contacto test;
try{
//c.almacenaContacto("contactos.out");
//sc.almacenaContacto("contactos.out");
Vector v=Contacto.regresaContactos(
new File("contactos.out"));
for(int i=0;i<v.size();i++){
test=(Contacto)v.get(i);
System.out.println(i+" "+test.getNombre());
System.out.println(test.getCiudad());
}
}catch(Exception ioe){
System.out.println(ioe.getMessage());
ioe.printStackTrace();
}
}
}
Una vez hecho lo anterior solo restará dar funcionalidad al boton enviar,
mediante el método actionPerformed en la clase que define nuestro
formulario.
package gui.formulario;
public class Formulario extends JPanel implements ActionListener{
public void actionPerformed(ActionEvent e) {
...
/*
* Se modifica este bloque para que se ejecuten los
* metodos send() y reset al apretar el boton enviar
*/
if(e.getSource()==this.jBtnEnviar){
79
Java Avanzado Programa de Tecnología en Cómputo
this.send();
this.reset();
}
...
}
...
}
Menús
JMenuBar
Esta clase solo tiene un constructor que nos crea un JMenuBar vacío.
Para trabajar con los elementos del menu, podemos mencionar los siguientes
métodos.
JMenu
80
Java Avanzado Programa de Tecnología en Cómputo
Entre los métodos más importantes para nuestros fines podemos mencionar
los siguientes:
JMenuItem
81
Java Avanzado Programa de Tecnología en Cómputo
Las clases anteriores son suficientes para definir la estructura del menu, pero
una vez definido habrá que colocarlo en nuestra aplicación. En el caso de la
clase JFrame, podemos utilizar el método:
Una vez hecho esto faltará darle funcionalidad a los menus, tal como lo
hicimos con los demás componentes, mediante la interfaz actionListener.
Podemos seguir aplicando la misma metodología vista, de implementar la
interface y sobreescribir el método actionPerformed, y haciendo las
comparaciones correspondientes. O bien, otra forma es creando clases
anónimas para cada componente que se requiera. Veamos un ejemplo de lo
anterior.
package gui.formulario;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.*;
import javax.swing.*;
import javax.swing.JMenuItem;
/**
* Esta clase ejemplifica la estructura b?sica de una
* barra de menus
* @author Ricardo Casta?eda Mu?oz / PROTECO
*
*/
public class FrameMenu extends JFrame {
private JPanel jContentPane = null;
private JMenuBar jJMenuBar = null;
private JMenu fileMenu = null;
private JMenu contactsMenu = null;
private JMenu helpMenu = null;
private JMenuItem exitMenuItem = null;
private JMenuItem aboutMenuItem = null;
private JMenuItem almacenarMenuItem = null;
private JMenuItem listaMenuItem = null;
private JMenuItem fileMenuItem = null;
public FrameMenu() {
super();
initialize();
}
82
Java Avanzado Programa de Tecnología en Cómputo
this.setSize(300, 200);
this.setContentPane(getJContentPane());
this.setTitle("JMenuBar");
}
/*
* Este m?todo regresa la JMenuBar y la define
* en caso de ser necesario
*/
private JMenuBar getJJMenuBar() {
if (jJMenuBar == null) {
jJMenuBar = new JMenuBar();
/*
* Se agregan menus a la JMenuBar
*/
jJMenuBar.add(getFileMenu());
jJMenuBar.add(getContactsMenu());
jJMenuBar.add(getHelpMenu());
}
return jJMenuBar;
}
/*
* Los siguientes metodos definen y regresan
* cada uno de los JMenu contenidos en la barra
* de menus
*/
private JMenu getFileMenu() {
if (fileMenu == null) {
fileMenu = new JMenu();
/*
* Se define el texto que llevar? el menu
*/
fileMenu.setText("Archivo");
/*
* Con este metodo se agregan elementos
* del menu, al menu
*/
fileMenu.add(getFileMenuItem());
fileMenu.add(getExitMenuItem());
}
return fileMenu;
}
83
Java Avanzado Programa de Tecnología en Cómputo
contactsMenu.setText("Contactos");
contactsMenu.add(getAlmacenarMenuItem());
contactsMenu.add(getListaMenuItem());
}
return contactsMenu;
}
84
Java Avanzado Programa de Tecnología en Cómputo
JDialog
Es la clase principal para crear ventanas de diálogo. Se puede usar esta clase
para crear un diálogo personalizado, o invocar los métodos de la clase
JOptionPane para crear variedad de diálogos estándar. Esta clase tiene gran
variedad de métodos constructores como se puede ver acontinuacion.
85
Java Avanzado Programa de Tecnología en Cómputo
package gui;
import java.awt.*;
import javax.swing.*;
/**
* Un sencillo ejemplo de como crear una ventana
* de dialogo a partir de la clase JDialog
* @author Ricardo Castañeda M. / PROTECO
*
*/
public class Dialogo extends JDialog {
/*
* Se define el contenedor como se hizo para la clase
* JFrame
*/
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(new BorderLayout());
}
return jContentPane;
}
/*
* En el método main se crea un objeto JFrame que
* servirá de contenedor para al JDialog
*/
public static void main(String[] args) {
JFrame jf=new JFrame("JFrame propietario");
/*
* El cuadro de dialogo creado tendrá como
* propietario al JFrame anterior, un título
* especificado, y además será modal, es
* decir que cuando sea invocado el cuadro de
* diálogo, no devolverá el control a su
* propietario hasta que sea cerrado
*/
Dialogo d=new Dialogo(jf,"JDialog",true);
jf.setVisible(true);
jf.setSize(400,300);
d.setVisible(true);
d.setSize(300,200);
}
86
Java Avanzado Programa de Tecnología en Cómputo
File archivo=null;
private JPanel jContentPane = null;
private JScrollPane jScrollPane = null;
private JTextArea jTextArea = null;
public MostrarContactos(
Frame owner, String title,
boolean modal,File archivo){
super(owner, title, modal);
this.archivo=archivo;
initialize();
}
87
Java Avanzado Programa de Tecnología en Cómputo
jTextArea.append(c.getPais()+"\n");
jTextArea.append(c.getObservaciones()+"\n"+"\ n");
}
}
/*
* Se define el contenedor como se hizo para la clase
* JFrame
*/
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(new BorderLayout());
jContentPane.add(getJScrollPane(),
java.awt.BorderLayout.CENTER);
}
return jContentPane;
}
/*
* En el método main se crea un objeto JFrame que
* servirá de contenedor para al JDialog
*/
public static void main(String[] args) {
JFrame jf=new JFrame("JFrame propietario");
/*
* El cuadro de dialogo creado tendrá como
* propietario al JFrame anterior, un título
* especificado, y además será modal, es
* decir que cuando sea invocado el cuadro de
* diálogo, no devolverá el control a su
* propietario hasta que sea cerrado
*/
MostrarContactos d=new MostrarContactos(
jf,"Contactos disponibles",
88
Java Avanzado Programa de Tecnología en Cómputo
true,"contactos.out");
jf.setVisible(true);
jf.setSize(400,300);
d.setVisible(true);
d.setSize(300,200);
}
}
JOptionPane
Esta clase hace un sencillo cuadro de diálogo emergente que avisa a los
usuarios por un valor o informe.
Esta clase puede ser difícil por la grán cantidad de métodos que contiene, sin
embrago provee de diversos métodos estáticos para crear ventanas de
diálogo predefinidas, que se pueden agrupar en los siguientes:
Todos los diálogos anteriores son modales. Es decir que bloquean el hilo
actual hasta que la interacción con el usuario sea finalizada.
Cada uno de estos métodos son sobrecargados, por lo que pueden requerir
uno o varios de los siguientes parámetros.
89
Java Avanzado Programa de Tecnología en Cómputo
ERROR_MESSAGE
INFORMATION_MESSAGE
WARNING_MESSAGE
QUESTION_MESSAGE
PLAIN_MESSAGE
DEFAULT_OPTION
YES_NO_OPTION
YES_NO_CANCEL_OPTION
OK_CANCEL_OPTION
options. Es una opción más detallada para definir botones de opción que
aparecerán en el cuadro de diálogo. El valor usual para el parámetro options
es un arreglo de String's, pero el parámetro es un arreglo de object's. Un
botón es creado por cada objeto dependiendo del tipo:
Veamos un ejemplo.
package gui;
import java.awt.*;
90
Java Avanzado Programa de Tecnología en Cómputo
import javax.swing.*;
import java.awt.event.*;
import javax.swing.JButton;
/**
* Muestra como generar cuadros de diálogo predefinidos
* mediante la clase JOptionPane
* @author Ricardo Castañeda M / PROTECO
*
*/
public class Options extends JFrame {
public Options() {
super();
initialize();
}
91
Java Avanzado Programa de Tecnología en Cómputo
jButton2.setText("showOptionDialog");
/*
* En este caso se mostrará un cuadro de opciones
* con botones personalizados por el usuario
*/
jButton2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
Object[] options = { "Si", "No",
"Quien sabe" };
JOptionPane.showOptionDialog(null,
"Click OK para continuar", "Warning",
JoptionPane.DEFAULT_OPTION,
JOptionPane.WARNING_MESSAGE,
null, options, options[0]);
}
});
}
return jButton2;
92
Java Avanzado Programa de Tecnología en Cómputo
}
}
93
Java Avanzado Programa de Tecnología en Cómputo
*/
if(option==JOptionPane.YES_OPTION)
c.almacenaContacto(this.file);
}catch(IOException ioe){
/*
* Se manda un mensaje de alerta en caso de que no se
* encuentre el archivo especificado
*/
JoptionPane.showMessageDialog(this,
"Archivo de contactos no encontrado");
}
}
...
}
JFileChooser
/**
* Sencillo editor de texto plano que ejemplifica
* el uso de la clase JFileChooser
* @author Ricardo Castañeda M / PROTECO
*
*/
public class SeleccionaArchivo extends JFrame {
94
Java Avanzado Programa de Tecnología en Cómputo
public SeleccionaArchivo() {
super("Editor de texto");
initialize();
}
/*
* Este botón llama a al método open() cada vez
* que sea presionado
*/
private JButton getJButton() {
if (jButton == null) {
jButton = new JButton();
jButton.setText("Abrir");
jButton.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e) {
open();
}
});
95
Java Avanzado Programa de Tecnología en Cómputo
return jButton;
}
/*
* Este botón llama a al método save() cada vez
* que sea presionado
*/
private JButton getJButton1() {
if (jButton1 == null) {
jButton1 = new JButton();
jButton1.setText("Guardar");
jButton1.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e) {
save();
}
});
}
return jButton1;
}
96
Java Avanzado Programa de Tecnología en Cómputo
*/
File file=jfc.getSelectedFile();
/*
* A continuación se lee el contenido de la
* JTextArea y se guarda en el archivo
*/
try{
FileOutputStream fos=new FileOutputStream(file);
PrintWriter pw= new PrintWriter(fos);
pw.println(jTextArea.getText());
pw.close();
fos.close();
}catch(IOException ioe){
JoptionPane.showMessageDialog(null,
"Error al escribir en el archivo");
}
}
}
97
Java Avanzado Programa de Tecnología en Cómputo
La clase Graphics es la clase abstracta base para todos los contextos gráficos
que permiten a una aplicación dibujar sobre los componente, así como en
imágenes sobre la pantalla.
En esta clase de declaran muchos métodos, que nos servirán para dibujar
una gran cantidad de figuras, incluso imágenes.
boolean drawImage( Image img, int x, int y, Color bgcolor, ImageObserver observer ).
boolean drawImage( Image img, int x, int y, int width, int height, Color bgcolor,
ImageObserver observer )
98
Java Avanzado Programa de Tecnología en Cómputo
void drawOval(int x, int y, int width, int height). Dibuja el contorno de un óvalo.
void drawPoligon(int[] xPoint, int[] yPoints, int nPoints). Dibuja un polígono cerrado
definido por los arreglos de coordenadas.
void drawRect(int x, int y, int width, int height). Dibuja el contorno del rectángulo
especificado.
void fillOval(int x, int y, int width, int height) . Dibuja el óvalo especificado.
void fillPoligon(int[] xPoint, int[] yPoints, int nPoints). Dibuja un polígono relleno
definido por los arreglos de coordenadas.
void fillRect(int x, int y, int width, int height) . Dibuja el rectángulo especificado.
Como se puede ver, esta clase tiene muchos métodos para cuestiones de
dibujo, sin embargo, ya que es una clase abstracta, no es posible crear
objetos a partir de ella directamente, por lo que habrá que buscar otra forma.
99
Java Avanzado Programa de Tecnología en Cómputo
import java.awt.*;
import javax.swing.*;
import javax.imageio.ImageIO;
import java.io.File;
/**
* Esta clase muestra el uso de la
* clase Graphics para dibujar imagenes
* @author PROTECO
*
*/
public class Imagen extends JFrame {
Tabla2 figuras;
Container c;
JScrollPane panel;
public Imagen() {
super("Vamos a Dibujar");
figuras = new Tabla2();
c = getContentPane();
panel = new JScrollPane(figuras);
c.add(panel);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
100
Java Avanzado Programa de Tecnología en Cómputo
import javax.swing.*;
import java.awt.*;
/**
* Esta clase muestra el uso de la
* clase Graphics para dibujar figuras
* @author PROTECO
*
*/
public class Figuras extends JFrame {
Tabla figuras;
Container c;
JScrollPane panel;
public Figuras() {
super("Vamos a Dibujar");
figuras = new Tabla();
c = getContentPane();
panel = new JScrollPane(figuras);
c.add(panel);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
101
Java Avanzado Programa de Tecnología en Cómputo
}
/*
* La clase Tabla es la que contendrá las figuras
*/
class Tabla extends JPanel {
public void dibujaCuadrado(Graphics g) {
/*
* Se utiliza el método setColor() para
* cambiar el colo de las figuras que se
* definan después
*/
g.setColor(Color.YELLOW);
/*
* Se hacen llamadas al los métodos
* drawwRect() y fillRect(), para
* dibujar el contorno de un rectángulo
* y un rectángulo con relleno
*/
g.drawRect(10, 10, 80, 80);
g.setColor(Color.RED);
g.fillRect(100, 10, 80, 80);
}
102
Java Avanzado Programa de Tecnología en Cómputo
Los applets son GUI's hechas en java, que tienen la particularidad de poder
se incluidas en una página web, mediante la etiqueta <applet > de html, lo
que abre la posibilidad de tener complejas aplicaciones en una página web.
Debido a que los applets son programas hechos en java, son independientes
de la plataforma y del navegador, con el único requisito de que en el lado del
cliente se cuente con la JVM correspondiente.
Aun así existe una forma de poder realizar este tipo de acciones, a travéz de
la creación de applets, firmados, lo cuál solo se comentará por el momento y
se remite al lector a la documentación correspondiente.
103
Java Avanzado Programa de Tecnología en Cómputo
import java.awt.*;
import javax.swing.*;
/**
* Este ejemplo genera un applet básico heredado
* de la clase JApplet
* @author Ricardo Castañeda M. / PROTECO
*
*/
public class AppletBasico extends JApplet {
/*
*Se sobre escribe el método init() para
*inicializar el applet
*
*/
public void init() {
/*
* Se define un color de fondo y tamaño
* como se hace para otros contenedores
*/
this.setSize(300, 200);
this.setBackground(Color.ORANGE);
/*
* Se determina al JPanel como contenedor
*/
this.setContentPane(getJContentPane());
repaint();
}
/*
* Se se inicializa el JPanel
*/
private JPanel getJContentPane() {
if (jContentPane = = null) {
jContentPane = new JPanel();
jContentPane.setLayout(new GridLayout(5,2));
}
return jContentPane;
}
/*
* Se sobreescribe el metodo paint, para que
* dibuje algunos gráficos en el applet
*
*/
public void paint(Graphics g){
Font f=new Font("Arial",Font.ITALIC,30);
104
Java Avanzado Programa de Tecnología en Cómputo
Para poder hacer esto es necesario conocer la etiqueta <applet > de html, la
cual puede tener los siguientes atributos
archive .
Este atributo se utiliza cuando se tienen las clases almacenadas en
un archivo *.jar, pues el nombre del archivo se especifica en este atributo.
Ejemplo:
<applet code =" mipaqueta.Miclase" archive = " miJar.jar" width = 10 0 height = 5 0 > < / a pplet >
105
Java Avanzado Programa de Tecnología en Cómputo
protocolo://computadora/directorio/archivo
Java proporciona una clase del paquete java.net, que da soporte a los URL, y
es precisamente la clase homóloga URL cuyos constructores son los
siguientes:
106
Java Avanzado Programa de Tecnología en Cómputo
Ahora podemos utilizar dos métodos definidos en la clase Applet que nos
dará la solución al problema.
URL getDocumentBase() .
Que nos regresa el URL del documento en el cual el
applet está embedido. Bien puede ser solo un directorio o un archivo *.jar.
107
Java Avanzado Programa de Tecnología en Cómputo
/*
* Se utiliza el metodo getDocumentBase()
* para obtener el URL del directorio que
* contiene el applet
*/
url=getDocumentBase();
/*
* Se utiliza el método getImage() para
* obtener la imagen a partir del URL y
* el nombre del archivo
*/
image=getImage(url,"proteco.jpg");
this.setSize(300, 200);
this.setBackground(Color.ORANGE);
this.setContentPane(getJContentPane());
repaint();
}
Para poder realizar esto hay que estudiar una interfaz llamada
AppletContext, que corresponde al entorno del applet, que bien puede ser el
documento que contiene al applet u otros applets en el mismo documento.
Esta interfaz es útil por ejemplo para comunicar entre si los applets del
108
Java Avanzado Programa de Tecnología en Cómputo
package gui.applet;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
/**
* Esta clase muestra un JTextField donde se
* le indicará un URL, el cual abrirá en un
* navegador aparte
* @author PROTECO
*
*/
public class AppletLink extends JApplet {
109
Java Avanzado Programa de Tecnología en Cómputo
try {
/*
* Con el texto obtenido se forma un URL
*/
URL u = new URL(url);
/*
* Se obtiene el AppletContext(), para
* llamar a su método showDocument()
*/
getAppletContext().showDocument(u, "_blank");
110
Java Avanzado Programa de Tecnología en Cómputo
Conceptos básicos
Dirección IP
Puerto TCP
111
Java Avanzado Programa de Tecnología en Cómputo
¿Qué es u n socket?
Los sockets podemos verlos como un tipo de archivo especial (que de hecho
en sistemas Unix son archivos) por medio del cual podemos establecer la
comunicación. En un socket escribimos y leemos los datos que se envían o
reciben, y están muy relacionados con los puertos TCP, ya que precisamente
se asocia un socket con un puerto TCP para la interacción entre nuestro
programa y el protocolo TCP/IP.
Comenzemos con la clase Socket. Esta clase implementa un socket del lado
del cliente, por lo que para construir un objeto de esta clase es necesario
especificar la dirección del host remoto, así como al puerto del host remoto
al cual se intentará comunicar. Veamos un constructor de esta clase que
realiza lo previamente escrito.
112
Java Avanzado Programa de Tecnología en Cómputo
OutputStream getOutputStream() .
Regresa un flujo de hacia desde el socket. Este
método nos permitirá escribir datos en el socket.
import java.net.*;
import java.io.*;
/**
* Esta clase muestra un uso simple de la
* clase Socket
* @author PROTECO
*
*/
class ClienteWeb {
public static void main(String[] a) {
try {
/*
* Se crea un objeto de clase socket
* que se conectará a la dirección
* especificada desde la línea de comandos
* y al puerto 80 que usualmente es
* el puerto de web
*/
Socket s = new Socket(a[0], 80);
/*
* Se crea un objeto BufferedReader para
* poder trabajar con líneas de texto que se
* leen a partir del InputStream obtenido del
* socket
*/
BufferedReader in = new BufferedReader(
new InputStreamReader(
s.getInputStream()));
/*
* Se crea un objeto PrintWriter para poder
* escribir lineas de caracteres en el flujo
* de salida hacia el socket obtenido. Se
* utiliza el objeto OutputStreamWriter para
* convertir un flujo de caracteres a un flujo
113
Java Avanzado Programa de Tecnología en Cómputo
* de bytes.
*/
PrintWriter out = new PrintWriter(new OutputStreamWriter(
s.getOutputStream()), true);
/*
* Se imprime la siguiente cadena en el OutputStream
* del socket, para un servidor HTTP representa
* una petición GET desde el directorio raiz, es
* decir que el servidor no va a proporcionar
* el HTML, por medio de esa petición
*/
out.println("GET /");
String l = null;
/*
* Se utiliza el ciclo para leer el contenido
* del socket
*/
while ((l = in.readLine()) != null) {
System.out.println(l);
}
s.close();
} catch (ArrayIndexOutOfBoundsException aioobe) {
System.out.println("USO: java net.ClienteWeb URL");
} catch (Exception e) {
}
}
}
Socket accept() .
Escucha por una conexión que va a ser hecha en este socket y
la acepta. Este es quizá el método más importante ya que nos permite
establecer la comunicación una vez aceptada la petición mediante el objeto
de tipo Socket que regresa el constructor.
114
Java Avanzado Programa de Tecnología en Cómputo
import java.net.*;
import java.io.*;
/**
* Este ejemplo es un sencillo servidor web
* que escucha peticiones por el puerto 7777
* y muestra un mensaje en código HTML. Se puede
* ver el resultado por medio de un navegador
* Internet Explorer
* @author PROTECO
*
*/
class ServidorWeb {
public static void main(String[] a) throws Exception {
/*
* Se crea un ServerSocket que escuchará al
* puerto 7777
*/
ServerSocket ss = new ServerSocket(7777);
Socket s;
/*
* Se define un ciclo infinito para que el
* socket escuche siempre peticiones
*/
while (true) {
/*
* Al momento de aceptar una petición se
* crea un socket por medio del cual se
* lleva a cabo la comunicación entre cliente
* y servidor
*/
s = ss.accept();
/*
* Se define un PrintWriter para poder escribir
* lineas de cadenas de caracteres en el socket
*/
PrintWriter out = new PrintWriter(new OutputStreamWriter(
s.getOutputStream()), true);
/*
* Se imprime el mensaje en el flujo de salida del
* socket. Este mensaje es un texto de html que
* el navegador podrá interpretar
*/
out.println(" < h t m l > " +
"<body bgcolor =red > " +
"<h2 > < m a rq uee > " +
"Hola Mundo" +
115
Java Avanzado Programa de Tecnología en Cómputo
package net;
import java.net.*;
import java.io.*;
/**
* Esta clase implementa un servidor web
* multihilos, capaz de atender a múltiples
* clientes
* @author PROTECO
*
*/
public class ServidorWebThread extends Thread {
Socket s;
/*
* El socket especificado será utiliado
* para la comunicación entre el servidor
* y uno de los clientes
*/
public ServidorWebThread(Socket s) {
116
Java Avanzado Programa de Tecnología en Cómputo
this.s = s;
}
/*
* Al ejecutarse el hilo va a escribir el código
* de HTML en el socket utilizado para construir
* el objeto
*/
public void run() {
try {
PrintWriter out = new PrintWriter(new OutputStreamWriter(s
.getOutputStream()), true);
out.println(" < h t m l > " +
"<body bgcolor =red > " +
"<h2 > < m a rq uee > " +
"Hola Mundo" +
"</ marquee > < / h 2 > " +
"</body > " +
"</ht ml > ");
s.close();
} catch (IOException ioe) {
}
}
117
Java Avanzado Programa de Tecnología en Cómputo
Bibliografía
Páginas web
http://www.java.sun.com/
http://www.javahispano.com/
http://www.programacionencastellano.com/
118