Aplicaciones

 

 

En esta unidad se crean varias aplicaciones y applets. Todos los ejemplos giran en torno a una calculadora. Se creará primero una calculadora que funciona desde la línea de comandos, luego otra que funciona en un applet y finalmente otra que es una aplicación Windows. Se aprovecha la idea de un programa (una clase) que realiza las operaciones aritméticas básicas para ilustrar las distintas formas que se pueden dar a una aplicación Java y mostrar cómo se pueden reutilizar las clases creadas para un programa en versiones más complejas o en otros programas.

Aplicaciones

Atendiendo a cómo arranca un programa Java, distinguimos dos tipos de aplicaciones: las aplicaciones autónomas y los applets. Atendiendo a cómo se realiza la interacción con el usuario, es decir, cómo es la interfaz de usuario, distinguimos entre aplicaciones para línea de comandos y aplicaciones con interfaz gráfica.


Aplicaciones autónomas y Applets

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 el intérprete 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>. 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 en la aplicación completa como entrada sino sólo como una clase más.

Los applets no son aplicaciones autónomas, no arrancan por el método main, de hecho un applet puede no tener un método main. Los applets arrancan como sub-aplicaciones dentro de una página Web y el navegador hace llamadas a sus métodos init(), start() y stop() como se indicó en la unidad 6.  En cambio de aplicación autónoma sólo sabemos que el intérprete de Java comenzará ejecutando el método main.

En esta unidad distinguimos dos tipos de aplicaciones autónomas: las de línea de comandos y las que tienen una interfaz gráfica. Esta distinción se basa en la manera en que el usuario y el programa se comunican. En el primer caso lo hacen con mensajes de texto a través de la consola, los segundos lo hacen a través de diversos componentes gráficos y los eventos que éstos generan ante acciones del usuario.



Aplicaciones para línea de comandos

Para ilustrar las aplicaciones autónomas utilizaremos una calculadora. El ejemplo ejem08.calculadora.class presenta nuestra calculadora para línea de comandos, sobre ella se construirán otras con interfaz gráfica. ejem08.calculadora es una clase ejecutable (tiene un método main) pero más adelante la utilizaremos en otras aplicaciones sin usar su método main.

Para usar la calculadora el alumno debe hacerlo a través de la línea de comandos de la consola y, desde el directorio principal del curso, hacer la  llamada:

java ejem08.calculadora

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

 

Éste es le código Java de la calculadora:

Vamos a analizar las partes fundamentales de este código concentrándonos más en la organización del programa que en los detalles. Pero antes unas palabras sobre los comentarios que constituyen la documentación del programa.

Documentación

