Unité IN3S02 - TP3
Enoncé

Durée : 3 h

1- OBJECTIFS


2- TRAVAIL A REALISER

Nota : le travail demandé doit être terminé, en séance ou en hors séance.

2.1- Créer un répertoire de travail

Créer un répertoire IN3S02-tp3 dans votre répertoire racine. C'est dans ce répertoire que devront être stockés tous les programmes Java et exercices relevant de ce tp.

 

2.2- Exercice : Projet "clock-display"

2.2.0- Préparer l'environnement de travail

Créer un répertoire clock-display dans le répertoire IN3S02-tp3.

Hors Bluej, charger le fichier clock-display.zip lié à cet énoncé (cliquer sur le lien), et l'enregistrer sous ce nom dans le répertoire IN3S02-tp3/clock-display. Ouvrir le fichier IN3S02-tp3/clock-display/clock-display.zip. Il contient deux fichiers sources java : ClockDisplay.java et NumberDisplay.java. Les en extraire (bouton Extract) et les enregistrer dans le répertoire IN3S02-tp3/clock-display

Lancer Bluej et ouvrir, en tant que projet non Bluej, le répertoire IN3S02-tp3/clock-display (et non IN3S02-tp3/clock-display/clock-display.zip !!, ce qui génèrerait une erreur d'extraction, BlueJ ne sachant pas lire des .zip) [ menu Project, choix Open Non BlueJ ..., en veillant à bien rester à l'extérieur du répertoire clock-display et à ne pas y descendre].

 

2.2.1- Découvrir et essayer le projet clock-display

 

Ce projet simule la gestion et l'affichage d'une horloge digitale heures-minutes. La classe NumberDisplay définit un compteur à deux chiffres avec limite : elle permettra de représenter le compteur des heures d'une part et le compteur des minutes d'autre part. La classe ClockDisplay définit une horloge digitale : le champ displayString simule l'organe d'affichage de l'horloge ; la méthode timeTick, qui incrémente les minutes, devra être activée manuellement mais aurait vocation a être déclenchée périodiquement par un timer.

