>>
Lección 11


Primeras aplicaciones.


En el resto de esta lección se crean varias aplicaciones y applets que son calculadoras. Se aprovecha la idea de un programa que realiza las operaciones aritméticas básicas para ilustrar la amplia variedad de formas que se pueden dar a una aplicación Java y mostrar cómo se pueden reutilizar las clases de un programa sencillo en versiones más complejas.

En lo que sigue de la lección aparecerán varios términos y conceptos que probablemente el alumno no entenderá. La mayoría de estos términos se explican en otras lecciones del curso. El objetivo de los ejemplos que siguen es dar una primera visión más o menos completa de lo que se estudiará en el resto del curso. 

El alumno debe leer estos ejemplos cuidadosamente tratando de entender o adivinar el papel que juegan los diferentes métodos de cada clase y lo que hace cada línea o instrucción, pero sin pretender comprenderlo a fondo. Si tiene curiosodad, tiempo e interés, se le invita a consultar los términos que no entienda en la documentación. Pero sobre todo debe tratar de familiarizarse con la sintaxis y la terminología.


Aplicaciones autónomas para línea de comandos.


Para que una clase Java sea una aplicación autónoma debe tener un método con encabezado

public static void main(String[] args)

que es por donde comienza la ejecución. En tal caso desde la línea de comandos se puede ejecutar la clase escribiendo java seguido del nombre de la clase (sin extensión) y pulsando <intro>. El intérprete de Java comienza la ejecución de la clase precisamente por este método. Si la clase no tiene un método como éste entonces el intérprete de Java dice que no encuentra el método main y no la ejecuta.

Normalmente una aplicación consta de varias clases pero sólo una de ellas es la entrada de la aplicación. Para que una clase sea entrada de una aplicación es necesario que tenga el método main, pero una clase puede tener el método main y no usarse dentro de una aplicación como entrada sino sólo como una clase más.

El ejemplo ejem01.calculadora.class presenta nuestra primera calculadora sobre la que se construirán otras. Es una clase ejecutable que más adelante aprovecharemos sin utilizar su método main.

Para usar esta calculadora el alumno debe usar la línea de comandos de la consola y, desde el directorio principal del curso, hacer llamadas como

java ejem01.calculadora 155 "/" 5

En este caso obtendrá el resultado de la división de 155 entre 5, o sea 31. Es necesaro escribir un espacio entre el primer operando y el operador, así como entre el operador y el segundo operando para separar los argumentos del programa. El alumno puede realizar otras operaciones con llamadas semejantes.

Nota: las comillas alrededor del operador son necesarias sólo para la multiplicación porque un * en la línea de comandos se interpreta como un comodín sobre los archivos del directorio actual. Por ejemplo, *.java usado como parámetro hace que en args aparezca la lista de todos los archivos con extensión .java. Esto es muy útil para crear programas que operen sobre varios archivos. En los ejercicios de la lección 8 el alumno tendrá ocasión de utilizar esta propiedad.

El siguiente ejemplo, ejem01.calcApli.class, utiliza la clase calculadora pero no su método main. calcApli crea una interacción diferente, más parecida a la de una calculadora en donde se va utilizando el acumulador como primer operando.

En este ejemplo se utiliza System.in que es la corriente de entrada (un objeto de la clase InputStream) para leer lo que el usuario del programa escribe. De hecho se crea un objeto de la subclase BufferedReader  para leer las cadenas (Strings) que el usuario escribe en la línea de comandos. Todo lo referente a corrientes de entrada y salida se estudiará en la lección 8. Este ejemplo es una aplicación típica de línea de comandos sin marcos ni ventanas. En este tipo de aplicaciones la interacción se realiza pidiendo al usuario, mediante un mensaje en la pantalla , que escriba algún dato al programa, el cual el programa lee usando la corriente de entrada System.in (o alguna subclase construida a partir de ella). Los mensajes al usuario, así como los resultados del programa se escriben en la pantalla usando la corriente de salida System.out.

