22
- 1 - Introduction à Java Exercices II. Première application en Java 2.1 Application HelloWorld 1. Créer un fichier texte : HelloWorld.java 2. Règle de bonne pratique : 1 classe par fichier et 1 fichier par classe 3. Compiler le programme : javac HelloWorld.java 4. Le compilateur génère le bytecode dans le fichier : HelloWorld.class 5. Exécuter l’application : java HelloWorld 6. « Hello the World » s’affiche à l’écran 2.2 Applet HelloWorld 1. Créer un fichier texte : HelloWorldApplet.java 2. Règle de bonne pratique: 1 classe par fichier et 1 fichier par classe 3. Compiler le programme : javac HelloWorldApplet.java 4. Le compilateur génère le bytecode dans le fichier : HelloWorldApplet.class 5. Les applets s’exécutent dans une page HTML 6. Pour intégrer l’applet dans une page HTML, il suffit d’utiliser la balise <APPLET> 7. Le paramètre « CODE » de la balise <APPLET> indique le nom de la classe principale de l’applet 8. Ouvrir la page HTML dans un navigateur, l’applet se lance automatiquement au sein de la page

Intro Java Exercice s

Embed Size (px)

Citation preview

Page 1: Intro Java Exercice s

- 1 -

Introduction à Java Exercices

II. Première application en Java

2.1 Application HelloWorld 1. Créer un fichier texte : HelloWorld.java 2. Règle de bonne pratique : 1 classe par fichier et 1 fichier par classe 3. Compiler le programme : javac HelloWorld.java 4. Le compilateur génère le bytecode dans le fichier : HelloWorld.class 5. Exécuter l’application : java HelloWorld 6. « Hello the World » s’affiche à l’écran

2.2 Applet HelloWorld 1. Créer un fichier texte : HelloWorldApplet.java 2. Règle de bonne pratique: 1 classe par fichier et 1 fichier par classe 3. Compiler le programme : javac HelloWorldApplet.java 4. Le compilateur génère le bytecode dans le fichier : HelloWorldApplet.class 5. Les applets s’exécutent dans une page HTML 6. Pour intégrer l’applet dans une page HTML, il suffit d’utiliser la balise <APPLET> 7. Le paramètre « CODE » de la balise <APPLET> indique le nom de la classe principale de

l’applet 8. Ouvrir la page HTML dans un navigateur, l’applet se lance automatiquement au sein de la

page

Page 2: Intro Java Exercice s

- 2 -

III. Premiers concepts OO

3.1 Etres vivants � Subdiviser les être vivants en une hiérarchie de classes � A chaque niveau dans la hiérarchie, indiquer:

� Quelles sont les variables d’états accessibles et non accessibles aux autres ? � Quelles sont les comportements exploitables par les autres ? � Quelles sont les comportements internes, cachés aux autres ? � Quelle hiérarchie de classes pourrait-on proposer ?

� Réaliser un diagramme de classes UML du résultat

3.2 GSM Créer une classe GSM � Quelles sont les variables d’états accessibles et non accessibles? � Quelles sont les fonctionnalités offertes à l’utilisateur? � Quelles sont les fonctionnalités cachées à l’utilisateur? � Quelle hiérarchie de classes pourrait-on proposer?

Page 3: Intro Java Exercice s

- 3 -

IV. Syntaxe du langage Java

4.1 Classe MyPoint � Lire le code et prévoir ce qui apparaîtra à l’écran à l’exécution � Observer en particulier les mécanismes de création et d’assignation de variables de

références dans la classe public class MyPoint { private int x, y; public MyPoint(int x,int y) { this.x=x; this.y=y; } public MyPoint() {} public static void main (String args[]) { MyPoint start, end; start = new MyPoint (); end = new MyPoint (20,30); System.out.println("Start Point = X: " + start.x + " Y: " + start.y); System.out.println("End Point = X: " + end.x + " Y: " + end.y); start.x = 10; start.y = 10; System.out.println("Start Point = X: " + start.x + " Y: " + start.y); System.out.println("End Point = X: " + end.x + " Y: " + end.y); MyPoint p; p = end; System.out.println("Start Point = X: " + start.x + " Y: " + start.y); System.out.println("End Point = X: " + end.x + " Y: " + end.y); System.out.println("p Point = X: " + p.x + " Y: " + p.y); p.x = 100; p.y = 50; System.out.println("Start Point = X: " + start.x + " Y: " + start.y); System.out.println("End Point = X: " + end.x + " Y: " + end.y); System.out.println("p Point = X: " + p.x + " Y: " + p.y); start.x = 200; start.y = 250; System.out.println("Start Point = X: " + start.x + " Y: " + start.y); System.out.println("End Point = X: " + end.x + " Y: " + end.y); System.out.println("p Point = X: " + p.x + " Y: " + p.y); } }

