Programación Avanzada.
Centro Superior de Informática.
Universidad de La Laguna.
2001-2002


Dibujar un Reloj.


En esta práctica se proponen escribir un programa que cree un marco que contenga un dibujo de un reloj que muestre la hora actual, así como la misma hora en formato numérico. La salida será similar a la siguiente:

imagen del reloj

La clase TimeZone permite representar una zona horaria. Se suele utilizar junto con las clases Calendar y DateFormat. Como se trata de una clase abstracta no se pueden generar directamente instancias de TimeZone. Así que para trabajar con ella, se puede realizar una llamada al método estático getDefault() que devuelve un objeto TimeZone que representa la zona horaria heredada del sistema operativo de la máquina anfitrión. O bien, se invoca al método estático getTimeZone() especificando como argumento la zona horaria deseada. Por ejemplo:

TimeZone tz = TimeZone.getTimeZone("WET");

Se puede obtener una lista de los nombres de las zonas horarias soportadas al llamar llamar al método estático getAvailableIDs().

La clase Locale representa una región política, geográfica o cultural que por lo general tiene un lenguaje singular y costumbres y convenciones distintas, por ejemplo, en el formato de las fechas, las horas y los números. Para crear un objeto Locale se puede utilizar el siguiente constructor:

Locale (String language, String country)

El primer argumento debe ser un código ISO válido de lenguaje. Se puede encontrar una lista completa de dicho códigos en:

www.ics.uci.edu/pub/ietf/http/related/iso639.txt o bien a través del siguiente enlace local.

El segundo argumento debe ser un código ISO válido para un país. Se puede encontrar una lista completa de dicho códigos en:

www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html o bien a través del siguiente enlace local.

La clase Locale también contiene varias constantes predefinidas. Por ejemplo, Locale.ENGLISH que se puede usar para las características locales del lenguaje inglés.

La clase java.util.Date representa las fechas y las horas. Permite trabajar con ellas de forma independiente del sistema y las representa con una precisión de milisegundos.

En la clase abstracta java.util.Calendar se definen métodos que convierten las fechas y las horas al formato de milisegundos y a partir de esta representación se puede  pasar a unidades como minutos, horas, días, semanas, segundos, meses y años, las cuales son más útiles para las personas. La subclase java.util.GregorianCalendar concreta a la clase Calendar para representar el calendario "normal" con los años numerados desde el nacimiento de Cristo.

La clase java.text.DateFormat aplica un formato y analiza las sintaxis de las fechas y las horas de acuerdo con las especificaciones de una región dada (Locale).
Las constantes FULL, MEDIUM, LONG y SORT se emplean para especificar la complejidad o simplicidad de la fecha y la hora con formato.

Puesto que la clase DateFormat es abstracta no se puede generar una instancia de la misma directamente, pero ofrece varios métodos estáticos que devuelven instancias de una subclase concreta que si se puede usar para aplicar un formato. El método getDateTimeInstance() devuelve un objeto DateFormat que aplica formatos tanto de fechas como de horas para una región específica:
public static final DateFormat getDateTimeInstance(int dateStyle, int timeStyle, Locale aLocale)
La aplicación java DisplayTime muestra por pantalla la fecha actual basándose en el idioma, la región geográfica y en la zona horaria.  El idioma, el país y la zona horaria se pasan como parámetros de la línea de comandos:
>java DisplayTime  es SP WET

Basándose en el programa anterior escriba un programa que:

  1. Muestre una ventana (frame)
  2. En dicha ventana ha de aparezcer una representación gráfica de un reloj mostrando la hora actual.
  3. También se ha de mostrar en la ventana la fecha y la hora en formato numérico.


El programa ha de ajustar el tamaño del reloj a las dimensiones del marco. Si se modifica el tamaño de la ventana, se llamará automáticamente al método paint() para que actualice el contenido de la ventana. Por lo tanto, el método paint() ha de mostrar el reloj según las proporciones de la ventana.

Para determinar el tamaño del marco en el que se ha de dibujar el gráfico usar el método getSize().

Para dibujar el reloj, es necesario dibujar un círculo y las manecillas de la hora, los minutos y los segundos. Para dibujar las manecillas se han de especificar los dos extremos de la línea. Uno es el centro del reloj (xcenter, ycenter) y el otro, por ejemplo, puede ser (secondx, secondy) para el segundero.

Sea s un entero que representa los segundos. El rango de valores de esta variable es 0 .. 59.  Utilizar el método get() de la clase GregorianCalendar para obtener los segundos de la hora actual.

Sea slength un entero que reprenta la longitud del segundero. Se le dará un valor proporcional al radio del reloj.

La fórmula para determinar las coordenadas enteras del extremo del segundero (secondx, secondy) es :

formula de (xsecond, ysecond)

Así, el segundero será la línea que une el punto (xcenter, ycenter) con (secondx, secondy). Algunos valores para la fórmula anterior son:

cuando s=0,      (secondx, secondy) = (xcenter, -slength + ycenter)
cuando s=15,    (secondx, secondy) = (slength + xcenter,  ycenter)
cuando s=30,    (secondx, secondy) = (xcenter, slength + ycenter)
cuando s=45,    (secondx, secondy) = (-slength + xcenter, ycenter)

La fecha se mostrará debajo del reloj. Utilizar la clase FontMetrics para determinar el tamaño de la cadena que representa la fecha/hora y mostrarla en el centro del marco.


Bibliografía.

[1] Y. Daniel Liang. "Introduction to Java Programming". QueE&T. 1999
[2] S. Davis. "Aprenda Java ya". McGraw-Hill. Microsoft Press. 1996.
[3] J. Gosling,  H. McGilton. "The Java Language Enviroment". A White Paper. Sun Microsystems. Java Soft. 1996.
[4] D. Flanagan. "Java en pocs Palabras". McGrawHill-O'Reilyy. 1998.
[5] J.F. Macary, C. Nicolas. "Programación Java". Eyrolles.