Vous êtes sur la page 1sur 22

Introduction Java Exercices II. Premire application en Java 2.

1 Application HelloWorld
1. 2. 3. 4. 5. 6. Crer un fichier texte : HelloWorld.java Rgle de bonne pratique : 1 classe par fichier et 1 fichier par classe Compiler le programme : javac HelloWorld.java Le compilateur gnre le bytecode dans le fichier : HelloWorld.class Excuter lapplication : java HelloWorld Hello the World saffiche lcran

2.2 Applet HelloWorld


1. 2. 3. 4. 5. 6. 7. Crer un fichier texte : HelloWorldApplet.java Rgle de bonne pratique: 1 classe par fichier et 1 fichier par classe Compiler le programme : javac HelloWorldApplet.java Le compilateur gnre le bytecode dans le fichier : HelloWorldApplet.class Les applets sexcutent dans une page HTML Pour intgrer lapplet dans une page HTML, il suffit dutiliser la balise <APPLET> Le paramtre CODE de la balise <APPLET> indique le nom de la classe principale de lapplet 8. Ouvrir la page HTML dans un navigateur, lapplet se lance automatiquement au sein de la page

-1-

III. Premiers concepts OO 3.1 Etres vivants


Subdiviser les tre vivants en une hirarchie de classes A chaque niveau dans la hirarchie, indiquer: Quelles sont les variables dtats accessibles et non accessibles aux autres ? Quelles sont les comportements exploitables par les autres ? Quelles sont les comportements internes, cachs aux autres ? Quelle hirarchie de classes pourrait-on proposer ? Raliser un diagramme de classes UML du rsultat

3.2 GSM
Crer une classe GSM Quelles sont les variables dtats accessibles et non accessibles? Quelles sont les fonctionnalits offertes lutilisateur? Quelles sont les fonctionnalits caches lutilisateur? Quelle hirarchie de classes pourrait-on proposer?

-2-

IV. Syntaxe du langage Java 4.1 Classe MyPoint


Lire le code et prvoir ce qui apparatra lcran lexcution Observer en particulier les mcanismes de cration et dassignation de variables de rfrences 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); } }

-3-

4.2 Ding Ding Bottle


Ecrire un programme qui compte de 1 100 Affiche ces nombres lcran 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 dun nombre Essayer doptimiser le code en gardant en mmoire les factorielles dj calcules Sassurer que la factorielle calcule ne dpasse pas 20 (limite de capacit des entiers de type LONG)

4.4 NameTest
Analyser la classe NameTest Observer la mthode main et la faon dont elle rcupre 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"); } } }

-4-

4.5 WordScrambler
Analyser la classe WordScrambler Que ralise-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; }

-5-

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; } } } }

-6-

V. Programmer en OO avec Java 5.1 Classe Point


Analyser la classe Point Que se passe-t-il lexcution du programme? Excuter le programme pour vrifier

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); } }

-7-

5.2 Classe Scope


Analyser la classe Scope Que se passe-t-il lexcution du programme? Excuter le programme pour vrifier

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()); } }

Mme question si la mthode job() est redfinie comme suit:

public void job() { i=5; for(int i=0;i<10;i++) { System.out.println(++this.i); } }

-8-

5.3 Villes et Capitales


5.3.1 Lencapsulation
a) Crer une classe Ville correspondant au schma UML suivant (observer les conventions dcriture des variables, des mthodes et des classes. Quelles sont-elles ?). Testez la mthode decrisToi() (qui affiche lcran le nom de la ville et le nombre dhabitants) v Ville
- nbHabitants : int - nomVille : String + Ville(String) + decrisToi() : void + getNomVille():String + getNbHabitants() :int + setNbHabitants():void

Quelle initialisation des variables utilise Java, par dfaut ? Diffrenciez le cas des types de base et des types de classe. b) Crez 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 ) ; Crez une boucle FOR pour appeler la mthode decrisToi() de toutes les villes. Compilez et excutez en ligne de commande. c) Surchargez le constructeur de la classe Ville. Dfinissez un constructeur, deux arguments (un String et un entier), utilisant celui dfini en a). d) Peut-on modifier la variable dinstance nomVille depuis lextrieur de la classe ? et depuis lintrieur ? Pourquoi nutilise-t-on pas le mot cl final ?

-9-

5.3.2 Lhritage
a) Crez une classe Capitale qui hrite de la classe Ville. Celle-ci comprendra une variable dinstance supplmentaire : nomPays. Expliquez le mcanisme de construction dune classe drive. Testez diffrents cas : appel explicite ou non au constructeur de la classe mre ; existence ou non dun constructeur sans arguments. b) Redfinissez la mthode decrisToi(), en faisant appel la mthode de la classe mre. (decrisToi() affichera lcran Capitale de nomPays: nomVille ; nbHabitants). Testez. c) Changez les modificateurs daccs des donnes membres de la classe mre, en remplaant private par protected. Peut-on accder ces variables depuis lextrieur de la classe Ville ? Quel danger cela prsente-t- il ( en terme dencapsulation).