Page 4: Intro Java Exercice s

- 4 -

4.2 Ding Ding Bottle � Ecrire un programme qui compte de 1 à 100 � Affiche ces nombres à l’écran � Remplace les multiples de 5 par « Bottle » � Remplace les multiples de 7 par « Ding Ding » � Remplace les multiples de 5 et 7 par « Ding Ding Bottle »

4.3 Factorielle � Ecrire un programme qui calcule la factorielle d’un nombre � Essayer d’optimiser le code en gardant en mémoire les factorielles déjà calculées � S’assurer que la factorielle calculée ne dépasse pas 20 (limite de capacité des entiers de type

LONG)

4.4 NameTest � Analyser la classe NameTest � Observer la méthode main et la façon dont elle récupère les arguments

/** * The purpose of this example is to understand the signature of the * main method. * It reads all the arguments in the command line, then returns them * in the reverse order. * It then tries to identify a name */ public class NameTest { public static void main (String args[]) { for (int i=args.length-1; i>=0; i--) {// Loop on the reverse dir. for (int j=args[i].length()-1; j>=0; j--) {// Chaque nom à l'envers System.out.print (args[i].charAt(j)); } System.out.print(" "); } // Le processus d'identification System.out.println(); String myName = args[0] + " " + args[args.length-1] ; if (myName.endsWith ("Bersini")) { System.out.println("Hello " + myName); } else { System.out.println("Je ne reconnais pas l'utilisateur"); } } }

Page 5: Intro Java Exercice s

- 5 -

4.5 WordScrambler � Analyser la classe WordScrambler � Que réalise-t-elle?

import java.io.*; class WordScrambler { private char words[][] = { "hello".toCharArray(), "sunsparc".toCharArray(), "javajdk".toCharArray(), "sunshine".toCharArray(), "service".toCharArray() // Add more words here... }; private int which; public WordScrambler() { which = (int)(Math.random() * words.length); } private String readit() { byte ans[] = new byte[80]; int count = 0; try { count = System.in.read(ans); } catch (IOException e) { System.err.println("Error reading keyboard input."); System.exit(1); } // End of file detected. if (count == -1) { System.exit(1); } return new String(ans, 0, count - 1); } private void playAgain() { int last = which; while (last == which) { which = (int)(Math.random() * words.length); } } public void start() { System.out.println(); System.out.println("The letters that make up the word are\n"); System.out.println(scramble()); } private char[] scramble() { int length = words[which].length; boolean used[] = new boolean[length]; int rand; char answer[] = new char[length]; for (int i=0;i < length; i++) { while (true) { rand = (int)(Math.random()*length); if (!used[rand]) { answer[i] = words[which][rand]; used[rand] = true; break; } } } return answer; }

Page 6: Intro Java Exercice s

- 6 -

private void guess() { String input; String word = new String(words[which]); for (int i=0; i<5; i++) { System.out.print("\n Enter guess number "+(i+1)+": "); input = readit(); System.out.println("you wrote : "+ input); if (word.equals(input.trim())) { System.out.println("Congratulations, good guess!!"); return; } if (i < 4) { System.out.println( "Good guess but wrong, try again");} else { System.out.println( "Out of guesses, the answer is " + word); } } } public static void main (String args[]) { WordScrambler mine = new WordScrambler(); String ans; while (true) { mine.start(); mine.guess(); System.out.println(); System.out.print("Do you want to play again (Y/N)? "); ans=mine.readit().trim(); if (ans.equals("Y") || ans.equals("y")) { mine.playAgain(); //continue; } else { break; } } } }

Page 7: Intro Java Exercice s

- 7 -

V. Programmer en OO avec Java

5.1 Classe Point � Analyser la classe Point � Que se passe-t-il à l’exécution du programme? � Exécuter le programme pour vérifier

public class Point { private int x,y; public Point(int x, int y) { this.x=x; this.y=y; } public void modifiePoint(Point p) { p=new Point(3,4); } public String toString() { return("Le point a pour coordonnees (x,y) : ("+ x +", "+ y+")"); } public static void main(String[] args) { Point point1 = new Point(5,3); point1.modifiePoint(point1); System.out.println(point1); } }

Page 8: Intro Java Exercice s

- 8 -

5.2 Classe Scope • Analyser la classe Scope • Que se passe-t-il à l’exécution du programme? • Exécuter le programme pour vérifier

public class Scope { private int i=3; private double v; public Scope() { v=4; } public void job() { i=5; for (int i=0; i<10; i++) { System.out.println(i++); } } public int getI() {return i;} public static void main(String[] args) { Scope scope1 = new Scope(); scope1.job(); System.out.println(scope1.getI()); } }

• Même question si la méthode job() est redéfinie comme suit: public void job() { i=5; for(int i=0;i<10;i++) { System.out.println(++this.i); } }

Page 9: Intro Java Exercice s

- 9 -

5.3 Villes et Capitales

5.3.1 L’encapsulation a) Créer une classe Ville correspondant au schéma UML suivant (observer les conventions d’écriture des variables, des méthodes et des classes. Quelles sont-elles ?). Testez la méthode decrisToi() (qui affiche à l’écran le nom de la ville et le nombre d’habitants) v Quelle initialisation des variables utilise Java, par défaut ? Différenciez le cas des types de base et des types de classe. b) Créez une classe Test qui utilise la classe Ville. La fonction main dans Test comprendra la ligne de commande suivante : Ville[] mesVilles=new Ville[5]; mesVilles[0]= new Ville(« Gosselies ») ; mesVilles[1]= new Ville(« Namur ») ; … Créez une boucle FOR pour appeler la méthode decrisToi() de toutes les villes. Compilez et exécutez en ligne de commande. c) Surchargez le constructeur de la classe Ville. Définissez un constructeur, à deux arguments (un String et un entier), utilisant celui défini en a). d) Peut-on modifier la variable d’instance nomVille depuis l’extérieur de la classe ? et depuis l’intérieur ? Pourquoi n’utilise-t-on pas le mot clé final ?

Ville

- nbHabitants : int - nomVille : String + Ville(String) + decrisToi() : void + getNomVille():String + getNbHabitants() :int + setNbHabitants():void

Page 10: Intro Java Exercice s

- 10 -

5.3.2 L’héritage a) Créez une classe Capitale qui hérite de la classe Ville. Celle-ci comprendra une variable d’instance supplémentaire : nomPays. Expliquez le mécanisme de construction d’une classe dérivée. Testez différents cas : appel explicite ou non au constructeur de la classe mère ; existence ou non d’un constructeur sans arguments. b) Redéfinissez la méthode decrisToi(), en faisant appel à la méthode de la classe mère. (decrisToi() affichera à l’écran Capitale de nomPays: nomVille ; nbHabitants). Testez. c) Changez les modificateurs d’accès des données membres de la classe mère, en remplaçant private par protected. Peut-on accéder à ces variables depuis l’extérieur de la classe Ville ? Quel danger cela présente-t- il ( en terme d’encapsulation).

