| |
Boletín de problemas 5
Todos los cádigos
y las imágenes se han elaborado con software
Java .
Fecha de entrega: viernes 22 de
marzo 2002
Problema 1: swing, interfaces
y clases internas. [15%]
Como preparación para el
problema 2 siguiente, tiene que escribir una aplicación
Swing sencilla que utilice una clase interna anónima
para controlar la aplicación.

- Cree una clase Pow2Frame que
expanda JFrame
- Defina los miembros de la
clase que necesitará:
- Un método main() de
tres líneas, como en el material de clase
- Un constructor que:
-
Obtenga el contentPane
-
Cree el panel con los botones,
etc. y los añada a la ventana
-
Cree la etiqueta, el campo
de texto y el botón y los añada
a su panel
-
Comprima el marco a un
tamaño aceptable
- Dentro del constructor, debería
crear una clase anónima interna:
i. ActionListener, con un método actionPerformed()
para el botón "Double". El método
debería:
- Leer el valor String
actual del campo Value
- Convertirlo en un entero
(Véase, Integer.parseInt(String
s))
- Doblarlo
- Convertirlo de nuevo
en un String. (Véase, Integer.toString(int
i))
- Definir el campo Value
con el nuevo String
No se preocupe por lo que suceda
si el campo no contiene un entero válido.
Problema 2. Swing. [85%]
Tiene que escribir una interfaz
gráfica de usuario para el sistema de planificación
del servicio de autobús que codificó en
el boletín de problemas 1. Hemos convertido
el programa que realizó en la tarea 1 en una
clase BusSystem con los campos y métodos pertinentes
que usted puede utilizar para los cálculos de
este ejercicio. Descárguelo de la página
web del curso 1.00.
La interfaz gráfica de usuario
debe tener un aspecto general similar a éste:
Conviene que la interfaz de usuario
pida a éste que introduzca los siguiente datos:
-
La variación en el tiempo
de desplazamiento del autobús, mediante un
campo de texto. (Emplee valores de 0 a 10 minutos
como prueba)
-
La variación en las
tarifas de aparcamiento del aeropuerto de Logan,
mediante una lista desplegable con los valores 0.00,
2.00, 4.00, 6.00, 8.00 y 10.00. (Recuerde convertirlos
de dólares a centavos antes de utilizarlos
en el análisis).
-
El peso objetivo que se va
a utilizar en el análisis, mediante un campo
de texto. (Utilice los valores 1.0 a 4.0 como prueba)
La interfaz debe tener también
un botón Calculate para realizar
los cálculos y mostrar el resultado, y un botón
Quit para salir del programa. La interfaz
debe presentar un dibujo en el que se muestren:
-
Los límites exteriores
(L2) del área de servicio, incluidos
los cortes radiales
-
Los límites interiores
(L1) del área de servicio
-
Las rutas, mostradas a escala
(L1 +5), que salen desde el aeropuerto
de Logan, y separadas por el ángulo adecuado,
basadas en el resultado óptimo del análisis
del espaciado de ruta
-
Un etiqueta String para el
aeropuerto de Logan
-
El intervalo, el importe del
billete y el número de rutas, como Strings
-
El número de usuarios,
los ingresos y el coste, como Strings
Puede elegir libremente los colores,
las fuentes, el tamaño, etc. No es necesario
que tenga un aspecto elegante; con tal de que sea correcto,
no importa que sea sencillo.
A continuación, le sugerimos
un posible esquema del programa:
- Crear una clase BusFrame que
expanda JFrame
- Defina los miembros de la
clase que necesitará:
-
Botones, listas desplegables
y campos de texto
-
Un panel que albergue los
botones, las listas desplegables y los campos
de texto
-
Una referencia a un objeto
BusDrawing (escribirá la clase más
adelante), que expanda JPanel y contenga el
dibujo
-
Una referencia a un objeto
BusSystem que haga los cálculos
-
Tamaño del marco
(x, y)
- Un método main() de
tres líneas, como en el material de clase
- Un constructor que:
-
Obtenga el contentPane
-
Cree el panel con los botones,
etc. y los añada a la ventana
-
Cree el objeto BusSystem
-
Cree el objeto BusDrawing
y lo añada a la ventana
-
Cree los campos de texto,
las listas desplegables, las etiquetas y los
botones y los añada a su panel
- Dentro del constructor, debería
crear dos clases anónimas internas:
i. ActionListener, con un método actionPerformed()
para el botón de cálculo. El método
debería:
-
Leer el valor actual de la
lista desplegable y de los campos de texto
-
Invocar el método de
cálculo en el objeto BusSystem. Seguramente
tendrá que utilizar setParam() y optimize().
-
Invocar el método busLines()
en el objeto BusDrawing, que genere un vector de
las formas que se van a dibujar (véase más
abajo)
-
Invocar el método repaint()
del objeto BusDrawing (que no es necesario que escriba)
para dibujarlo.
ii. ActionListener, conun método
actionPerformed() para el botón Quit. El
método debería llamar a System.exit(0).
- Crear una clase BusDrawing que
expanda JPanel
- Defina los miembros de la
clase que necesitará:
-
Vector de formas (arcos,
líneas) para dibujar
-
Referencia al objeto BusSystem,
del cual obtendrá el espaciado de ruta,
etc. que necesitará para su dibujo
- Un constructor, que cree un
Vector vacío y tome una referencia BusSystem
como argumento
- Un método busLines()
que:
-
Cree el límite exterior
como en el objeto Arc2D.Double. Véase Javadoc;
observe que el constructor de arcos interpreta
los ángulos en grados. Imagine que el límite
exterior va de 64 a 296 grados. Utilice el
parámetro Arc2D.PIE para el tipo de arco.
-
Cree el límite
interior como otro objeto Arc2D.Double. También
va de 64 a 296 grados. Imagine que su radio es
siempre la mitad del límite exterior.
-
Cree el número correcto
de rutas como objetos Line2D.Double. Utilice una
regla simple para dibujarlas. Dibuje la primera
ruta a 64 más el espaciado de ruta. Si
el espaciado de ruta fuese 40 grados, por ejemplo,
la primera ruta se dibujará a 104 grados. Continúe
generando líneas mientras el ángulo
sea menor de 296 grados. Como el número
de rutas no es un entero, una simple aproximación
es suficiente. Dibuje las líneas
en la escala correcta. Tendrá que utilizar
Math.sin() y Math.cos(); recuerde que sus argumentos
están en radianes.
- Un método paintComponent(),
que anule el método JPanel paintComponent().
Debería:
-
Invocar siempre la superclase
paintComponent()
-
Obtener los 6 resultados
y medidas de rendimiento del objeto BusSystem
que necesita mostrar. Utilice el método
drawString() para mostrarlos
-
Etiquetar el aeropuerto Logan
en el centro del círculo
-
Ejecutar un bucle a través
del Vector de formas generadas en busLines() e
invocar el método draw() method en cada
una. Elija los colores, el ancho de línea,
etc. que quiera.
- Hemos vuelto a escribir
la solución al boletín de problemas
1, para convertir ese programa en una clase BusSystem. Es
un proceso rápido: lo que hicimos es:
- Convertir a todos los parámetros
de entrada (costes, coeficientes, distancias,
etc.) en miembros privados de la clase. Inicializar
todos ellos a los mismos valores utilizados en
el problema 1, excepto b, x, e y,
cuyos valores variaremos tal como hicimos en el
ejercicio 1. No necesitamos yMin, yMax
oyIncr, porque no ejecutaremos bucles sobre
valores de y.
- Hacer que todos los resultados
(intervalo, precio del billete, etc.) y las medidas
de rendimiento (número de usuarios, ingresos,
etc.) sean miembros privados de la clase. No inicializarlos.
- No es necesario que hagamos
miembros de la clase a las variables intermedias
(A0, B0, etc.); pueden ser variables locales en
el método optimize(), descrito más
adelante.
- Crear un constructor que
tome b, x e y como argumentos
y defina las variables privadas apropiadas. También
escribimos un método setParameters() que
fijase estas 3 variables.
- Crear un método llamado
optimize() que calcule todos los valores intermedios,
valores óptimos y estadísticas de
rendimiento para dicho valor de y. Para
ello se utiliza el mismo código que ya
escribimos para el ejercicio 1. Elimine el bucle
sobre el peso objetivo y; esa lógica
de control será gestionada por la clase
que llame a nuestro método optimize().
- No necesitamos ninguna de
las entradas de JOptionPane, etc. La interfaz
gráfica de usuario que escriba en este
trabajo se encargará de eso.
- Escriba un conjunto de métodos
getXXX() para obtener los valores óptimos
y las estadísticas de rendimiento. Se trata
simplemente de métodos de una línea
que devuelven la variable privada pertinente. Los
necesitaremos para mostrar los resultados.
- Eso es todo. Casi no
hemos escrito código nuevo. Esta clase
no es tan general como nos gustaría, pero
es suficiente para esta tarea. En un mundo perfecto,
con esta clase se podrían definir todos
los parámetros (a través de métodos
define) así como obtenerlos (a través
de métodos get), etc. Hacer todo
esto es sencillo pero tedioso y no es necesario
para este ejercicio.
La clase BusFrame debería
tener unas 100 líneas de código, y
la clase BusDrawing es un poco más corta. Le
facilitamos la clase BusSystem, que también
tiene unas 100 líneas de código.
Fase de prueba: haga
pruebas con las variaciones temporales de 0 a 10 minutos,
variaciones en la tarifa dle aparcamietno de 0$ a 10$,
y en los objetivos de 1.0 a 4.0. Si sobrepasa estos
límites, es posible que el modelo se salga de
su campo de validez. Hemos simplificado el modelo para
el ejercicio, por lo que no es especialmente sólido.
Entrega del trabajo
Requisitos
- Problema 1: solamente por correo
electrónico. No es necesario entregarlo en
papel.
- Problemas 2 y 3: copia en papel
y copia electrónica de TODOS los códigos
fuente (todos los archivos con la extensión
.java).
- Incluya en TODOS los archivos
que presente su nombre, el nombre de usuario, la sección,
el nombre del profesor ayudante, el número
de trabajo y una relación de las personas con
las que haya comentado el boletín de problemas.
- NO entregue copias electrónicas
o en papel de código compilado (archivos .class).
Sanciones
- Por pérdida de copia
en papel: -10% de la puntuación del boletín
de problemas.
- Por pérdida de copia
electrónica: -30% de la puntuación del
boletín de problemas.
- Por entrega fuera del plazo:
-20% de la puntuación del boletín de
problemas si es un día de retraso. Por
más de un día de retraso = NO SE PUNTUARÁ
|