17/04/2017 LES APPLICATIONS DISTRIBUEES Cnam Projet 1 CONSERVATOIRE NAT IONAL LES APPLICATIONS DISTRIBUEES Par J. LAFORGUE IPSTCNAM Cycle C D E S ART S ET M ET IERS PROJET 1 Années 2004-2005 TOULOUSE J. LAFORGUE CENTRE REGIONAL MIDI - PYRENEES 1. DESCRIPTION On se propose de réaliser une classe Java permettant de gérer une grille graphique NxM dans laquelle on peut afficher et déplacer différents carrés de couleurs différentes. Cette classe sera utilisée dans le cadre du projet2. Vous pourrez alors soit réaliser le projet 2 avec ma correction soit avec votre réalisation (en ayant fait les corrections demandées). Les services de cette classe sont : ajouter un symbole dans la grille aléatoirement dans une case libre de la grille changer les noms des boutons de l'IHM passer en paramètre de la classe les traitements des boutons ajouter aléatoirement un élément dans une des cases libres de la grille déplacer un élément dans une des 8 directions sachant que la grille est gérée comme un Tore. Un déplacement consiste à effacer la case de départ et à dessiner dans la case d'arrivée. Cette classe gère un tableau d'entier à 2 dimensions contenant l'état de la grille: si 0 alors la case est libre si 1 la case contient un élément de couleur 0 si 2 la case contient un élément de couleur 1 ... On gère jusqu'à 10 couleurs différentes. ...... Cette classe est testée par un programme principal qui définit les traitements suivants accessibles en cliquant dans un des boutons : Créer 10 carrés de couleur 0 Créer 10 carrés de couleur 1 Créer un "agent" positionné aléatoirement dans la grille. Un "agent" est un objet de la classe Agent qui est un thread dont la méthode run consiste en un déplacement aléatoire dans les 8 directions. page 1 LES APPLICATIONS DISTRIBUEES Projet 1 17/04/2017 Par J. LAFORGUE Aperçu de la correction de l'IHM : 2. ARCHITECTURE Le projet doit être fait suivant l'architecture de répertoires et fichiers suivants : projet1 compil.sh run.sh GrillePP.java grille GrilleControleInt.java GrilleIHM.java agent Agent.java 3. TRAVAUX A REALISER On se propose de créer un package grille contenant les classes et interfaces suivantes : GrilleControleInt.java package grille; public interface GrilleControlesInt page 2 17/04/2017 LES APPLICATIONS DISTRIBUEES Projet 1 Par J. LAFORGUE { public void action(int num_action,GrilleIHM ihm); } Cette interface permet de définir l'action générique utilisée par chacun des boutons. num_action est le numéro du bouton (de 1 à 10) ihm est la grille IHM GrilleIHM.java Ce fichier contient au moins les 3 classes : public class GrilleIHM cette classe est la classe principale qui crée notre IHM class ControleAction implements ActionListener cette classe est une classe interne permettant de réaliser les actions des boutons de l'IHM class GrilleCanvas extends Canvas cette classe est une classe permettant de surcharger la méthode paint du canvas créé dans notre IHM afin de rafraichir automatiquement la zone graphique. Le code de ces 2 classes internes est le suivant: class ControleAction implements ActionListener { // l'ihm GrilleIHM _grilleihm; int _type; // Constructeur afin de designer le type d'action public ControleAction(GrilleIHM grilleihm,int type) { _grilleihm=grilleihm; _type=type; } // Traitement des actions public void actionPerformed(ActionEvent e) { if (_grilleihm.getAnyActions()!=null) { _grilleihm.getAnyActions().action(_type,_grilleihm); } } } class GrilleCanvas extends Canvas { GrilleIHM _g; public GrilleCanvas(GrilleIHM g) { _g = g; } public void paint(Graphics g) { page 3 LES APPLICATIONS DISTRIBUEES Projet 1 17/04/2017 Par J. LAFORGUE _g.afficherGrille(); } } Le constructeur de la classe GrilleIHM est de la forme : public GrilleIHM( int nbX, int nbY, GrilleControlesInt anyActions) nbX est le nombre de colonnes de la grille nbY est le nombre de lignes de la grille anyActions est l'interface des traitements des boutons La taille, en pixel, des cellules est égal à 15. Le nombre de boutons créés est égal à 10. L'IHM principal est un Panel qui est accessible par la méthode public Panel getPanel() Cette méthode est utilisée par GrillePP afin d'ajouter notre IHM dans une fenêtre principale (Frame) crée dans le programme principal. Ce panel est composé de 2 autres panels. Le premier contient les boutons, le deuxième contient le canvas (la grille). Afficher la grille consiste à effacer la zone graphique du canvas et à afficher la grille (lignes horizontales et verticales) puis à dessiner les carrés et les ronds en fonction des valeurs contenues dans le tableau à 2 dimension. Exemple de code pour afficher une ligne est : Graphics g = _canvas.getGraphics(); g.drawLine(x1,y1,x2,y2); Exemple de code pour afficher un carré rouge est : Graphics g = _canvas.getGraphics(); g.setColot(Color.red); g.fillRect(x,y,xidth,height); Les services de la classe à réaliser correspondent aux méthodes suivantes : public Point ajouterAleat(int marque) cette méthode ajoute dans la grille un carré aléatoirement dans un des cases libres. La couleur est déterminée en fonction de la marque. Si il n'y a pas de cases libres alors retourne null; la grille et pleine. public Point deplacer(int x,int y,int sensX,int sensY) cette méthode déplace un élément situé en (x,y) vers (x',y'). x' = x + sensX y' = y + sensY avec page 4 LES APPLICATIONS DISTRIBUEES Projet 1 sensX = -1, sensY = -1, la méthode d'un Point. Si la case null. 17/04/2017 Par J. LAFORGUE 0, ou 1 0 ou -1 retourne la nouvelle position (x,y) sous la forme destinataire est occupée alors la méthode retourne Pour obtenir un entier aléatoire entre N et M (bornes incluses) : Random rdm = new Random(); .... valeur_aleatoire = N + Math.abs(rdm.nextInt())% (M - N + 1); entre 0 et N-1 : Math.abs(rdm.nextInt())%N; Dans le package agent, on crée la classe Agent Agent.java La classe Agent hérite de la classe Thread ou implémente l'interface Runnable. Un agent contient sa position courante dans la grille (x,y) et la valeur de sa marque (de 1 à 10) La méthode run consiste à réaliser une boucle sur un déplacement aléatoire dans la grille. On ralenti chaque déplacement en utilisant l'instruction suivante: try{Thread.sleep(250);}catch(Exception e){}; cette instruction attend 250 millisecondes Cette instruction est à mettre dans la méthode run à chaque ittération. GrillePP.java On crée un programme principal GrillePP permettant de tester la classe GrilleIHM et donc d'exécuter le projet1. On doit définir une classe interne qui implémente l'interface GrilleControlesInt afin de définir les actions demandées. : création de 10 cases de marque 1 création de 10 cases de marque 2 création d'un agent sur une position aléatoire et exécution du thread associé. GrillePP crée un Frame et crée une GrilleIHM qui est ajouté dans ce Frame. Elle définie les noms des boutons de l'IHM. page 5 LES APPLICATIONS DISTRIBUEES Projet 1 4. 17/04/2017 Par J. LAFORGUE PLANNING Vous avez 3 séances de TP pour réaliser ce projet 5. OBJECTIFS DU PROJET - Découvrir l'environnement de développement à travers un exemple simple Exploiter la documentation Java en ligne Réaliser une IHM Java Utiliser une interface Java afin de réaliser un traitement générique Utiliser des threads Java dans un cas simple. Servir de base pour la réalisation du projet 2 page 6