5.3.3 Le polymorphisme a) Montrez que le transtypage induit par l’héritage permet le polymorphisme. Pour ce faire créez un tableau de Ville comprenant des villes et des capitales. b) Même exercice avec un vecteur. Expliquez la notion de cast (explicite dans ce cas-ci) c) Soit une Capitale londres. Que se passe-t-il à l’exécution de la commande System.out.println(londres) ? Changez le nom des methodes decrisToi() en le remplaçant par toString(). Que se passe-t-il a l’exécution de System.out.println(londres) ? Expliquez. d) Peut-on rendre decrisToi() polymorphique dès la conception de la classe mère. Utilisez les méthodes getClass() et getName().

Page 11: Intro Java Exercice s

- 11 -

5.4 Cercles et surfaces

1. Créer une classe « Cercle » modélisant des ronds destinés à s’afficher à l’écran 1. Quels attributs devraient être d’instance ou de classe? 2. Quelles pourraient être ses méthodes d’instance? 3. Créer les méthode de calcul du périmètre et de la surface (ne peut-on pas en faire des

méthodes de classe?)

2. Créer une classe « Dessin » qui contient la méthode main 1. La méthode main instanciera un Cercle, en affichera les coordonnées et en calculera

le périmètre et l’aire

5.5 La jungle Modèliser le système suivant et le schématiser en UML � Une jungle, écosystème dans lequel évoluent des proies et des prédateurs ainsi que des plans