Para usar calcApli el alumno debe usar la línea de comandos de la consola y, desde el directorio principal del curso, hacer la llamada

java ejem01.calcApli

y a continuación escribir los operandos y operadores que el programa le va pidiendo. El resultado de una sesión con este programa podría ser así:

 

Las aplicaciones de línea de comandos siguen siendo útiles a pesar de que actualmente se utilizan con mayor frecuencia las aplicaciones con interfaz gráfica, lo que se llaman aplicaciones Windows. El alumno debe adquirir destreza en la creación de aplicaciones de línea de comandos porque constituyen una forma rápida y fácil para resolver muchas dudas y problemas. En particular, a veces es más fácil y práctico resolver una duda de programación escribiendo un programa y viendo lo que hace, que consultarlo en  la literatura. También hay muchas aplicaciones que podrían ser Windows pero que por diversas razones puede convenir escribirlas como aplicaciones de línea de comandos. Sin embargo las aplicaciones que requieren una interacción compleja con el usuario deben escribirse como aplicaciones Windows.


Aplicaciones Windows.


Las aplicaciones Windows se caracterizan por tener al menos un marco (Frame). Los marcos se estudiaron en la lección 8. Al igual que las aplicaciones para línea de comandos, la entrada debe realizarse en una clase que tenga un método

public static void main(String[] args)

La diferencia con las aplicaciones de línea de comandos radica en que la interacción se realiza sobre una interfaz gráfica como las que se estudiarán en la lección 4 y usando los eventos que se estudiarán en la lección 5. Para ilustrar esto presentamos el ejemplo siguiente que es una calculadora con interfaz gráfica. La interfaz gráfica está concentrada en la clase calcPanel que es una extensión o subclase de Panel y utiliza la clase calculadora definida en la sección anterior. La clase calcPanel se utiliza para crear la aplicación Windows llamada calcWin. Estos son los códigos de las dos clases.

Aquí vería un applet si su navegador reconociese la etiqueta de APPLET.

Aquí vería un applet si su navegador reconociese la etiqueta de APPLET.

El alumno debe ir a la línea de comandos del DOS y hacer la llamada

java ejem01.calcWin

para abrir esta aplicación y probar su funcionamiento.

calcPanel es una clase delicada. Su comprensión requiere mayor atención que otras. El alumno debe estudiarla cuidadosamente, sobre todo el método actionPerformed que es el núcleo de la interacción y contiene los detalles más delicados.


Aplicaciones y applets.


En esta sección se utiliza la clase calcPanel de la sección anterior para crear una calculadora en forma de applet. También se creará un applet que puede arrancar calculadoras usando la aplicación calcWin. Es para tener esta posibilidad que se ha definido y utilizado la variable booleana solo dentro de calcWin.

El siguiente ejemplo utiliza la clase calcPanel desarrollada en la sección anterior para crear una calculadora en forma de applet.

Aquí vería un applet si su navegador reconociese la etiqueta de APPLET. Aquí vería un applet si su navegador reconociese la etiqueta de APPLET.

También se puede crear un applet capaz de arrancar calculadoras usando la aplicación calcWin, como muestra el siguente ejemplo. Pulse este botón para que aparezca la calculadora: Aquí vería un applet si su navegador reconociese la etiqueta de APPLET.

Éste es el código del applet:

Aquí vería un applet si su navegador reconociese la etiqueta de APPLET.

Advertencia: Por alguna extraña razón, si se compila calcPanel.java con Visual J++ el applet de la siguiente sección funciona con el appletviewer y con el IExplorer pero no funciona con Netscape. Hechos como éste muestran la conveniencia de compilar todas las aplicaciones y applets con el compilador oficial de Java (javac.exe) antes de publicarlas. Esto no cancela la conveniencia de utilizar entornos de desarrollo como Visual J++ o  JBuilder, pero una última compilación con javac.exe ofrece mayores garantías sobre el buen funcionamiento de la aplicación en diferentes sistemas operativos o navegadores.

