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 |
cambios
de estado
pantalla |
teclado
System.in |
ratón
(y teclado)
eventos |
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.
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.