d’eau et des plantes, nécessaires à la survie des animaux � Les proies se déplacent soit vers l’eau, soit vers une plante, soit pour fuir un prédateur en

fonction du premier de ces objets qu’elles repèrent. � Les prédateurs se déplacent soit vers l’eau, soit vers une proie en fonction du premier de ces

objets qu’ils rencontrent � Les plantes poussent lentement au cours du temps, tandis que l’eau s’évapore peu à peu � Les animaux épuisent leurs ressources énergétiques peu à peu, au fur et à mesure de leurs

déplacements � Lorsque les animaux rencontrent de l’eau, ils s’abreuvent et récupèrent de l’énergie tandis

que le niveau de l’eau diminue en conséquence � Lorsqu’un prédateur rencontre une proie, il la dévore et récupère de l’énergie � Lorsqu’une proie rencontre une plante, il la dévore et récupère de l’énergie

5.6 La circulation � Analyser le code de l’application « Circulation » � Observer les mécanismes de conversion de types � Déterminer les conversions valides et celles qui provoqueront une erreur à la compilation � Corriger la classe Circulation pour que l’application puisse être compilée et exécutée

correctement � Analyser ensuite la même application avec cette fois la classe « Circulation2 » pour classe

principale (sans erreurs) et en observer les mécanismes de conversion de types � Quels risques pourraient se présenter en utilisant ces techniques sur des collections

hétérogènes?

Page 12: Intro Java Exercice s

- 12 -

5.6.1 Fichier Circulation.java public class Circulation { public static void main(String[] args) { Object a = new Automobile(0, 50, "ABC123"); Object v = new Velo(0, "Mountain Bike", "VEL007"); Vehicule vh = new Vehicule(3, 10, "ZYX987"); Conducteur c = new Conducteur("Bersini", "BN1234567"); v.tombe(); c.conduit((Automobile) v); c.conduit(a); ((Automobile) vh).faitLePlein(10); } }

5.6.2 Fichier Conducteur.java public class Conducteur { private String nom; private String numeroPermis; private int acceleration; public Conducteur(String nom, String numeroPermis) { this.nom = nom; this.numeroPermis = numeroPermis; } public void conduit(Vehicule v) { System.out.println("Et hop, je suis " + nom + " et je conduis " + v.getPlaque()); v.accelere(acceleration); } }

5.6.3 Fichier Vehicule.java public class Vehicule { protected int nbDeRoues; protected int vitesse; protected String plaque; public Vehicule(int roues, int vitesseInitiale, String plaque) { nbDeRoues = roues; vitesse = vitesseInitiale; this.plaque = plaque; } public void accelere(int dv) { vitesse += dv; System.out.println("Je suis " + plaque + " et je bouge!"); } public String getPlaque() { return plaque; } }

Page 13: Intro Java Exercice s

- 13 -

5.6.4 Fichier Automobile.java public class Automobile extends Vehicule { private int reservoir; public Automobile(int vi, int reservoir, String plaque) { super(4, vi, plaque); this.reservoir = reservoir; } public void faitLePlein(int quantite) { reservoir += quantite; System.out.println("Je suis " + plaque + " et il me reste " + reservoir + " litres"); } }

5.6.5 Fichier Velo.java public class Velo extends Vehicule { private String type; public Velo(int vitesseInitiale, String type, String plaque) { super(2, vitesseInitiale, plaque); this.type = type; } public void tombe() { vitesse = 0; System.out.println("Ouch, je suis " + plaque + " et j'ai chu!"); } }

5.6.6 Fichier Circulation2.java public class Circulation2 { public static void main(String[] args) { Vehicule[] v = new Vehicule[4]; Object[] c = new Object[4]; v[0] = new Automobile(0, 50, "ABC123"); v[1] = new Vehicule(3, 10, "ZYX987"); v[2] = new Velo(0, "Mountain Bike", "VEL007"); v[3] = new Automobile(0, 60, "CDE345"); c[0] = new Conducteur("Bersini", "BN1"); c[1] = new Conducteur("Van Zeebroeck", "VZ2"); c[2] = new Conducteur("Molter", "ML3"); c[3] = new Conducteur("Ackerman", "AC4"); for(int i=0;i<4;i++) { ((Conducteur) c[i]).conduit(v[i]); } ((Velo) v[2]).tombe(); ((Automobile) v[0]).faitLePlein(10); } }