Finalmente, veremos que calcApplet puede convertirse en una aplicación Windows. Estudie el código de calcWin2 y luego desde la línea de comandos llámelo y compruebe que funciona igual que calcWin. Observe que en este caso  calcApplet se usa sólo en su calidad de Panel, no se utilizan sus métodos específicos de Applet.

Aquí vería un applet si su navegador reconociese la etiqueta de APPLET.

Hemos visto que hay muchos caminos posibles para llegar a una aplicación o un applet. Java tiene una gran flexibilidad para la presentación final de una aplicación, en gran medida por ser un lenguaje orientado a objetos. Para poder aprovechar esta flexibilidad es importante diseñar cuidadosamente las clases básicas. Analicemos el ejemplo de este capítulo.

Hay una clase en la que se basan todas las aplicaciones del capítulo: calculadora. Se trata de una clase muy sencilla que no es extensión o subclase de ninguna otra. Posiblemente la primera vez que el alumno la vio encontró algunas cosas extrañas, pero las aplicaciones le habrán demostrado la utilidad de su diseño. La experiencia demuestra que es muy difícil crear una clase tan útil como ésta en un primer intento. Normalmente es necesario crear una primera versión y modificarla muchas veces durante el desarrollo de las aplicaciones para que a la larga resulte verdaderamente útil. El programador debe ejercer una autocrítica constante de su propio trabajo para lograr mejorarlo.

Hay otra clase en la que se basan todas las versiones gráficas de la calculadora: calcPanel. Es una clase un poco más complicada, pero el alumno observará que sólo tiene dos métodos: init(), en donde se define la interfaz gráfica y actionPerformed(ActionEvent ev), en donde se interpretan las acciones del usuario y se convierten en operaciones. Este método es sin lugar a dudas el más difícil de programar. La interfaz gráfica podría haberse construido de muchas otras maneras y su diseño es un tema más bien visual sobre la distribución de los componentes gráficos de una calculadora (un campo de texto y varios botones). Pero en actionPerformed   ha sido necesario llevar un cuidadoso control (del número que el usuario va escribiendo y de las operaciones que realiza) para reproducir el funcionamiento típico de una calculadora. El código de actionPerformed es engañosamente simple, en realidad hay varias sutilezas que el alumno sólo podrá comprender si después de estudiarlo un poco trata de reconstruirlo sin mirar. En actionPerformed se hace uso de la clase calculadora y es precisamente en este método donde se pueden apreciar las virtudes del diseño de dicha clase.

Las clases calculadora y calcPanel en mayor medida, pero también calcWin y calcApplet, son clases diseñadas para ser  reutilizables y se reutilizan efectivamente en las diferentes aplicaciones.

Una aplicación puede utilizar muchas más clases que las que se utilizan en los ejemplos de esta lección. Cuantas más clases utilice más importante es que estén bien diseñadas, que sean útiles, que no tengan repeticiones ni variables o métodos inútiles, etc... La única manera de aprender a escribir buenos programas es haciéndolo y buscando continuamente mejoras que se le podrían hacer al código y a su organización en clases (y paquetes). Una clase reutilizable no suele ser fruto de una idea genial, casi siempre requiere de muchas horas de análisis, experimentación y modificaciones en el diseño y la implementación.

El lenguaje Java da muchas facilidades para aprovechar las clases que uno ha escrito previamente. Para sacar provecho de estas ventajas es importante repasar las clases creadas cuando se ha terminado la programación y hacer un esfuerzo de reorganización y depuración que arroje como resultado el mayor número de clases reutilizables.

El objetivo de los ejercicios de esta lección es que el alumno cree un conjunto de clases reutilizables y las aproveche en la construcción de algunas aplicaciones y applets.


Índice

Ejercicios de la Lección 11.


José Luis Abreu y Marta Oliveró