5.3.3 Le polymorphisme
a) Montrez que le transtypage induit par lhritage permet le polymorphisme. Pour ce faire crez un tableau de Ville comprenant des villes et des capitales. b) Mme exercice avec un vecteur. Expliquez la notion de cast (explicite dans ce cas-ci) c) Soit une Capitale londres. Que se passe-t-il lexcution de la commande System.out.println(londres) ? Changez le nom des methodes decrisToi() en le remplaant par toString(). Que se passe-t-il a lexcution de System.out.println(londres) ? Expliquez. d) Peut-on rendre decrisToi() polymorphique ds la conception de la classe mre. Utilisez les mthodes getClass() et getName().

- 10 -

5.4 Cercles et surfaces


1. Crer une classe Cercle modlisant des ronds destins safficher lcran 1. Quels attributs devraient tre dinstance ou de classe? 2. Quelles pourraient tre ses mthodes dinstance? 3. Crer les mthode de calcul du primtre et de la surface (ne peut-on pas en faire des mthodes de classe?) 2. Crer une classe Dessin qui contient la mthode main 1. La mthode main instanciera un Cercle, en affichera les coordonnes et en calculera le primtre et laire

5.5 La jungle
Modliser le systme suivant et le schmatiser en UML Une jungle, cosystme dans lequel voluent des proies et des prdateurs ainsi que des plans deau et des plantes, ncessaires la survie des animaux Les proies se dplacent soit vers leau, soit vers une plante, soit pour fuir un prdateur en fonction du premier de ces objets quelles reprent. Les prdateurs se dplacent soit vers leau, soit vers une proie en fonction du premier de ces objets quils rencontrent Les plantes poussent lentement au cours du temps, tandis que leau svapore peu peu Les animaux puisent leurs ressources nergtiques peu peu, au fur et mesure de leurs dplacements Lorsque les animaux rencontrent de leau, ils sabreuvent et rcuprent de lnergie tandis que le niveau de leau diminue en consquence Lorsquun prdateur rencontre une proie, il la dvore et rcupre de lnergie Lorsquune proie rencontre une plante, il la dvore et rcupre de lnergie

5.6 La circulation
Analyser le code de lapplication Circulation Observer les mcanismes de conversion de types Dterminer les conversions valides et celles qui provoqueront une erreur la compilation Corriger la classe Circulation pour que lapplication puisse tre compile et excute correctement Analyser ensuite la mme application avec cette fois la classe Circulation2 pour classe principale (sans erreurs) et en observer les mcanismes de conversion de types Quels risques pourraient se prsenter en utilisant ces techniques sur des collections htrognes?

- 11 -

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; } }

- 12 -

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); } }

- 13 -

5.7 Gestion de comptes en banque


Une banque gre un ensemble de comptes de diffrents types : comptes courant, comptes dpargne Les comportements et les caractristiques lis un compte sont un niveau abstrait fort similaires : chacun possde un propritaire, un solde, un numro, un taux dintrt ; on peut y dposer de largent, retirer de largent (sil en reste suffisamment) La banque propose galement un systme demprunts. Chaque emprunt est caractris par le montant total rembourser, la valeur des mensualits et le compte duquel les mensualits doivent tre dbites Le but de lexercice consiste crer une banque et tenir jour ltat des comptes en fonction des retraits, des intrts et des remboursements demprunts sur chaque compte
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

*
MyProgram

Bank

Loan
- int amount - int mensuality Loan(int,int,BankAccount) reimbourse():void

NormalAccount
calculInterest():int

SparingAccount
calculInterest():int

5.8 Envoi de messages


Ecrire un programme le plus simple possible pour envoyer un message dun objet A un objet B, en plaant nanmoins le main dans une classe spcialement ddie cet effet

- 14 -

VII. Interfaces graphiques et gestion dvnements 7.1 Une premire application graphique
7.1.1 Interface graphique
Crer une classe hritant de Frame Construire la fentre dapplication Ajouter: Au Nord: un Label Au Centre: un Panel contenant lui- mme trois Buttons placer dans un Array Au Sud: un Button Crer une classe principale contenant uniquement la mthode main :
public static void main(String args[]) { Fenetre f = new Fenetre(); }

Implmenter linterface WindowListener dans la classe Fenetre Redfinir les mthodes de linterface et en particulier windowClosing(WindowEvent e) pour quelle provoque la fermeture de la fentre et la sortie de lapplication lorsque lutilisateur clique sur la croix de fermeture