Page 14: Intro Java Exercice s

- 14 -

5.7 Gestion de comptes en banque � Une banque gère un ensemble de comptes de différents types : comptes courant, comptes

d’épargne … Les comportements et les caractéristiques liés à un compte sont à un niveau abstrait fort similaires : chacun possède un propriétaire, un solde, un numéro, un taux d’intérêt ; on peut y déposer de l’argent, retirer de l’argent (s’il en reste suffisamment)

� La banque propose également un système d’emprunts. Chaque emprunt est caractérisé par le montant total à rembourser, la valeur des mensualités et le compte duquel les mensualités doivent être débitées

� Le but de l’exercice consiste à créer une banque et à tenir à jour l’état des comptes en fonction des retraits, des intérêts et des remboursements d’emprunts sur chaque compte

5.8 Envoi de messages � Ecrire un programme le plus simple possible pour envoyer un message d’un objet A à un objet

B, en plaçant néanmoins le main dans une classe spécialement dédiée à cet effet

BankAccount - String owner - String number - int solde - double interst

deposit(int):int withdraw(int):int addALoan(Loan l):void payYourLoans():void calculInterest():int isReimbursed(int):void Loan

- int amount - int mensuality

Loan(int,int,BankAccount) reimbourse():void

Bank

1

*

NormalAccount calculInterest():int

SparingAccount

calculInterest():int

MyProgram

Page 15: Intro Java Exercice s

- 15 -

VII. Interfaces graphiques et gestion d’événements

7.1 Une première application graphique

7.1.1 Interface graphique � Créer une classe héritant de Frame � Construire la fenêtre d’application � Ajouter:

� Au Nord: un Label � Au Centre: un Panel contenant lui-même trois Buttons à placer dans un Array � Au Sud: un Button

� Créer une classe principale contenant uniquement la méthode main : public static void main(String args[]) { Fenetre f = new Fenetre(); }

� Implémenter l’interface « WindowListener » dans la classe Fenetre � Redéfinir les méthodes de l’interface et en particulier windowClosing(WindowEvent e) pour

qu’elle provoque la fermeture de la fenêtre et la sortie de l’application lorsque l’utilisateur clique sur la croix de fermeture

7.1.2 Gestion d’événements � Implémenter l’interface « WindowListener » dans la classe Fenetre � Redéfinir les méthodes de l’interface et en particulier windowClosing(WindowEvent e) pour

qu’elle provoque la fermeture de la fenêtre et la sortie de l’application lorsque l’utilisateur clique sur la croix Windows

7.2 Calculatrice Créer une mini calculatrice � Créer une classe « Calculette » héritant de Frame

� Ajouter dans le Frame : ú Un « Label » pour l’écran d’affichage ú Un « Panel » pour le clavier ú Ajouter un GridLayout au Panel, le divisant en 4 x 4 zones ú Un tableau de 16 « Button » qui s’afficheront dans le Pane l en fonction du

GridLayout ú Instancier les boutons du tableau dans une boucle FOR

� Créer une classe « GestionnaireDeFenetre » héritant de WindowAdapter � Redéfinir sa méthode windowClosing(WindowEvent e) pour qu’une boîte de

dialogue s’ouvre pour demander la confirmation de la fermeture � Créer une classe « GestionnaireDeBoutons » implémentant l’interface ActionListener

� Redéfinir sa méthode actionPerformed(ActionEvent e) pour qu’elle identifie la touche pressée et déclenche l’action correspondante

� Créer une classe « Arithmetique » effectuant les calculs et renvoyant le résultat qui sera affiché dans le Label de la fenêtre principale

� Créer enfin une classe « StartCalculatrice » qui contiendra uniquement le main.

Page 16: Intro Java Exercice s

- 16 -

7.3 Paint L’objectif du projet est la réalisation d’un éditeur graphique permettant de dessiner des segments de droites colorés (une version beta de paint 1.0). La réalisation de l’éditeur graphique commencera par la construction d’une fenêtre (Frame) , support de l’application, que nous personnaliserons grâce à divers éléments : boutons (Button) , listes déroulantes (Choice), zone de dessin (Canvas)... Ensuite nous gérerons les événements générés par l’utilisateur (clic de souris, …) pour donner vie à cette application. Enfin en utilisant le contexte graphique, fournit par la JVM, nous aborderons les mécanismes de construction graphique en 2D. L’objectif du projet pourrait être résumé par la fenêtre suivante :

