Un économiseur de fenêtre
Cet exercice est à la fois un exercice sur les threads et sur la gestion des événements dans une fenêtre.
Il s'agit de créer une classe, que l'on nommera Economiseur, dont les instances pourront servir d'économiseur pour une fenêtre de type Frame.
Plus précisément, supposons que dans le constructeur d'une classe appelée par exemple Fenetre étendant la classe JFrame, on ait inclus l'instruction :
new Economiseur(this, 20);
alors, si la fenêtre de nom fenetre est une instance de cette classe, on attend le phénomène décrit ci-après ; lorsque pendant 20 secondes consécutives, on ne provoque aucun événement dans fenetre ou un de ses composants (aucune utilisation de la souris ou de touche), la fenêtre est automatiquement recouverte d'une fenêtre ayant les mêmes dimensions, mais noir ou presque noir, servant donc d'économiseur d'écran sur la surface de fenetre. Il serait souhaitable de concevoir un dessin simple animé dans cet économiseur. Si l'on passe avec la souris sur l'économiseur, celui disparaît et on retrouve la fenêtre d'origine.
On définira :
- une classe nommée par exemple Ecran qui correspondra à la fenêtre servant d'économiseur ; cette classe étendra la classe JFrame. La classe implémentera Runnable si on veut y faire apparaître un dessin animé. Le constructeur de cette classe aura un paramètre de type JFrame : les instances de la classe Ecran se superposeront à la fenêtre donnée en paramètre. Une fenêtre "Ecran" doit disparaître dès que la "souris" l'effleure.
- une classe abstraite nommée Detecteur. Le constructeur de cette classe prendra en paramètre un JFrame, implémentera bon nombre de "listeners" et devra servir à ce que tout événement de type utilisation de la souris ou de
touches dans la fenêtre passée en paramètre conduise à l'exécution de la méthode abstraite detection de la classe Detecteur. Il faudra prendre garde à détecter non seulement les événements dans la fenêtre indiquée mais aussi dans ses sous-composants (bouton...), ainsi que sur des sous-composants ajoutés en cours d'exécution..
- une classe nommée Economiseur qui étendra la classe Detecteur et implémentera Runnable. Cette classe prendra en paramètre la fenêtre que l'on cherche à "économiser", appelée ici "cliente" et le temps en secondes au bout duquel, en cas d'inaction dans la fenêtre cliente, la fenêtre Ecran doit apparaître ; ce temps est appelé ici "délai". Le constructeur indiquera à sa super-classse (de type Detecteur) la fenêtre cliente et lancera, par une thread, la méthode run de la classe Economiseur ; cette méthode calculera toutes les secondes le temps écoulé depuis la dernière action dans la fenêtre "cliente" ; si ce temps est supérieur au délai, la méthode provoquera l'apparition de la fenêtre de type Ecran associée à la cliente et se mettra en attente (utilisation de la méthode wait). La méthode detection (qui, rappelons-le, est invoquée lorsqu'il se passe un événement dans la fenêtre cliente) notera l'heure au moment de son exécution et, si l'"ecran" est présent, "réveillera" (utilisation de la méthode notify) la thread en attente.
On pourra essayer l'économiseur sur n'importe quel "JFrame" .
Vous pouvez disposer d'un corrigé