rubensa.eu.org algo en qué pensar...

El contenido de este sitio es de libre distribución, siempre que se cite la fuente original. No está permitido su uso comercial sin previo aviso y si lo modifica o distribuye debe mantener esta licencia.

Inicio de sesión de usuario

3. Construyendo una Aplicación

Ahora que hemos visto los conceptos básicos, es hora de ponerlos manos a la obra.  En esta sección crearemos una sencilla aplicación de ejemplo: el juego de adivinar un número.  El objetivo de este juego es que el usuario adivine un número entero generado aleatoriamente entre 1 y 100 (incluidos) en el menor número de intentos.  Cada vez que el usuario realiza un intento incorrecto, la aplicación le dará una indicación sobre si su suposición fué superior o inferior al valor correcto.  Cuando el usuario adivina el número, se mostrará un mensaje "Congratulations!" (felicidades) y se le dará la oportunidad de jugar de nuevo.

Control de Flujo del Juego Adivina-Un-Número

Código Fuente:  El juego de adivinar un número se incluye como parte de la distribución estándar de Echo2.  En el archivo de Echo2 se pueden encontrar los ficheros del juego en la carpeta NextApp_Echo2/SourceCode/src/tutorialapp/numberguess.  Tiene un interés especial la clase ApplicationInstance, situada en NextApp_Echo2/SourceCode/src/tutorialapp/numberguess/src/java/echo2tutorial/numberguess/NumberGuessApp.java.  Querrás tener a mano una copia del código fuente para seguir esta lección.

NumberGuessApp


El interfaz de usuario del juego de Adivina-Un-Número se divide en tres clases, las cuales se encuentran en el archivo de código fuente de NumberGuessApp.java.  La clase pública NumberGuessApp proporcina la implementación de ApplicationInstance necesaria.  Las clases GamePane y CongratulationsPane se derivan del componente Echo2 ContentPane y representan, respectivamente, las pantallas de adivinación de número y fin del juego.

Control de Estado:  En este ejemplo, NumberGuessApp también se usa para el control de alto-nivel de la aplicación, esto es, el inicio de nuevos juegos y para mostrar el mensaje de felicitación de fin de juego.  Se han creado dos métodos para controlar este estado, startNewGame() y congratulate().

Inicialización:  El método init() de ApplicationInstance simplemente crea la instancia de Window (ventana) principal e invoca la método startNewGame() para iniciliar un nuego juego de usuario.

Componentes Derivados:  Las clases GamePane y CongratulationsPane extienden ContentPane.  Cada uno de estos componentes sobreescriben su constructor para configurarse a sí mismos creando y añadiendo Components (componentes) hijos y fijando sus propiedades durante la instanciación.  Esta práctica de extender Components es la recomendada.

El GamePane (panel de juego)

El GamePane es un componente que maneja una única "sesión de adivinación de número".  En su construcción, un GamePane genera el número aleatorio secreto que hay que adivinar.  Después añade a sí mismo un componente contenedor Column (columna) para separar sus Components hijos verticalmente.  Se añaden al Column varias Labels (etiquetas) para indicar el estado del juego, un TextField (campo de texto) en el que introducir el número, así como un Button (botón) de envío de la adivinación.  También se añade un Button adicional para proporcionar la opción de restablecer y comenzar un nuevo juego.

Gestión de Eventos:  La clase GamePane implementa ella misma la interfaz ActionListener.  Se registrará a sí misma como ActionListener de los botones "Submit Guess" (enviar adivinación) y "Start New Game" (inicar nuevo juevo).  Cuando el usuario pulse cualquiera de ellos, se invocará el método actionPerformed() y se le pasará un ActionEvent describiendo la pulsación del botón.  La implementación determinará el botón pulsado analizando el "Action Command" (comando de acción) proporcionado por el ActionEvent, que se corresponderá con el mismo valor fijado en los Buttons cuando se configuraron usando el método setActionCommand().

Manejando pulsaciones del Button "Submit Guess":  Si el método actionPerformed() recibe un evento con el comando "submit guess", indicando que se ha pulsado el botón "Submit Guess", se invocará el método processGuess() de GamePane.  El método processGuess() examinará el valor introducido en el TextField de entrada de adivinación.

Procesando Adivinaciones:  El método processGuess() primero comprobará si la suposición es inválida, esto es, si el usuario introdujo accidentalemnte algo diferente a un número, y mostrará un mensaje de error si es necesario ajustando el texto de la "status label" (etiqueta de estado).  Si la suposición es un valor entre 1 y 100, la siguiente cuestión será si es o no el número correcto.  Si el usuario ha conseguido adivinar el número correcto, se invoca al método congratulate() de NumberGuessApp.  De otro modo, el método determina si la asunción fué superior o inferior y actualiza las Labels (etiquetas) que muestran el número de intentos realizados y el menaje de solicitud que informa al usuario que debe realizar un nuevo intento.

Manejando pulsaciones del Button "New Game":  Si el método actionPerformed() recibe un evento con el comando "new game", que indica que se pulsó el botón "Start a New Game", se invocará el método startNewGame().  El método startNewGame() destruirá al GamePane acutal y lo reemplazará con uno nuevo (causando la generación de un nuevo número aleatorio y la inicialización a cero el número de intentfos fallidos).

Obtención de la ApplicationInstance actual:  Para poder reiniciar el juego o mostrar la pantalla con el mensaje de felicitación, se debe invocar un método de la ApplicationInstance.  Hay dos modos de obtener una referencia a la ApplicationInstance:  El primero consiste en obtenerla invocando el método getApplicationInstance desde cualquier Component que esté "registrado" actualmente a ella, significando esto que el Component es parte de la gerarquía que se muestra actualmente en la interfaz de usuario de la ApplicationInstance.
La segunda forma consiste en invocar al método estático ApplicationInstance.getActive(), que devuelve la ApplicationInstance del thread (hilo) actual.  En ambos casos con el valor devuelto se debe hacer un casting al tipo derivado apropiado, esto es, NumberGuessApp en nuestro caso.  En la clase NumberGuessApp se ha utilizado el último modo para obtener la ApplicationInstance.

El ContratulationsPane (panel de felicitación)

El CongratulationsPane es un ContentPane extremadamente simple que solamente muestra una pancarta "Congratulations!" (felicidades) además de presentar al usuario el número de intentos que le llevó adivinar el número secreto.  El panel proporciona un simple botón que se puede usar para iniciar un nuevo juego.  La gestión de eventos se realiza de fodo idéntico al presentado en el GamePane.

Powered by Drupal - Design by rubensa based on abac theme by Artinet