Ejercicio 2. Desarrollar un applet/aplicación para la simulación del

Anuncio
Examen Final de Informática 2 (Curso 1998-99): Programación en Java
página 1
Ejercicio 2. Desarrollar un applet/aplicación para la simulación del
llenado de un depósito
En este ejercicio se trata de realizar un
programa en Java análogo a los
desarrollados en Visual Basic el curso
pasado. Este programa debe simular el
llenado y vaciado de un depósito, con un
caudal de líquido variable tanto de llenado
(entrada en la parte superior) como de
vaciado (salida en la parte inferior).
Este programa debe funcionar como applet y
como aplicación. El tamaño de la ventana o
del applet deberá ser 400 pixels de anchura y
500 pixels de altura.
El ejecutable de este ejercicio se llama
Deposito.exe y junto con los ficheros *.class
está en Q:\Infor2\ExJun99\Ejer2. Estos
ficheros deben copiarse al propio disco G: y
estudiar su funcionamiento con atención.
Obsérvese la ausencia de parpadeo o flicker
debida a la utilización de doble buffer. La
animación de este modelo utiliza 50
imágenes por segundo (una imagen cada 20
ms).
Figura 1. Llenado y vaciado de un depósito.
El usuario puede activar o detener tanto el
llenado como el vaciado del depósito. Las velocidades de llenado y de vaciado se controlan con
dos barras de desplazamiento horizontales, según puede verse en la Figura 1. El valor elegido
por el usuario en dichas barras se expresa numéricamente en dos cajas de texto (TextFields)
situados sobre las barras.
La altura alcanzada por el líquido varía entre 0 y 5000, y es indicada en la caja de texto situada
en la parte superior de la ventana. A la hora de dibujar el fluido, esta altura debe ser transformada
en una altura entre 0 pixels y la altura que tenga el panel en el que se dibuja, que puede obtenerse
mediante el método getSize(). Se puede aplicar para ello una simple regla de tres.
En la Figura 1 puede verse que existe también un botón Start/Stop que permite detener o activar
el movimiento del fluido. Cuando el fluido está entrando y/o saliendo el label del botón es Stop;
cuando la animación está detenida, el label del botón es Start. El label o rótulo del botón debe
cambiar de modo automático cuando se pasa de una condición a otra.
En este depósito es posible tener simultáneamente abiertas las válvulas de entrada y salida de
líquido, con lo cual a priori no se sabe qué es lo que va a pasar con el nivel: depende de la
apertura de dichas válvulas y de las leyes de la mecánica de fluidos.
Se utilizará la barra de desplazamiento de la izquierda para controlar la entrada del líquido, que
se supone se introduce por la parte superior del depósito, con un caudal proporcional a la
apertura de la válvula, dada por la propiedad value de dicha barra.
Mediante la barra de desplazamiento de la derecha se controlará la apertura de la válvula de
salida, la cual se sitúa en la parte inferior del depósito. Por ello esta válvula se comporta de
Examen Final de Informática 2 (Curso 1998-99): Programación en Java
página 2
modo distinto que la de entrada. El caudal de entrada es simplemente proporcional a la apertura
de la válvula de entrada, mientras que el caudal de salida es proporcional a la apertura de la
válvula y a la presión del líquido, o lo que es lo mismo, a la altura o nivel h del fluido en ese
momento. La constante de proporcionalidad es 1000.
Las dos barras de desplazamiento tienen unos valores mínimo y máximo de 0 y 100. Inicialmente
ambas están cerradas, esto es, su valor inicial es 0.
A efectos prácticos, se puede utilizar la siguiente fórmula para la variación de nivel en el
depósito:
h = h + Ae – h * As / 1000.0
(1)
siendo h la altura del líquido, Ae la apertura de la válvula de entrada y As la apertura de la
válvula de salida, estando comprendidos ambos valores (Ae y As) entre 0 y 100.
Para realizar este ejercicio se debe crear un proyecto llamado Ejer2 en el directorio del examen
ExJun99. La clase principal se llamará Deposito, y el fichero que la contiene Deposito.java. Para
poderlo utilizar como applet se deberá crear un fichero llamado Deposito.htm.
(0, 0)
miPanel
5 pixels
drawRect()
fillRect()
h
(d.width, d.height)
Figura 2. Forma de dibujar el depósito y el fluido.
Dibujo del depósito
La Figura 2 muestra cómo se debe proceder para dibujar el depósito y el fluido, en el interior de
un panel en el que se ha redefinido el método paint().
El panel, llamado miPanel en la figura, tiene unas dimensiones que el usuario no puede controlar
directamente. Hay que tener en cuenta que aunque la ventana (y el applet) tiene unas
dimensiones de (300x400) pixels, el tamaño de dicho panel irá cambiando a medida que se
Examen Final de Informática 2 (Curso 1998-99): Programación en Java
página 3
añadan otros controles a la ventana (botones, barras de desplazamiento, etc.). También cambiará
si se re-dimensiona la ventana. Por tanto, la forma de saber el tamaño del panel es utilizar la
función getSize(), que devuelve dos enteros con la anchura y la altura o bien un objeto d de la
clase Dimension, que es el caso que se supone en la Figura 2.
El depósito se dibuja con el método drawRect(), de modo que se deja un margen de 5 pixels
entre los cuatro lados del depósito y el panel.
El fluido se dibuja como un rectángulo relleno de color por medio del método fillRect(). Se
sugiere utilizar un color cuyas componentes son R=0, G=136 y B=202. El fluido es un rectángulo
de altura h cuyo lado inferior coincide con el del depósito. El fluido tiene una anchura inferior
en 1 ó 2 pixels a la del depósito, de modo que no “tapa” las líneas correspondientes a éste.
Recuérdese que la altura del fluido se mide siempre entre 0 y 5000, aunque a la hora de dibujar
habrá que cambiar las unidades a pixels para que el “0” represente el depósito vacío y el “5000”
el depósito lleno.
Realización progresiva del proyecto
Este ejercicio no es difícil, pero puede llegar a serlo si no se realiza con orden. Para ayudar en su
realización progresiva y ordenada se ofrecen cuatro ejecutables que representan cuatro estados
sucesivos de desarrollo del proyecto. Esto no quiere decir que haya que entregar varios
proyectos: sólo hay que entregar un proyecto, pero los siguientes ejecutables muestran una
forma práctica de desarrollarlo progresivamente.
1. Ejecutable Ejer2a. Este ejecutable se encuentra en el directorio Q:\Infor2\ExJun99\Ejer2a.
Su resultado se muestra en la Figura 3, en la que, aunque no se aprecie, el fluido está en
movimiento (con velocidad constante y por el momento no controlada). En este estado del
ejercicio se supone que se es capaz de dibujar el depósito con el fluido en movimiento dentro
de un panel.
2. Ejecutable Ejer2b. Se encuentra en el directorio Q:\Infor2\ExJun99\Ejer2b, y su resultado
se muestra en la Figura 4. En este caso se ha introducido la etiqueta “Nivel de Fluido:”, una
caja de texto que muestra el nivel del fluido y el botón “Start/Stop”. El botón permite que el
movimiento se pare y vuelva a arrancar.
3. Ejecutable Ejer2c. Se encuentra en el directorio Q:\Infor2\ExJun99\Ejer2c, y su resultado
se muestra en la Figura 5. En este caso se ha añadido la etiqueta, la caja de texto y la barra de
desplazamiento correspondientes a la válvula de entrada. Esto quiere decir que la velocidad
de llenado ya no es constante como en los ejecutables anteriores, sino que se controla con la
barra. Esto implica empezar a utilizar la fórmula (1) de la página 2 (con As=0).
4. Ejecutable Ejer2e. Se encuentra en el directorio Q:\Infor2\ExJun99\Ejer2d, y su resultado
debe ser ya el que se muestra en la Figura 1, en la que aparecen ya las dos barras de
desplazamiento y todos los demás controles. La única diferencia entre este ejecutable y el
definitivo es el parpadeo o flicker que aparece en el dibujo.
5. Ejecutable Ejer2. Se encuentra en el directorio Q:\Infor2\ExJun99\Ejer2, y es el estado
final del ejercicio, en el que se ha eliminado el flicker mediante la técnica del doble buffer.
Examen Final de Informática 2 (Curso 1998-99): Programación en Java
Figura 3. Ejecutable Ejer2a.
Figura 4. Ejecutable Ejer2b.
página 4
Figura 5. Ejecutable Ejer2c.
Examen Final de Informática 2 (Curso 1998-99): Programación en Java
página 5
Ejercicio 3: Aplicación JavaBurger. La nueva Hamburguesería
Universitaria.
El éxito de algunas grandes cadenas de hamburgueserías y el creciente número que de estos
establecimientos se están abriendo en nuestras ciudades ha llevado a muchos alumnos de esta
Escuela (al menos a todos los alumnos de Informática 2) a la conclusión de que se trata de un
amplio mercado donde vender programas informáticos.
La primera idea ha sido intentar realizar un programa para hacer los pedidos desde el mismo
establecimiento, pensando en poderlo hacer posteriormente a través de Internet. Esta última
consideración ha llevado a la conclusión de que el lenguaje ideal es Java y por lo tanto se ha
decidido realizar un prototipo para ver el nivel de
aceptación del programa. El prototipo se llamará
JavaBurger.
En el directorio Q:\Infor2\ExJun99\Ejer3 se
encuentra el fichero JavaBurger.exe y los
ficheros *.class, con los que se puede probar el
funcionamiento y los mensajes de salida del
programa a realizar. Se trata del modelo que hay
que imitar. El programa del alumno deberá
asemejarse lo más posible a este ejecutable.
En este directorio se encuentran los ficheros
JavaBurger.java,
VentanaCerrable.java
y
MiDialog.java que el alumno debe copiar al
directorio del ejercicio, que se llamará Ejer3.
Crea por tanto un nuevo proyecto llamado Ejer3
dentro del directorio del examen (G:\ExJun99) y
copia en él estos ficheros. Es importante no
utilizar los ficheros de igual nombre que los
Figura 6. Aplicación JavaBurger.
utilizados durante las prácticas ya que han
sufrido alguna modificación. El fichero JavaBurger.java contiene el esqueleto de la aplicación.
Este ejercicio consiste en desarrollar un programa que permita ir seleccionando distintos
productos (Bebida, Patatas y Hamburguesa) utilizando para ello la ventana gráfica mostrada en
la Figura 6. Estos productos seleccionados se van almacenando en una lista (Vector listaPedidos)
hasta que se finaliza un pedido pulsando el botón “Borrar cuenta”, con lo cual se comienza la
cuenta de un nuevo cliente. En cualquier instante que se pulse el botón “Mostrar Cuenta” se
mostrará el contenido de la lista en ese momento, lo cual no significa que se haya finalizado de
añadir productos a la cuenta; es posible seguir añadiendo productos, aunque no se permite
eliminar productos ya seleccionados. La única forma de eliminar un producto es borrar todos.
Descripción de las clases necesarias:
Además de los ficheros MiDialog.java y VentanaCerrable.java vistos en las prácticas, esta
aplicación necesita la clase JavaBurger y un conjunto de clases adicionales que representan a los
productos.
Examen Final de Informática 2 (Curso 1998-99): Programación en Java
página 6
Clase JavaBurger :
•
•
•
•
En ella se encuentra el método main() o programa principal de la aplicación y es la encargada
de dirigir la ejecución del programa.
Las variables miembro más importantes de la clase (es posible que se necesite alguna
variable adicional) son las siguientes:
À Vector listaPedidos: Es una variable de tipo Vector en la que se almacenarán los
productos seleccionados.
À Button bBebida, bPatatas, bHamburguesa, bMostrar y bBorrar: Variables de tipo
Button que corresponden con los botones mostrados en la Figura 6.
À static TextArea ta: Representa la caja de texto donde se muestra la cuenta del cliente. Se
ha utilizado una variable static para permitir que se pueda introducir texto desde
cualquier parte del código sin necesidad de una referencia concreta a un objeto de tipo
JavaBurger.
À Frame fr: Referencia utilizada para mostrar las distintas cajas de diálogo de la aplicación.
Las funciones miembro de esta clase son:
À void main( ): Inicializa la aplicación. No es necesario modificarla.
À void muestraCuenta( ): Muestra en la caja de texto (ta) la información de la cuenta. El
esqueleto contiene la información que permanece inalterable. El alumno debe incluir la
información de los productos elegidos.
À void setParentFrame( ): Método utilizado para indicar cuál es la ventana de la
aplicación. No se utiliza cuando se ejecuta como applet. No es necesario modificarla.
À void actionPerformed( ): Método encargado de ejecutar las acciones asociadas con los
distintos botones.
La distribución básica de la pantalla (Layout) se realizará del modo indicado en la Figura 7.
BorderLayout
GridLayout ( 2, 1)
GridLayout ( 1, 3)
FlowLayout(FlowLayout.CENTER)
TextArea
Figura 7. Organización de los Layout Managers.
Aprovechando las posibilidades de la programación orientada a objetos, se ha decidido establecer
una estructura de clases para representar los distintos productos. Dicha estructura de clases se
muestra en la Figura 8. La funcionalidad común a todos los productos se establece en la clase
Examen Final de Informática 2 (Curso 1998-99): Programación en Java
página 7
base, de forma que con una referencia a un objeto de la clase base se puede trabajar con objetos
de clases derivadas.
class Producto
void displayInfo();
double getPrecio();
class Bebida
int tipo;
double precioAgua;
double precioRefresco;
class Patatas
double precioPatatas;
class Hamburguesa
boolean queso, ketchup;
double precioQueso,precioKetchup;
double precioBase;
Figura 8. Estructura de clases.
Se presenta a continuación una descripción de las variables y funciones que debe tener cada
clase:
Clase Producto:
•
La clase base Producto es una clase abstract y no tiene variables miembro.
•
Los métodos de esta clase son void displayInfo(), que muestra en la caja de texto la
información sobre el producto y double precio(), que evalúa y devuelve el precio del
producto con las opciones elegidas.
•
En este caso no es imprescindible definir el contenido de estas dos funciones, ya que siempre
se utilizarán los métodos correspondientes de las clases derivadas.
Clase Patatas:
• Tiene una única variable miembro (double precioPatatas) que indica el precio de la ración de
patatas fritas (200 Ptas.)
• Debe tener un constructor por defecto, que únicamente asigna a la variable precioPatatas el
valor de 200 Ptas.
• Definirá los métodos getPrecio() (que devuelve el precio de la ración) y displayInfo() que
muestra en la caja de texto de la aplicación la información que puede verse en el modelo.
Clase Bebida:
• Tiene tres variables miembro: int tipo, double precioAgua y double precioRefresco. La
variable tipo indica qué bebida se ha seleccionado (0 agua y 1 refresco). Las otras dos
variables representan el precio del agua (100 Ptas.) y de refresco (250 Ptas.) respectivamente.
• El constructor de la clase (public Bebida(int tipo)) recibe el tipo de bebida seleccionada.
• Esta clase definirá los métodos getPrecio(), que devuelve el precio de la bebida elegida, y
displayInfo(), que muestra en la caja de texto de la aplicación la información que puede verse
en el modelo. En este caso la información a mostrar depende del tipo de bebida seleccionada.
Clase Hamburguesa:
• Tiene cinco variables miembro: double precioBase, double precioKetchup, double
precioQueso, boolean queso y boolean ketchup. La variable precioBase indica el precio de
la hamburguesa sin queso ni ketchup (300 Ptas.). Las variables precioKetchup y precioQueso
indican el suplemento a pagar por elegir estos ingredientes adicionales (100 y 50 Ptas.
respectivamente). Las variables boolean indican si se ha elegido o no esa opción.
Examen Final de Informática 2 (Curso 1998-99): Programación en Java
•
•
página 8
El constructor de la clase (public Hamburguesa(boolean ketchup, boolean queso)) recibe si
el cliente ha pedido la hamburguesa con ketchup (ketchup=true) y/o queso (queso=true).
La clase definirá los métodos getPrecio(), que devuelve el precio de la hamburguesa elegida
y displayInfo(), que muestra en la caja de texto de la aplicación la información que puede
verse en el modelo. Tanto el texto como el precio dependerán de si se ha elegido alguno de
los dos ingredientes adicionales.
Etapas en la programación de la aplicación:
A continuación se muestra el proceso que se debe seguir para la correcta realización del ejercicio:
1. Copiar y estudiar el funcionamiento del programa JavaBurger.exe
2. Crear el nuevo proyecto Ejer3 dentro del directorio del examen (G:\ExJun99) y copiar los
ficheros que se encuentran en Q:\Infor2\ExJun99\Ejer3. Ejecutar el programa y comprobar
que aparece la ventana de la aplicación sin botones y con una caja de texto en la ventana.
3. Realizar la distribución de la ventana gráfica incluyendo los botones en el lugar correspondiente. Comprobar que se visualizan correctamente aunque todavía dichos botones no tengan
ninguna funcionalidad.
4. Asociar los eventos de los botones para que sea la clase JavaBurger la encargada de
gestionar dichos eventos. En la función actionPerformed(), mediante sentencias de tipo if(),
comprobar qué botón ha sido pulsado. Para ello se puede mostrar el mensaje final asociado
con cada botón utilizando el método msgBox() de MiDialogOK. Los mensajes son: "Ha
pedido una bebida", "Ha pedido patatas fritas", "Ha pedido una hamburguesa", "Recoja su
ticket y espere en la mesa. Gracias" y "Preparado para un nuevo cliente", respectivamente.
5. Generar la clase Producto y la clase Patatas. Programar el botón “Patatas” de forma que
añada un objeto de tipo Patatas al vector listaPedidos.
6. Realizar desde el código correspondiente a “Mostrar cuenta” la llamada al método
muestraCuenta(). Programar el código de esta función de forma que se visualice mediante
llamadas a displayInfo() la información de la lista de productos junto con sus precios.
Simultáneamente realizar las llamadas al método getPrecio() para acumular el precio de los
productos de la lista.
7. Crear las otras dos clases: Bebida y Hamburguesa. Introducir en el método
actionPerformed() el código necesario para crear y añadir objetos a la lista.
8. Programar el código asociado con “Borrar cuenta” de forma que elimine el contenido del
vector listaPedidos, dejando éste preparado para un nuevo cliente.
En este punto el programa obtenido debería ser igual al modelo presentado.
A continuación se proponen una serie de modificaciones destinadas a mejorar nota. Crea un
nuevo proyecto Ejer3b y copia en él todos los ficheros del Ejercicio 3 de forma que no se
destruya "accidentalmente" el ejercicio anterior. Los siguientes puntos no es necesario realizarlos
en el orden propuesto. Las mejoras a realizar son:
9. Crea una nueva caja de diálogo (al estilo de MiDialogOKCancel o MiDialogOK) para
permitir seleccionar el tipo de bebida utilizando elemento de tipo Checkbox. Realiza la
llamada correspondiente desde el método actionPerformed().
10. Análogamente crea un nuevo diálogo donde sea posible seleccionar/deseleccionar las
opciones de las hamburguesas.
11. Añade un botón "Borrar producto" de forma que permita seleccionar y eliminar un elemento
añadido a la lista. Se considera suficiente el poder indicar en una caja de diálogo la posición
del producto a eliminar en la lista de productos añadidos.
Descargar