Page 17: Intro Java Exercice s

- 17 -

Interface graphique 1. Définir une classe FenetreEditeur qui dérive de la classe Frame et l’afficher à l’écran.

Utilisez les méthodes setTitle(String), setSize(int, int), et show() dans le constructeur.

Cahier des charges L’application doit permettre à l’utilisateur de dessiner des segments de droites de différentes couleurs (bleu, vert, rouge, jaune). L’utilisateur pourra effacer totalement le dessin ou seulement les derniers segments de droites dessinés. L’interface graphique sera composée de quatre parties :

• Un menu, • Une barre d’outils qui permettra l’accès à toutes les fonctionnalités • Une zone de dessin, dans laquelle vos prénoms sont écrits sur la figure • Une barre d’état qui indiquera entre autres les coordonnées de la souris.

Barre des Menus

2. Définir une classe MenuEditeur, classe fille de MenuBar. Celle-ci comprendra deux menus (classe Menu) : Fichier et Aide. Ces menus comprendront différents items - Nouveau et Quitter (menu Fichier) et A propos (menu Aide) – instance de la classe MenuItem. Insérez la barre de Menu dans la fenêtre d’application en utilisant la méthode setMenuBar de Frame.

Barre d’outils 3. Définir une classe BarreOutils qui est un conteneur du type Panel, qui comprendra une liste

déroulante (pour choisir les couleurs), et les boutons proposés sur la figure. Ajoutez la barre d’outils à votre fenetre d ‘application, en utilisant le LayoutManager par défaut.1

Barre d’états 4. Celle-ci comprendra deux zones de textes permettant d’afficher des informations

(concernant par ex les mouvements de la souris …). Placez la barre d’états au bas de la fenêtre.

Zone Graphique 5. Classe dérivée de Canvas. Utilisez, par exemple, les méthodes setBackground(Color) et

setCursor (Cursor) dans le constructeur.

1 et n’oubliez pas de consulter la doc en ligne : investiguez la hiérarchie du package awt (Component, Container, Window, Frame, Button …etc) et recherchez les différents types de LayoutManager prédéfinis.

Page 18: Intro Java Exercice s

- 18 -

Gestion des événements

6. Complétez la classe ZoneGraphique pourqu’elle implémente l’interface MouseMotionListener. Utilisez la méthode addMouseMotionListener (MouseMotionListener) dans le constructeur. Affichez les coordonnées de la souris dans la barre d’état.

7. Définissez une classe GestionSouris qui dérive de MouseAdapter. Les méthodes de gestion

d’événements appeleront des méthodes définies dans ZoneGraphique. Par ex. initieDroite(int, int) si on clique sur la souris et termineDroite(int, int) quand la souris est relâchée.

8. Définissez une classe de gestion de la fenêtre graphique d’application qui fermera la fenêtre

quand on appuie sur le bouton ad hoc (coin superieur droit).

9. Créez une classe permettant de gérer les événements issus de la barre d’outils et du menu. Associez des instances de cette classe aux boutons et aux MenuItem précédemment définis.

Graphismes 2D

10. Définir le corps de la méthode termineDroite(int, int), en accédant au contexte graphique du Canvas.

public void termineDroite(int x, int y) { Graphics g=getGraphics(); g.drawLine(x,y,xInit,yInit) ; etat.afficheMessage("Relachez pour dessiner la droite"); }

11. Ajoutez une fenêtre de dialogue lorsque sur l’item A Propos du menu d’Aide. 12. Innovez et ajoutez les fonctionnalités que vous souhaitez.

13. Produisez une œuvre originale, et esthétique.

14. Faites partager aux formateurs un doux moment de comtemplation de votre œuvre

graphique.2

2 On n’oserait pas vous proposer de la vendre, puis de vous lancer dans le commerce des œuvres électroniques bien qu’il représente, dans la conjoncture actuelle, un énorme potentiel de marché.

Page 19: Intro Java Exercice s

- 19 -

Diagramme de classes

10..*

1

1

1

1

1

1

11

0..*

1

11

1

1

1

1

1

Dessin

+ajouteDroite:void+defaire:void+efface:void+dessineToi:void

Droite

xInit:intyInit:intxFin:intyFin:intcouleur:Color

+Droite+dessineToi:void

ActionListenerItemListener

GereBarres