7.1.2 Gestion dvnements


Implmenter linterface WindowListener dans la classe Fenetre Redfinir les mthodes de linterface et en particulier windowClosing(WindowEvent e) pour quelle provoque la fermeture de la fentre et la sortie de lapplication lorsque lutilisateur clique sur la croix Windows

7.2 Calculatrice
Crer une mini calculatrice Crer une classe Calculette hritant de Frame Ajouter dans le Frame : Un Label pour lcran daffichage Un Panel pour le clavier Ajouter un GridLayout au Panel, le divisant en 4 x 4 zones Un tableau de 16 Button qui safficheront dans le Pane l en fonction du GridLayout Instancier les boutons du tableau dans une boucle FOR Crer une classe GestionnaireDeFenetre hritant de WindowAdapter Redfinir sa mthode windowClosing(WindowEvent e) pour quune bote de dialogue souvre pour demander la confirmation de la fermeture Crer une classe GestionnaireDeBoutons implmentant linterface ActionListener Redfinir sa mthode actionPerformed(ActionEvent e) pour quelle identifie la touche presse et dclenche laction correspondante Crer une classe Arithmetique effectuant les calculs et renvoyant le rsultat qui sera affich dans le Label de la fentre principale Crer enfin une classe StartCalculatrice qui contiendra uniquement le main.

- 15 -

7.3 Paint
Lobjectif du projet est la ralisation dun diteur graphique permettant de dessiner des segments de droites colors (une version beta de paint 1.0). La ralisation de lditeur graphique commencera par la construction dune fentre (Frame) , support de lapplication, que nous personnaliserons grce divers lments : boutons (Button) , listes droulantes (Choice), zone de dessin (Canvas)... Ensuite nous grerons les vnements gnrs par lutilisateur (clic de souris, ) pour donner vie cette application. Enfin en utilisant le contexte graphique, fournit par la JVM, nous aborderons les mcanismes de construction graphique en 2D. Lobjectif du projet pourrait tre rsum par la fentre suivante :

- 16 -

Interface graphique
1. Dfinir une classe FenetreEditeur qui drive de la classe Frame et lafficher lcran. Utilisez les mthodes setTitle(String), setSize(int, int), et show() dans le constructeur.

Cahier des charges


Lapplication doit permettre lutilisateur de dessiner des segments de droites de diffrentes couleurs (bleu, vert, rouge, jaune). Lutilisateur pourra effacer totalement le dessin ou seulement les derniers segments de droites dessins. Linterface graphique sera compose de quatre parties : Un menu, Une barre doutils qui permettra laccs toutes les fonctionnalits Une zone de dessin, dans laquelle vos prnoms sont crits sur la figure Une barre dtat qui indiquera entre autres les coordonnes de la souris.

Barre des Menus


2. Dfinir une classe MenuEditeur, classe fille de MenuBar. Celle-ci comprendra deux menus (classe Menu) : Fichier et Aide. Ces menus comprendront diffrents items - Nouveau et Quitter (menu Fichier) et A propos (menu Aide) instance de la classe MenuItem. Insrez la barre de Menu dans la fentre dapplication en utilisant la mthode setMenuBar de Frame.

Barre doutils
3. Dfinir une classe BarreOutils qui est un conteneur du type Panel, qui comprendra une liste droulante (pour choisir les couleurs), et les boutons proposs sur la figure. Ajoutez la barre doutils votre fenetre d application, en utilisant le LayoutManager par dfaut. 1

Barre dtats
4. Celle-ci comprendra deux zones de textes permettant dafficher des informations (concernant par ex les mouvements de la souris ). Placez la barre dtats au bas de la fentre.

Zone Graphique
5. Classe drive de Canvas. Utilisez, par exemple, les mthodes setBackground(Color) et setCursor (Cursor) dans le constructeur.

et noubliez pas de consulter la doc en ligne : investiguez la hirarchie du package awt (Component, Container, Window, Frame, Button etc) et recherchez les diffrents types de LayoutManager prdfinis.

- 17 -

Gestion des vnements


6. Compltez la classe ZoneGraphique pourquelle implmente linterface MouseMotionListener. Utilisez la mthode addMouseMotionListener (MouseMotionListener) dans le constructeur. Affichez les coordonnes de la souris dans la barre dtat. 7. Dfinissez une classe GestionSouris qui drive de MouseAdapter. Les mthodes de gestion dvnements appeleront des mthodes dfinies dans ZoneGraphique. Par ex. initieDroite(int, int) si on clique sur la souris et termineDroite(int, int) quand la souris est relche. 8. Dfinissez une classe de gestion de la fentre graphique dapplication qui fermera la fentre quand on appuie sur le bouton ad hoc (coin superieur droit). 9. Crez une classe permettant de grer les vnements issus de la barre doutils et du menu. Associez des instances de cette classe aux boutons et aux MenuItem prcdemment dfinis.