Créer une horloge digitale (i.e. une instance de la classe ClockDisplay) de valeur initiale 13h57 [ clic droit sur la classe puis choisir l'action new ClockDisplay(hour, minute) ]. Inspecter l'état de l'objet créé [ clic droit sur l'objet puis choisir l'action Inspect ] : on remarque que la valeur du champ minutes (respectivement hours), étant de type objet, est une référence à un objet et non l'objet lui même. Sélectionner le champ minutes dans la fenêtre d'inspection et en demander l'inspection [ bouton inspect de la fenêtre d'inspection ] : on visualise maintenant l'état de l'objet attaché au champ minutes. Les champs limit et value de cet objet, étant de types primitifs, stockent directement leur valeur : 60 et 57 respectivement.

Ne pas fermer les deux fenêtres d'inspection qui viennent d'être ouvertes, et invoquer la méthode timeTick() de l'objet horloge. Observer les modifications d'état des objets inspectés. Activer la méthode timeTick() plusieurs fois jusqu'à ce que le champ displayString ait pour valeur "14:00".

Etudier précisément le code des classes NumberDisplay et ClockDisplay.

2.2.2- Construire le diagramme des objets

 

Bien distinguer (important) :

Le diagramme des classes, qui montre les classes d'une application et leurs relations entre-elles. Il représente une vision statique du programme. Il est visualisé dans la fenêtre principale de BlueJ.

Le diagramme des objets, qui montre les objets et leurs relations à un moment donné lors de l'exécution d'une application. Il représente une vision dynamique du programme : l’état des objets en mémoire à un instant donné. BlueJ ne visualise pas le diagramme des objets mais, grâce à la possibilité d'inspecter les états des objets, permet de se représenter ce diagramme.

 

Etre capable de visualiser mentalement le diagramme des objets est essentiel pour bien comprendre le fonctionnement d’un programme Java !

Dessiner sur papier le diagramme des objets à cet instant.

2.2.3- Modifier le format de l'horloge

 

Le projet clock-display affiche une horloge 24-heures : 00:01 ... 23:59. On souhaite pouvoir afficher aussi, au choix, une horloge 12-heures : 01:00 ... 12:59 suffixé par am ou pm selon la demi-journée (par convention 12:00 am représente minuit et 12:00 pm représente midi). Le passage d'un style d'affichage à l'autre doit  pouvoir se faire à tout instant. Modifier la classe ClockDisplay en conséquence (il y a deux grandes possibilités, l'une étant meilleure que l'autre : soit modifier la représentation interne profonde de l'horloge, soit modifier la fonction d'affichage) et tester le bon fonctionnement.

 

2.2.4- Modifier l'heure initiale

 

Le constructeur ClockDisplay() initialise l'heure à 00 h 00 mn par défaut. On souhaite plutôt que l'heure initiale soit l'heure réelle courante (i.e. l'heure de création de l'objet horloge). Pour cela, on va rechercher dans les bibliothèques standard des méthodes permettant d'accéder à l'horloge système. Les paragraphes suivants vous guideront.

Il y a deux grandes stratégies pour rechercher une méthode dans le vaste espace des bibliothèques standard Java :

si on a des pistes a priori : examiner des classes qui sont susceptibles de définir la fonctionnalité cherchée

sinon : rechercher dans l'index de la documentation générale en espérant y trouver un mot-clé qui orientera la suite

Dans tous les cas, la détermination de la classe (non abstraite) d'appartenance sera un passage obligé.

Se connecter au site http://java.sun.com/javase/6/docs/api/ qui fournit un index de tous les paquetages et classes des bibliothèques standard Java. Si la page web affichée ne fait pas apparaître 3 zônes, cliquer sur le bouton  Frames en haut de la page. Les 3 zônes affichent respectivement :

en haut à gauche : la liste des paquetages

à gauche : la liste de toutes les classes ou la liste des classes du paquetage sélectionné

au centre : le descriptif du paquetage ou de la classe sélectionnée.

La méthode que nous cherchons relève de mots-clés comme : clock, date, hour, time, ... . Exploitons par exemple le mot-clé date, un concept qui englobe la notion cherchée. Cliquer sur le bouton Index en haut de page, puis sur la lettre D, puis rechercher (commande ctrl-f) le mot-clé date. Plusieurs références sont trouvées : choisir celle qui renvoie vers la classe java.util.Date (car le paquetage java.util, comportant des classes utilitaires de base, est peut-être une bonne piste). Visualiser la classe Date et examiner ses méthodes. Les méthodes getHours et getMinutes, dont on a le descriptif, semblent répondre exactement à notre attente. Malheureusement, elles ne sont pas utilisables car obsolètes (Deprecated). Leur descriptif respectif fournit toutefois une solution de substitution pour chacune d'elle : calendar.get(Calendar.HOUR_OF_DAY) pour getHours par exemple. Cela nous renvoie donc à la classe Calendar. La visualiser. On remarque que son en-tête est : public abstract class Calendar. Le terme abstract signifie que cette classe n'est pas instanciable directement, et donc que ses méthodes non static ne sont pas utilisables directement. On va donc s'intéresser à une sous-classe non abstraite de la classe Calendar. Il n'y en a qu'une (voir la rubrique Direct Known Subclass) : la classe GregorianCalendar. Dans les exemples fournis, on trouve enfin la solution cherchée.

Modifier le constructeur ClockDisplay() pour obtenir la fonctionnalité souhaitée et tester le bon fonctionnement.

2.2.5- Ajouter un code

 

On souhaite ajouter à la classe ClockDisplay un champ code dont la valeur identifiera chaque instance de façon distinctive (un tel champ pourrait servir ultérieurement, par exemple, de code d'accès pour certaines méthodes). Le code, de type String, sera une chaîne d'exactement huit caractères, ainsi formée :

les 3 premiers caractères seront les 3 premiers caractères du nom de l'utilisateur (éventuellement complétés par des lettres tirées aléatoirement)

le caractère suivant sera le nombre de caractères du nom de l'utilisateur modulo 10

les 4 derniers caractères seront un entier naturel tiré aléatoirement

 

Exemple de code pour l'utilisateur Estienne d'Orves (16 caractères) : est60423


Ecrire une méthode privée qui sera appelée par chaque constructeur et instanciera le champ code. Elle procédera ainsi (sans utiliser de boucle) :

Saisir le nom de l'utilisateur dans une boîte de dialogue (utiliser la méthode showInputDialog de la classe javax.swing.JOptionPane) ;
Déterminer la longueur du nom (utiliser une méthode de la classe String) ;
Extraire la sous-chaîne formée des 3 premiers caractères (utiliser une méthode de la classe String) ;
Générer un nombre aléatoire au nombre de chiffres approprié (utiliser la classe Random du paquetage java.util) ;
Générer le code et l'enregistrer

 

Tester le bon fonctionnement de cette méthode (*** NOTA A LIRE : la fenêtre de dialogue peut être masquée par les autres!! ***).

 

2.2.6- Afficher l'horloge sous forme graphique

Charger dans le projet clock-display la classe GraphicalClockDisplay fournie (cliquer sur le lien pour l'ouvrir ; sous BlueJ, charger par add class from file). Prendre sommairement connaissance du contenu de cette classe mais bien comprendre les liens qu'elle établit avec la classe ClockDisplay. Réaliser les adaptations éventuellement nécessaires pour qu'une horloge graphique s'affiche lors de la création d'une instance de la classe GraphicalClockDisplay.

2.2.7- Terminer l'exercice

 

Sauvegarder le projet clock-display et le fermer.

 

2.4- Terminer la séance

 

Si pas fait antérieurement, sauvegarder les projets ouverts, puis fermer BlueJ [ menu Project, choix Quit ].

Si besoin, envoyer par mél à votre binôme, en fichiers attachés, tous les programmes *.java développés sous IN3S02-tp3.

Se déloger [ menu Démarrer - Quitter ]