QUITTER:intNOUVEAU:intDEFAIRE:intAPROPOS:int-ID:int-zoneGraphique:ZoneGraphique-listeDesCouleurs:Color[]-ap:APropos

+GereBarres+GereBarres+itemStateChanged:void+actionPerformed:void

PanelBarreOutils

+libellesCouleurs:String[]

+BarreOutils

PanelBarreDEtat

-coord:Label-info:Label

+BarreDEtat+afficheMessage:void+afficheCoord:void

CanvasMouseMotionListener

ZoneGraphique

-etat:BarreDEtat-couleurActive:Color-xInit:int-yInit:int-droite:Droite-dessin:Dessin

+ZoneGraphique+paint:void+initieDroite:void+termineDroite:void+mouseMoved:void+mouseDragged:void+efface:void+defaire:void+changeCouleur:void+changeCouleur:void

MouseAdapterGestionSouris

-zoneGraphique:ZoneGraphique

+GestionSouris+mouseReleased:void+mousePressed:void

FrameFenetreEditeur

HTAILLE:intVTAILLE:intetat:BarreDEtatzoneGraphique:ZoneGraphique-outils:BarreOutils-gestion:GestionFenetre-menu:MenuEditeur

+FenetreEditeur+main:void

insets:Insets

WindowAdapterAProposListener

dialogue:Dialog

+AProposListener+windowClosing:void

WindowAdapterGestionFenetre

+windowClosing:void

AppletAppletEditeur

-outils:BarreOutilszoneGraphique:ZoneGraphiqueetat:BarreDEtat

+init:void+insets:Insets

DialogActionListener

APropos

-image:Image-textArea:TextArea-ap:AProposListener-bouton:Button

+APropos+paint:void+actionPerformed:void

MenuBarMenuEditeur

+menuQuitter:MenuItem+menuNouveau:MenuItem+menuAPropos:MenuItem-zoneGraphique:ZoneGraphique

+MenuEditeur

Tous les héritages de cediagramme sont dérivésdes packages du Java

Page 20: Intro Java Exercice s

- 20 -

VIII. Collections

8.1 Paint (2/4) � Définissez les classes Droites et Dessin permettant d’assurer la persistance de votre œuvre

malgré les redimensionnements de la fenêtre, réductions, changements de focus… Utilisez pour ce faire la classe java.util.Vector.

� Redéfinissez la méthode paint(Graphics g) héritée de la classe abstraite Component. � Adaptez aussi les méthodes liées au boutons « Défaire » et « Annuler » afin qu’ils

suppriment respectivement la dernière droite tracées et toutes les droites du dessin. � Implémentez l’interface Comparable au sein de la classe « Dessin » afin de permettre le tri

des droites sur base de leur longueur et redéfinissez à cette fin la méthode compareTo(Object o)

� Ajoutez un bouton permettant de trier les droites du dessin dans le vecteur et vérifiez que la commande « Défaire » supprime désormais les droites par ordre de longueur et non plus en fonction de l’ordre dans lequel elles ont été tracées.

Page 21: Intro Java Exercice s

- 21 -

IX. Gestion d’exceptions

9.1 Paint (3/4) � Prévoir l’interception d’exceptions de type ArrayIndexOutOfBoundsException dans les

méthodes de la classe Dessin et provoquer délibérément une sortie des limites du vecteur pour vérifier son bon fonctionnement

� Créer une nouvelle exception « DroiteTropLongueException », qui devra être lancée chaque fois que l’utilisateur tente de tracer une droite dont la longueur dépasse une certaine limite

� Lancer cette interception dans la méthode termineDroite(int, int) de la classe ZoneGraphique � Intercepter cette nouvelle exception dans la méthode mouseReleased(MouseEvent) de la

classe GestionSouris

Page 22: Intro Java Exercice s

- 22 -

X. Multithreading

10.1 Paint (4/4) � Créer une classe « Balle » héritant de « Thread » � Définir ses variables et ses méthodes d’affichage paint(Graphics g) et deplaceToi() � Redéfinir la méthode run() contenant une boucle infinie dans laquelle le déplacement de la

balle est provoqué � Instancier deux balles dans la zoneGraphique et lancer leurs Thread associés

� Implémenter l’interface « Runnable » dans la classe ZoneGraphique afin que l’écran soit

automatiquement rafraîchi à intervalles réguliers. � Redéfinir la méthode run() et lancer le Thread dans le constructeur de la classe