Graphismes 2D
10. Dfinir le corps de la mthode termineDroite(int, int), en accdant 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 fentre de dialogue lorsque sur litem A Propos du menu dAide. 12. Innovez et ajoutez les fonctionnalits que vous souhaitez. 13. Produisez une uvre originale, et esthtique. 14. Faites partager aux formateurs un doux moment de comtemplation de votre uvre graphique. 2

On noserait pas vous proposer de la vendre, puis de vous lancer dans le commerce des uvres lectroniques bien quil reprsente, dans la conjoncture actuelle, un norme potentiel de march.

- 18 -

Diagramme de classes
MenuBar MenuEditeur +menuQuitter:MenuItem +menuNouveau:MenuItem +menuAPropos:MenuItem -zoneGraphique:ZoneGraphique +MenuEditeur 1 1 0..* Droite xInit:int yInit:int xFin:int yFin:int couleur:Color +Droite +dessineToi:void 0..* 1 Dessin Tous les hritages de ce diagramme sont drivs des packages du Java MouseAdapter GestionSouris -zoneGraphique:ZoneGraphique +GestionSouris 1 +mouseReleased:void +mousePressed:void

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

1 Frame FenetreEditeur HTAILLE:int VTAILLE:int etat:BarreDEtat zoneGraphique:ZoneGraphique -outils:BarreOutils -gestion:GestionFenetre -menu:MenuEditeur +FenetreEditeur +main:void insets:Insets 1 1 WindowAdapter GestionFenetre 1 +windowClosing:void 1 Panel BarreDEtat -coord:Label -info:Label +BarreDEtat +afficheMessage:void +afficheCoord:void 1 1 Canvas MouseMotionListener 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 1

ActionListener ItemListener GereBarres

QUITTER:int NOUVEAU:int DEFAIRE:int -image:Image APROPOS:int -textArea:TextArea -ID:int -ap:AProposListener -zoneGraphique:ZoneGraphique -bouton:Button -listeDesCouleurs:Color[] -ap:APropos +APropos +paint:void +GereBarres +actionPerformed:void +GereBarres +itemStateChanged:void 1 +actionPerformed:void

Dialog ActionListener APropos

Panel BarreOutils +libellesCouleurs:String[] +BarreOutils 1 WindowAdapter AProposListener dialogue:Dialog +AProposListener +windowClosing:void

Applet AppletEditeur 1 1 -outils:BarreOutils zoneGraphique:ZoneGraphique etat:BarreDEtat +init:void +insets:Insets

- 19 -

VIII. Collections 8.1 Paint (2/4)


Dfinissez les classes Droites et Dessin permettant dassurer la persistance de votre uvre malgr les redimensio nnements de la fentre, rductions, changements de focus Utilisez pour ce faire la classe java.util.Vector. Redfinissez la mthode paint(Graphics g) hrite de la classe abstraite Component. Adaptez aussi les mthodes lies au boutons Dfaire et Annuler afin quils suppriment respectivement la dernire droite traces et toutes les droites du dessin. Implmentez linterface Comparable au sein de la classe Dessin afin de permettre le tri des droites sur base de leur longueur et redfinissez cette fin la mthode compareTo(Object o) Ajoutez un bouton permettant de trier les droites du dessin dans le vecteur et vrifiez que la commande Dfaire supprime dsormais les droites par ordre de longueur et non plus en fonction de lordre dans lequel elles ont t traces.

- 20 -

IX. Gestion dexceptions 9.1 Paint (3/4)


Prvoir linterception dexceptions de type ArrayIndexOutOfBoundsException dans les mthodes de la classe Dessin et provoquer dlibrment une sortie des limites du vecteur pour vrifier son bon fonctionnement Crer une nouvelle exception DroiteTropLongueException , qui devra tre lance chaque fois que lutilisateur tente de tracer une droite dont la longueur dpasse une certaine limite Lancer cette interception dans la mthode termineDroite(int, int) de la classe ZoneGraphique Intercepter cette nouvelle exception dans la mthode mouseReleased(MouseEvent) de la classe GestionSouris

- 21 -

X. Multithreading 10.1 Paint (4/4)


Crer une classe Balle hritant de Thread Dfinir ses variables et ses mthodes daffichage paint(Graphics g) et deplaceToi() Redfinir la mthode run() contenant une boucle infinie dans laquelle le dplacement de la balle est provoqu Instancier deux balles dans la zoneGraphique et lancer leurs Thread associs Implmenter linterface Runnable dans la classe ZoneGraphique afin que lcran soit automatiquement rafrachi intervalles rguliers. Redfinir la mthode run() et lancer le Thread dans le constructeur de la classe

- 22 -