You are on page 1of 11

APLICACIONES Y APPLETS

Existen dos maneras de estructurar un programa en Java: por


aplicaciones o por applets. Ambos siguen el mismo proceso de
desarrollo, incluyendo la gran mayora de las facilidades que Java ofrece.
La diferencia es que las aplicaciones se ejecutan como cualquier
programa "normal", mientras que los applets estn especficamente
diseados para correr en el Web a travs de un browser.
APLICACIONES
Las aplicaciones requieren de un mtodo especial para iniciar el
programa: el mtodo main. La aplicacin mas sencilla es la famosa "Hola
Mundo", la cual se programa de la siguiente manera como aplicacion en
Java:
class ej {
public static void main(String args[]) {
System.out.println("Hola Mundo! ") ;
}
}
Al ejecutar el programa escribira "Hola Mundo".
En una aplicacin que contiene mltiples clases, el mtodo main puede
agregarse a cualquiera de las clases. Dado que el metodo main esta
definido como esttico, este no tiene acceso a las estructuras internas
de la clase. A continuacin se muestra un ejemplo del uso del main,
public class Persona {

public static void main (String args[]) {


for (int i = 0 ; i < args.length; i++)
System.out.print(args[i] + " ");
System.out.print(M\n");
System.exit(O);
}
}
Observe el argumento args de main, que recuerda cierta similitud con
argc y argv en el lenguaje C, solo que integrandolos en uno solo.
Applets
Tomamos ahora el programa anterior de "Hola Mundo", que se
programara de la siguiente manera como un applet en Java:.
public class ej extends Applet {
public void paint(Graphics g){
g.drawStringC'Hola Mundo! ",25,25) ;
}
}
En lugar del mtodo main, un applet requiere una clase que herede de
Applet y sobrescriba el mtodo paint, para desplegar textos o graficas
en la pantalla.

Todo applet requiere de una pagina html para su ejecucin, por ejemplo
e j . html, como se muestra a continuacin:
<applet code=ej .class width=200 height=200x/applet>
El archivo html puede ejecutarse en un browser o mediante la aplicacin
appletviewer
de la siguiente forma:
appletviewer ej.html
A diferencia del metodo main, el paso de argumentos iniciales es a
traves de los parmetros del archivo html.
INTERFACES GRAFICAS DEL USUARIO
Programar en Java sin utilizar interfaces graficas del usuario (GUI, por
sus siglas en ingles) es no aprovechar uno de los aspectos ms
importantes que ofrece la programacin y, en particular, Java.
A continuacin, se describe el manejo de ventanas, textos, botones y
paneles en Java a traves de la biblioteca basica Abstract Window Toolkit
(AWT). El ejemplo
a desarrollarse en esta seccion es muy importante, ya que servir de
base para el desarrollo de software generado en los capitulos posteriores
en el libro.
Todo sistema de ventanas requiere alguna ventana donde desplegar la
informacin. Existen dos filosofas separadas, aunque relacionadas en
Java, que afectaran el diseo como ya se menciono antes: aplicaciones y
applets. Las aplicaciones requieren de un Frame (marco) donde
desplegar y permitir la interaccin con el usuario; mientras que un

applet puede hacer esto en forma directa en la pantalla del browser o


mediante nuevos marcos, de manera similar a las aplicaciones.
Empecemos por lo mas bsico y mostremos el uso de los marcos a
traves de la clase InterfaceUsuario: class InterfaceUsuario extends
Frame Esta clase heredara todas las caractersticas de un marco para
manejarse como una ventana. Antes de proseguir, es necesario
comprender que toda aplicacin con ventanas requiere un manejo de
eventos de entradas y salidas. Esto significa que la aplicacion, antes de
hacer algo, debe especificara como controlara eventos generados por el
teclado y, en especial, el ratn. Java define dos interfaces muy
importantes en AWT, que son WindowListener y Action Listener.
WindowListener define los mtodos relacionados con el manejo de
eventos para una ventana, como abrir y cerrar. Y ActionListener define
los mtodos para manejar eventos dentro de la ventana, como apretar
un botn. De tal manera, es necesario que la clase InterfaceUsuario
implemente estas dos interfaces si se ha planeado manejar estos tipos
de

eventos.

Por

tanto,

extendemos

la

definicin

de

la

InterfaceUsuario de la siguiente manera:


class InterfaceUsuario extends Frame implements WindowListener,
ActionListener
public void windowClosed(WindowEvent event) {}
public void windowDeiconified(WindowEvent event) {}
public void window!conified(WindowEvent event) {}
public void windowActivated(WindowEvent event) {}
public void windowDeactivated(WindowEvent event) {}

clase

public void windowOpened(WindowEvent event) {}


public void windowClosing(WindowEvent event) {
System.exit(O); }
Estos son todos los metodos definidos por la interface WindowListener:
windowClosed para el manejo de eventos a partir cle una ventana
cerrada.
windowDeiconified para el manejo de eventos a partir de una ventana
no iconificada.
windowlconified para el manejo de eventos a partir de una ventana
iconificada.
windowActivated para el manejo de eventos a partir de una ventana
activada.
windowDeactivated para el manejo de eventos a partir de una ventana
desactivada.
wi ndowOpened para el manejo de eventos a partir de una ventana
abierta.
windowClosing para el manejo de eventos en el momento que se cierra
una ventana.
Estos mtodos deben sobrescribirse aunque queden vacios. El nico que
realmente se ha sobrescrito es windowClosing para permitir salir de la
aplicacin cuando este evento ocurra.
La

sobreescritura

de

la

interface

ActionListener

es

mucho

ms

importante para las ventanas, ya que a traves del mtodo action

Performed se debe especificar que hacer cuando, por ejemplo, se


presiona algn botn dentro de la ventana.
El siguiente mtodo muestra la sobreescritura de actionPerformed, al
imprimir el evento ocurrido:
public void actionPerformed(ActionEvent event) {
System.out.pri ntln("Action: "+event.getActi onCommand());
}
Esta es la lgica bsica del manejo de eventos de un marco. Para
completar

la

funcionalidad

necesitamos

inicializar

la

clase

InterfaceUsuario y definir alguna pantalla a desplegar. Para ello


definimos el siguiente constructor:
public InterfacetlsuarioQ {
setSize(800,600);
setBackground(Col or.lightGray);
addWindowListener(this);
pantalla = new PantallaPrincipal(this);
desplegarPantalla(pantalla);
}
Describamos las llamadas dentro de este constructor, la mayora de las
cuales son opcionales:
setSize define el tamano del marco.

set Background asigna un color de fondo de manera opcional.


addWindowListener registra el marco (this) con el administrador de
ventanas
de Java para que podamos manejar los eventos. Este metodo es
necesario.
Pantal laPrinci pal instancia la pantalla a ser desplegada, algo que
veremos a continuacion. Observe que la variable pantalla se define
como un atributo de la clase Interfacellsuario, "private Pantalla
pantalla;", esto tambin se explicara junto con la clase Pantalla

PROGRAMACIN AVANZADA
ARCHIVOS
En Java es relativamente sencillo tener acceso a archives, como lo ilustra
el siguiente codigo en Java:
File file = new File(ch" r,archive) ;
BufferedReader is = new BufferedReader(new FileReader(file));
String s = is. readLineQ ;
is.close();
Se instancia un archivo file de tipo File, especificando su ubicacin en el
sistema, dir, y su nombre, archivo. A continuacin se instancia un objeto
de tipo FileReader, el cual se conecta al archivo file y, luego, en la misma
lnea, se instancia el objeto is de tipo BufferedReader que permite
conectarse a travs de un bufer de lectura. La llamada is. readLineQ
hace una lectura de una linea completa y la guarda en una variable s de
tipo String. Luego de terminarde leer la informacion deseada del archivo,
este se cierra mediante la llamada is.closeQ.
La escritura es analoga a la lectura, como se muestra a continuacin:
BufferedWriter os = new BufferedWriter(new FileWriter(file));
os.write(s);
os.closeQ;

Se instancia un archivo file, como se mostro anteriormente. A


continuacion se instancia un objeto de tipo FileWriter, el cual se conecta
al archivo file y, luego, en la misma linea, se instancia el objeto os de
tipo BufferedWriter, que permite conectarse a traves de un bufer de
escritura. La llamada os.write(s) hace una escritura de una cadena
referida por la variable s de tipo String. Despues de terminar de escribir
la informacion deseada en el archivo, este se cierra mediante la llamada
os.closeQ.
BASES DE DATOS
Accesar una base de datos tambien es relativamente sencillo en Java.
Inicialmente se verifica que exista el paquete o biblioteca de Java que
permite administrar la conexion a las bases de datos, como se presenta
a continuacion:
Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");
La propia conexion a la base de datos se hace a traves de una llamada
similar a la siguiente:
Connection con = DriverManager.getConnection("jdbc:odbc nombre"',
login,
password);
Esto genera una conexion a una base de datos llamada nombre, que
puede accesarse de forma opcional a traves de un nombre de usuario
login y una contrasea password. La conexin queda abierta hasta que
se cierre mediante la siguiente llamada:
con.close();
Luego, se debe instanciar una variable de tipo Statement, la cual se
utiliza como contenedor de la llamada en SQL:
Statement stmt = con.createStatementQ;
For ejemplo, si se quisiera hacer una consulta a una tab! a con un
nombre de usuario log, primero se genera una cadena query para
guardar la llamada de SQL, y luego se ejecuta mediante la llamada
stmt.executeQuery(query), como se muestra a continuacion:
String query = "SELECT * FROM tabla WHERE (login = 'Tog')11;
ResultSet rs = stmt.executeQuery(query);
Esta llamada regresa un resultado rs de tipo ResultSet, del cual se
obtiene la Estructura de la tabla, o sea la descripcin del metadata; para

luego poder leer de manera correcta los datos, como se ilustra a


continuacion:
ResultSetMetaData rsmd = rs.getMetaDataQ;
int numCols = rsmd.getColumnCountQ;
while (rs.nextQ) {
for (int i =1; i <= numCols; i++)
String str = rs.getString(i) ;
}'
En el caso de una cadena, la propia lectura se hace mediante la llamada
rs.getString(i), donde i identifica la columna de la tabla a partir del valor
1. Mientras rs.nextQ no sea nulo, existen resultados adicionales para
seguir leyendose. A diferencia de la consulta, las inserciones o
actualizaciones de las tablas se hacen utilizando la llamada
stmt.executeUpdate(update), como se muestra a continuacin:
String update = "INSERT INTO tabla ...";
int n = stmt.executeUpdate(update);
Note que la llamada stmt.executeUpdate(update) regresa ahora un
entero correspondiente al nmero de records, que fueron insertados o
modificados exitosamente. El formato de las inserciones y
actualizaciones corresponden a las especificaciones de SQL y no sern
tratadas aqu en ms detalle.

EXCEPCIONES
Un aspecto de suma importancia y que es integral en lenguajes como
Java, es el manejo de excepciones. Cuando un error ocurre en un
programa, el sistema lanza una excepcion que el programa atrapa. El
manejo de excepciones se requiere para cualquier codigo que pueda
resultar en estados inconsistent^, en particular situaciones donde se
trate de accesar entidades externas al programa, como son los archivos
y las bases de datos.
En Java, este manejo se logra mediante tres palabras reservadas:
try. Define un bloque de codigo donde pudieran ocurrir excepciones.
catch. Define una seccion para el manejo de las excepciones (a traves
de

la clase Throwable o alguna de sus subclases). Este bloque es opcional.


finally. Codigo a ejecutarse como finalizacion del bloque, ocurran o no
excepciones.
Este bloque es opcional.
Por ejemplo, veamos el siguiente caso para la lectura de un archivo:
try {
BufferedReader is = new BufferedReader(new FileReader(file));
leerArchivo(is) ;
is.closeQ;
}
catch(lOException e) {
System.out.print("Error Lectura Registro: " + e);
System.exit(l);
}
finally {
System.out.print("Lectura Archivo: " + file);
}
El bloque try abre la conexin al archivo de lectura file, llama al mtodo
de Lectura, leerArchivo y cierra posteriormente la conexin al archivo. El
bloque catch define el manejo de la excepcion, lOException, la cual se
pasa como argumento unico dentro del bloque. En este ejemplo, se
imprime el tipo de excepcin y se sale del programa. El bloque finally
siempre se ejecuta al finalizar los dos bloques anteriores (a menos que
se saiga de la aplicacion). En el ejemplo se imprime un mensaje sobre el
archivo que se est leyendo.
Java requiere que las posibles excepciones sean manejadas mediante
bloque throws. Por ejemplo, el acceso a archivos puede ocasionar una
excepcin de lectura o escritura si el archivo no existe o se encuentra
vacio. El metodo leerArchivo se muestra a continuacion:
public void leerRegistros(BufferedReader is) throws lOException {
String s = is. readLineQ ;
}

Observe que la excepcion lOException, que se incluye con el throws,


tambin debe aparecer como argumento en el bloque catch
correspondiente, si no ocurrira un error de compilacin.
CODIGO NATIVO
Java permite al desarrollador de software incluir codigo escrito en otros
lenguajes, en particular C, como parte de programa en Java. Para ello, se
aplica el modificador native a las declaraciones de los metodos que son
implementados de manera nativa en C o algun otro lenguaje, pero no en
Java. Al igual que un mtodo abstracto, se agrega un punto y coma al
final de una declaration nativa.
SlNCRONIZACION
Al igual que otros lenguajes, Java permite procesar mltiples objetos y
mtodos de manera concurrente dentro de una aplicacin mediante el
uso de multiples bilos (threads) de control. La concurrencia en el
procesamiento requiere de sincronizacin de los bloques afectados. Para
ello, Java incluye el modificador synchronized, el cual especifica una
section critica de procesamiento que no puede interrumpirse durante su
ejecucin.
SERIALIZACION
Como apoyo al procesamiento distribuido de aplicaciones, Java permite
enviar objetos entre diversos procesos. Este envo se facilita mediante el
uso de la interface se realizable, la cual debe ser incluida en la
implementacin de la clase afectada.
FlNALIZADOR
Existe en Java un mtodo de finalizacin de clase llamado finalize. El
objetivo del finalizador, de manera complementaria al constructor, es
cerrar; por ejemplo, archives o sockets que se encuentren abiertos. Un
finalizador se vena de la siguiente forma:
protected void finalizeQ throws lOException {
if (fd != null) closeQ;
}
Java llama a un finalizador una sola vez por objeto. El mtodo finalizador
se llama por lo general antes de la recoleccin de basura; sin embargo,
Java no garantiza el orden de estas llamadas, y cualquier recurso aun no
cerrado o recolectado sera liberado al terminar el programa.