Mirando el código de calculadora.java el alumno observará que tiene muchos comentarios. Esos comentarios llevan un formato especial (siempre comienzan con /** ) que permite crear de manera automática la documentación oficial de los programas Java usando el programa JavaDoc. Pulse el botón para ver esta documentación ya en formato de página web. Está en el mismo formato que toda la documentación del API de Java. Este tipo de documentos suelen llamarse coloquialmente "javadocs".

Todo el paquete ejem08 está documentado de esta manera. Puede mirar esta documentación del paquete ejem08 pulsando este botón: . Esta documentación se creó haciendo esta llamada desde la línea de comandos:

javadoc -private -d ejem08/docs *.java

Es importante que el alumno aprenda a documentar sus programas, por tal motivo uno de los ejercicios de esta unidad le pide precisamente que escriba la documentación detallada de uno de sus programas y cree el "javadoc" correspondiente. JavaDoc permite documentar no sólo archivos o clases sino también paquetes y proyectos completos.

Análisis de calculadora.java.

1) Interfaz de usuario

Dejando de lado los comentarios en el archivo, veamos primero el método main. Lo primero a destacar es que la comunicación con el usuario se realiza a través de la corriente de entrada desde el teclado, System.in, y la de impresión a la consola, System.out. Esto es lo que en realidad define a una aplicación de este tipo:

En una aplicación de línea de comandos la interfaz de usuario es la consola y el teclado. Más explícitamente, en este tipo de aplicaciones el usuario escribe en la consola y pulsa <intro> para enviar lo que escribió al programa a través de la corriente System.in, el programa procesa la información y contesta al usuario enviando su respuesta a la consola a través de la corriente System.out.

Es verdad que en este ejemplo y en casi todas las aplicaciones la corriente de entrada se utiliza a través de una subclase de tipo BufferedReader, pero esto no cambia el hecho básico de que la información fluye a través de System.in.

Simbólicamente podemos representar la comunicación entre el usuario y un programa de línea de comandos así:

System.out           pantalla
programa   -->   consola  -->  usuario

y en sentido inverso se realiza así:

teclado            System.in
    usuario --> consola   -->   programa

2) Interfaz de programación (el API)

El segundo hecho a destacar es la programación estructurada y orientada a objetos que se observa en el propio método main. En este método se crea un objeto C de la clase calculadora que es precisamente la clase que este archivo define y luego hace llamadas a varios métodos del objeto C para comunicarse con él. Los métodos de C utilizados en main son entrarValor, definirOperador y realizarOperación. Observe que éstos son algunos de los métodos públicos de la clase calculadora. En main se organiza cómo y cuando se hacen las diversas llamadas a estos métodos para integrar todo en una interacción útil y eficiente. Los métodos públicos de calculadora constituyen lo que se denomina el API (Aplication Public Interface) o interfaz pública de la clase calculadora. Lo que cada uno de los métodos del API hace puede intuirse del nombre de cada método y no vamos a explicarlo aquí. Si el alumno tiene alguna duda sobre uno de esos métodos, debería poder resolver su duda estudiando el código del método en cuestión pues a estas alturas ya debe entender ese código perfectamente.

3) Interacción

Es importante destacar que en las aplicaciones de línea de comandos la interacción es un diálogo entre el programa y el usuario que procede paso a paso en el tiempo. Según los mensajes del usuario el programa puede tomar decisiones, presentarle respuestas y preguntas al usuario, pero siempre una a una. Es difícil diseñar una interacción de este tipo cuando no es muy simple. Para programas que requieren interacciones complejas es recomendable utilizar una interfaz gráfica que permite una comunicación más cómoda y donde el usuario tiene todas sus opciones a la vista.

4) Utilidad

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 gráficas o 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 aunque podrían ser gráficas es más conveniente escribirlas como aplicaciones para línea de comandos por diversas razones. A veces no vale la pena hacer el esfuerzo de crear una interfaz gráfica y resulta más rápio y eficiente hacer un programa de línea de comandos. La interfaz de línea de comandos a veces es más conveniente que una interfaz gráfica, por ejemplo cuando sólo se desea que el programa realice algunos cálculos y devuelva unos resultados o cuando el intercambio de información entre el programa y el usuario son cadenas de texto en ambas direcciones. A veces comunicarse por la línea de comandos usando sólo el teclado es más rápido que moviendo el ratón y teniendo que hacer varios clicks en diversos componentes y apuntando delicadamente para no errar la elección. Sin embargo las aplicaciones que requieren una interacción compleja con el usuario deben escribirse como aplicaciones gráficas.

Los applets son una forma de aplicación gráfica. La siguiente sección muestra cómo puede hacerse una calculadora en un applet.

 

Aplicaciones con interfaz gráfica

Las aplicaciones con interfaz gráfica en Java pueden ser applets o programas autónomos. Gracias a la programación estructurada y orientada a objetos, el API de la calculadora para línea de comandos puede utilizarse como base para calculadoras gráficas.

La calculadora en un Applet

El applet insertado a continuación es una calculadora gráfica basada en la clase calculadora creada en la sección anterior.

La interfaz de usuario es gráfica en lugar de basarse en la línea de comandos como se hacía en nuestra primera calculadora, pero el código que realiza las operaciones es el mismo. Veamos cómo se ha construido la calculadora en un applet:

Análisis de la Calculadora Gráfica

1) Interfaz de usuario (componentes y eventos)

En primer lugar, la interfaz de usuario es gráfica. La comunicación entre el programa y el usuario se realiza usando los botones colocados en el applet y una etiqueta que aparece en la parte superior y servirá de pantalla, es donde se va escribiendo el número que el usuario define con los botones y donde aparece el resultado de una operación. Este tipo de interfaz gráfica se inventó cuando se inventaron las calculadoras electrónicas, mucho antes de que existieran ordenadores con un despligue gráfico que ahora permiten simular esa misma interfaz de usario con dibujos en la pantalla.

Hay dos aspectos distintos que deben distinguirse en una intefaz gráfica: los componentes gráficos (botones y etiquetas en este caso) y los eventos que se generan cuando el usuario interactúa con esos componentes gráficos usando el ratón. En este programa el usuario sólo puede hacer click en los botones de la calculadora. Pero cuando aparecen otras componentes como listas, campos de texto editables, selectores, etc... el usuario puede realizar otras operaciones con el ratón. Todas estas acciones del usuario con el ratón sobre los componentes gráficos se interpretan en un programa Java como Eventos. Los eventos son necesarios para que el programa se entere de lo que el usuario hace.

Simbólicamente podemos representar la comunicación entre usuario y programa en una interfaz gráfica así:

    cambios de estado                   pantalla
    programa   -->    componentes gráficos    -->     usuario

y en sentido inverso se realiza así:

ratón (y teclado)                    eventos
    usuario    -->   componentes gráficos   -->   programa

Es decir, el programa modifica el estado de los componentes gráficos para dar información al usuario. Esta información el usuario la recibe visualmente a través de la pantalla en la que están dibujados los componentes gráficos. En sentido opuesto el usuario interactúa con los componentes gráficos usando el ratón y éstos informan al programa lo que el usuario ha hecho mediante los eventos.

Reuniendo las dos descripciones simbólicas podemos comparar ambas:

Línea de Comandos

Interfaz gráfica.

System.out           pantalla
programa  -->   consola   -->  usuario

cambios de estado                       pantalla
programa   -->    componentes gráficos  -->   usuario

teclado            System.in
usuario --> consola   -->   programa

ratón (y teclado)                       eventos
usuario --> componentes gráficos   -->    programa


y hacer estas identificaciones:

Interfaz Línea de comandos Interfaz gráfica
Lo que el usuario ve consola componentes
Lo que el usuario mueve teclado ratón (y teclado)
Lo que el programa usa para enviar información System.out estados de los componentes
Lo que el programa usa para recibir información System.in eventos


Los eventos son pues una parte tan fundamental de una interfaz gráfica como el System.in lo es para un programa de línea de comandos. Por este motivo en Java, y sobre todo a partir de Java 1.1, los eventos reciben un tratamiento especial muy completo. En este primer curso sólo presentarems un tipo de evento llamado ActionEvent y que es el que produce por ejemplo un click en un botón. De hecho la calculadora gráfica sólo utiliza este tipo de eventos. Por otro lado, los ActionEvents  son los más utilizados. Pero hay otros como MouseEvent, ItemEvent, etc... El estudio de los componentes gráficos y los eventos constituye una parte muy importante del segundo curso de Java: Java Intermedio. En esta última unidad sólo presentaremos los componentes gráficos y eventos que se usan en la calculadora gráfica.

En calcApplet.java el alumno podrá observar que sólo hay dos métodos:

public void init()

en donde se realiza la construcción de la calculadora gráfica agregando los botones y la etiqueta que servirá de pantalla o despliegue y

public void actionPerformed(ActionEvent e).

en donde se interpretan los eventos.

2) Interfaz de programación (el API)

La interfaz de programación de una calculadora gráfica es la misma que la de la calculadora para línea de comandos. Toda ella se encuentra en calculadora.java.

3) Interacción

La programación de la interacción en un programa gráfico se realiza interpretando los eventos. En el caso de ActionEvents esto se realiza en el método

public void actionPerformed(ActionEvent e)

El alumno podrá comprobar mirando el código de calcApplet que en este método se interpretan los eventos, es decir, se convierten los clicks del usuario en números u operaciones. Para ello se hacen llamadas al API (o sea a los métodos públicos ) de calculadora.class. Al final del método actionPerformed se actualiza la "pantalla" de la calculadora poniendo en ella el número en construcción o el resultado según el caso.

4) Utilidad

Las aplicaciones gráficas son útiles en muchos casos. La mayoría de programas informáticos hoy en día tienen una interfaz gráfica. Por este motivo un programador debe aprender a programar muy bien los componentes gráficos y eventos. El segundo curso de Java trata precisamente de esto.

El alumno podrá observar que sólo hay dos métodos implementados en calcApplet. Uno es init() que es donde se construye la interfaz gráfica y otro es actionPerformed que es donde se interpretan los clicks del usuario y se convierten en números u operaciones.

La calculadora como un programa Windows

Teniendo una calculadora gráfica como la que desarrollamos en la sección anterior en forma de Applet, es muy fácil crear un programa independiente Windows que sea una calculadora. Este sencillo código logra este objetivo:

Este programa puede arrancarse desde la consola escribiendo:

java ejem08.calcWin

También podemos arrancarlo como una ventana desde este botón que en realidad es un applet:

El código del applet-botón que lanza la calculadora es muy sencillo:

 

Programación gráfica

Para crear un programa sencillo con una interfaz gráfica se suelen seguir estos pasos que explicamos aprovechando como ejemplo el código de calcApplet y calcWin.

  1. Decidir si la aplicación será un applet o una aplicación independiente. En el primer caso se creará una subclase de Applet, en el segundo caso se creará una subclase de Frame (o de JFrame si se desea utilizar las herramientas swing). En la unidad 6 se estudiaron algunos aspectos de los applets, en particular cómo se utilizan y cómo se les pueden pasar parámetros. A una aplicación gráfica independiente se le suelen pasar pocos parámetros por línea de comandos, si se necesitan muchos se suele crear un archivo .ini en donde se escriben los parámetros.
  2. Implementar los métodos de arranque. En el caso del programa independiente hay que implementar el método
    public static void main(String[] args).
    En el caso del Applet hay que implementar los métodos init(), start() y posiblemente stop().
    Los pasos 3, 4 y 5 que se describen a continuación suelen hacerse en el método main o en el método init según se trate de una aplicación independiente o de un Applet.
  3. Agregar un despliegue gráfico o Layout al Applet o al Frame según el caso para acomodar en él las diversas componentes que se van a utilizar.
    En el caso de calcApplet se pone un BorderLayout y se agrega al norte la etiqueta que servirá de pantalla de la calculadora y en el centro se agrega un Panel al cual se le pondrán los botones. Para ello se pone al Panel un   GridLayout de 4 columnas y 5 filas.
    En el caso de calcWin solamente se pone un GridLayout de 1x1 y en él se pondrá un objeto de calcApplet.
    Si se pone un Layout nulo llamando a
    setLayout(null)entonces se pueden acomodar los componentes definiendo su posición y tamaño mediente el método setBounds(int x,int y, int width,int height).
  4. Construir los componentes e inicializarlos. En el caso de calcApplet se crea la etiqueta "pantalla" y se definen sus características y se crean los botones con las etiquetas deseadas y se acomodan en el Panel del centro. También se crea una etiqueta fija que se coloca al sur.
  5. Se agregan como ActionListener el propio Applet a todos los botones mediante el método addActionListener(ActionListener al). Ésta es la manera de indicar a los botones que cuando reciban un click hagan una llamada al método actionPerformed del ActionListener al. Sin esto el programa no respondería a las acciones del usuario. En general este paso consiste en agregar a los componentes activos nuestra clase como escucha de los diversos eventos que deseemos escuchar e interpretar.
  6. En calcApplet se especifica que implementa la interfaz ActionListener y se escribe el método actionPerformed que es el método único de dicha interfaz. En general este paso consiste en implementar todas las interfaces correspondientes a los escuchas de eventos como MouseListener, ItemListener, WindowListener, etc... Estas interfaces tienen a veces un solo método como el caso de ActionListener, pero en otros casos pueden tener varios como el caso de WindowListener que el alumno puede ver implementado en calcWin.    

Para poder realizar los pasos 3, 4, 5 y 6 es necesario utilizar el API de Java, específicamente los paquetes java.awt y java.awt.event. Para una programación gráfica avanzada es conveniente usar los paquetes javax.swing y javax.swing.event. Con paciencia y consultando mucho la documentación se puede crear cualquier programa gráfico a partir de las bases explicadas en esta unidad. Sin embargo la magnitud de estos paquetes hace conveniente estudiar detenidamente algunos detalles del tema. Para ello (y algo más) se ofrece el segundo curso de Java: Java Intermedio.