M2 ISF Intrductin à la P.O.O et langage java (fascicule 2) O. Auzende 2012-2013 1
Le paquetage graphique java.awt... 3 Principe de cnstructin d une fenêtre graphique... 3 Exemple de cnstructin d une fenêtre graphique... 4 La gestin des événements... 6 Principe de la gestin des événements... 6 Mise en œuvre en java... 6 Prgrammatin... 7 Exercice... 8 Les cnversins et les calculs... 10 Cnversin d une chaîne en nmbre... 10 Cnversins d un nmbre en chaîne... 10 Exercice... 10 Applicatin financière (partie 1)... 11 Les applets Java... 12 Qu est-ce qu une applet?... 12 Insertin d une applet dans une page HTML... 13 Méthdes d une applet... 13 Exécutin d une applet... 13 Transfrmatin d une applicatin en applet... 13 Les paramètres d une applet... 14 Applicatin financière (partie 2)... 14 2
Prgrammatin Orientée Objet et langage java Le paquetage graphique java.awt Le paquetage java.awt furnit tutes les classes permettant de bâtir des fenêtres graphiques. La classe Cmpnent est à l rigine de tus les cmpsants graphiques. En italiques, les classes abstraites (qui n autrisent pas la créatin d bjets). Cmpnent est abstraite ; sn rôle est de prpser des méthdes qui sernt héritées par tutes les sus-classes. Dans la parable, ce qui est extérieur au paquetage java.awt, mais dérive d une classe de java.awt. En flèches pintillées, les implémentatins d interfaces. Buttn Canvas Checkbx Chice Panel Applet Cmpnent Cntainer Label List Windw Dialg Frame FileDialg Scrllbar TextCmpnent TextArea TextField MenuCmpnent MenuBar MenuItem BrderLayut CardLayut FlwLayut GridBagCnstraints GridBagLayut GridLayut LayutManager Principe de cnstructin d une fenêtre graphique Les cmpsants (textes, butns, cases à ccher, etc) snt insérés dans un bjet dérivant de Cntainer : Les bjets de type Panel snt des znes nn délimitées, permettant de ranger des cmpsants. Les bjets de type Windw snt des fenêtres standard ; il y a deux sus-classes : Frame : les bjets de ce type snt des fenêtres avec barre de titre et scrllbar Dialg : les bjets de ce type snt des fenêtres de dialgue avec l utilisateur Un LayutManager (gestinnaire de placement) définit cmment snt placés les bjets. C est une interface qu implémentent plusieurs classes, dnt : BrderLayut qui répartit les bjets au Nrd, Sud, Est, Ouest et Centre (c est l ptin par défaut pur un Frame) FlwLayut qui les répartit de gauche à drite puis passe à la ligne suivante (c est l ptin par défaut pur un Panel) GridLayut qui les répartit dans un tableau dnt tutes les cases nt la même taille. 3
Tris exemples imprt java.awt.* ; class Appli1 { public static vid main(string arg[]) { Frame w = new Frame("Exemple") ; w.add("nrth", new Label("Un")) ; w.add("center", new Label("Deux")) ; w.add("suth", new Label("Tris")) ; w.shw() ; w.pack() ; imprt java.awt.* ; class Appli2 { public static vid main(string arg[]) { Frame w = new Frame("Exemple") ; w.setlayut(new FlwLayut()) ; w.add(new Label("Un")) ; w.add(new Label("Deux")) ; w.add( new Label("Tris")) ; w.shw() ; w.pack() ; imprt java.awt.* ; class Appli3 { public static vid main(string arg[]) { Frame w = new Frame("Exemple") ; w.setlayut(new GridLayut(2,2)) ; w.add(new Label("Un")) ; w.add(new Label("Deux")) ; w.add( new Label("Tris")) ; w.add( new Label("Quatre")) ; w.shw() ; w.pack() ; BrderLayut par défaut : FlwLayut chisi : GridLayut chisi : Exemple de cnstructin d une fenêtre graphique Schéma : 4
Le fichier UtilFenetre.java ci-dessus cmprte deux classes : la classe Fenetre cnstruisant la fenêtre la classe publique UtilFenetre cnstituant le prgramme principal imprt java.awt.* ; class Fenetre extends Frame { prtected Panel p1, p2, p3, p31, p32 ; prtected TextArea txt ; prtected Buttn butn1, butn2, butn3 ; prtected CheckbxGrup cbg ; prtected Checkbx chb1, chb2, chb3 ; prtected List selectin1, selectin2 ; Fenetre() { setlayut(new FlwLayut()) ; // cnstructin du Panel p1 p1 = new Panel() ; p1.setlayut(new GridLayut(4,1)) ; p1.add(new Label("Jur")) ; selectin1 = new List(3) ; selectin1.additem("lundi") ; selectin1.additem("mardi") ; selectin1.additem("mercredi") ; selectin1.additem("jeudi") ; selectin1.additem("vendredi") ; selectin1.additem("samedi") ; selectin1.additem("dimanche") ; p1.add(selectin1) ; p1.add(new Label("Hraire")) ; selectin2 = new List(3) ; selectin2.additem("9 h - 12 h") ; selectin2.additem("12 h - 15 h") ; selectin2.additem("15 h - 18 h") ; selectin2.additem("18 h - 21 h") ; p1.add(selectin2) ; add(p1) ; // cnstructin du Panel p2 p2 = new Panel() ; p2.setlayut(new GridLayut(4,1)) ; p2.add(new Label("Lcalisatin")) ; cbg = new CheckbxGrup(); chb1 = new Checkbx("Paris", cbg, true); p2.add(chb1) ; chb2 = new Checkbx("Lyn", cbg, false); p2.add(chb2) ; chb3 = new Checkbx("Marseille", cbg, false); p2.add(chb3) ; add(p2) ; // cnstructin du Panel p3 p3 = new Panel() ; p3.setlayut(new BrderLayut()) ; p31 = new Panel(); butn1 = new Buttn("Valider") ; p31.add(butn1) ; butn2 = new Buttn("Désélectinner") ; p31.add(butn2) ; p3.add("nrth", p31) ; txt = new TextArea(5,30) ; p3.add("center",txt) ; p32 = new Panel() ; butn3 = new Buttn("Quitter") ; p32.add(butn3) ; p3.add("suth", p32) ; add(p3) ; // fin du cnstructeur // fin de la classe Fenetre public class UtilFenetre { public static vid main(string args[]) { Fenetre f = new Fenetre() ; f.pack() ; f.shw() ; Pur le mment aucun événement n est pris en cmpte sur cette fenêtre // classe utilisateur 5
La gestin des événements Principe de la gestin des événements La fenêtre graphique délègue la gestin des événements à d autres classes : c est le mdèle MVC (Méthde - Vue - Cntrôleur) Fenêtre = vue (instance d une classe) Prise de décisin = cntrôleur (instance d une autre classe) Actin = méthde (instance d une trisième classe) Mise en œuvre en java On attache un Listener (surveillant) aux bjets graphiques que l n suhaite surveiller (Buttn, Windw, etc.). Il existe différents Listeners dépendant du type d bjet à surveiller, mais tus snt des instances d interfaces. On a dnc besin d une classe implémentant les interfaces nécessaires. On appellera cette classe la classe Adaptateur. Un bjet de la classe Adaptateur, étant de fait devenu un listener, sera alrs autmatiquement averti des événements (event) qui se prduisent sur les bjets graphiques surveillés. Il décidera alrs des actins à entreprendre en fnctin de la demande de l utilisateur, et dnnera l rdre à un exécuteur de faire ces actins. L exécuteur sera un bjet d une classe que l n appellera la classe Delegue ; il exécutera les actins demandées par l bjet Adaptateur et interviendra sur la vue pur en mdifier l apparence. Illustratin par deux exemples Clic sur un butn cntenu dans la fenêtre Clic sur le butn de fermeture de la fenêtre Résumé La VUE est la fenêtre graphique. C est une instance d une classe graphique. Le CONTROLEUR est une instance d une classe implémentant les Listeners nécessaires ; n appellera cette classe la classe Adaptateur car elle décide cmment «adapter» la fenêtre aux actins demandées par l utilisateur. La METHODE est une instance d une classe cntenant les méthdes à effectuer ; n appellera cette classe la classe Delegue car le CONTROLEUR «délègue» à la METHODE la respnsabilité des actins à entreprendre sur la fenêtre. 6
Prgrammatin Etape 1. Dans le cnstructeur de la fenêtre, n déclare un attribut de nm delegue de la classe Delegue prtected Delegue delegue ; puis n demande à la classe Delegue la créatin d un bjet Delegue par appel au cnstructeur en lui envyant l adresse de la fenêtre : delegue = new Delegue(this) ; L adresse du délégué ainsi créé est dnc stckée dans l attribut delegue tandis que le délégué stcke dans sn attribut fen l adresse de la fenêtre pur puvir ultérieurement ultérieurement agir sur elle : Analgie avec le currier : Nus écrivns à un destinataire que nus venns de décuvrir (à une adresse que nus gardns en mémire) et nus lui envyns ntre prpre adresse (this) pur qu il puisse lui-même la stcker et nus répndre plus tard. Etape 2. On définit une classe Adaptateur qui écute les événements et décide des actins à faire accmplir par le délégué. Pur cela, la classe Adaptateur implémente un u plusieurs Listeners seln les bjets à surveiller. Exemple : pur surveiller les éléments sur un butn et sur une fenêtre, il faut écrire : class Adaptateur implements WindwListener, ActinListener {... et définir dans la classe Adaptateur les méthdes des interfaces WindwListener (7) et ActinListener (1). Etape 3. On déclare dans le cnstructeur de la fenêtre un attribut appelé adapt de la classe Adaptateur : prtected Adaptateur adapt ; puis n demande au cnstructeur de la classe Adaptateur de créer un bjet de la classe Adaptateur en lui envyant l adresse du délégué, puisque c est au délégué que l adaptateur s adressera : adapt = new Adaptateur(delegue) ; 7
Penser encre à l analgie avec le currier : nus écrivns à un secnd destinataire (l Adaptateur adapt), mais nus lui demandns de répndre ultérieurement au premier destinataire (le delegue), dnt il n a pas a priri l adresse. Il faut dnc lui passer cette adresse, pur qu il puisse la stcker. La fenêtre stcke l adresse de l adaptateur dans l attribut adapt. L adaptateur stcke l adresse du délégué dans un attribut delegue : Etape 4. Dans le cnstructeur de la fenêtre, n enregistre l Adaptateur adapt sur les bjets à surveiller. Les méthdes d enregistrement des adaptateurs dépendent du type des bjets à surveiller. Exemple : si butn1 est un bjet de la classe Buttn, et si adapt dit surveiller butn1, n écrira : butn1.addactinlistener(adapt) ; Etape 5. On cmplète dans la classe Adaptateur les méthdes bligatires prvenant des Listeners implémentés, puis n écrit dans la classe Delegue les méthdes nécessaires pur que le délégué puisse effectuer les pératins nécessaires. Exercice Cmpléter le fichier UtilFenetre.java précédent afin d btenir après validatin le résultat ci-cntre : imprt java.awt.* ; imprt... class Fenetre extends Frame { // la classe de la fenêtre (la VUE) prtected Panel p1, p2, p3, p31, p32 ; prtected TextArea txt ; prtected Buttn butn1, butn2, butn3 ; prtected CheckbxGrup cbg ; prtected Checkbx chb1, chb2, chb3 ; prtected List selectin1, selectin2 ; prtected... prtected... 8
Fenetre() { // cnstructin des Panel p1, p2 et p3 :... // n garde les instructins telles quelles // ajuts pur la gestin des événements // créatin du délégué et de l adaptateur delegue =... adapt =... // enregistrement de l adaptateur cmme listener addwindwlistener... butn1.addactinlistener... butn2.addactinlistener... butn3.addactinlistener... public class UtilFenetre { // la classe utilisateur public static vid main(string args[]) { Fenetre f = new Fenetre() ; f.pack() ; f.shw() ; class Delegue { prtected Fenetre fen ; // partie traitement (la METHODE) Delegue(Fenetre f) { fen = f ; public vid quitter() {... public vid annulle() { fen.selectin1.deselect... fen.selectin2.deselect... fen.chb1.setstate... fen.chb2.setstate... fen.chb3.setstate... fen.txt.settext... public vid affichetexte() { String res = "Vus avez chisi le " +... res=res + "\ndans la tranche hraire " +... res=res + "\nà " +... fen.txt.settext... class Adaptateur implements ActinListener, WindwListener { // aiguillage (le CONTROLEUR) prtected Delegue delegue ; Adaptateur(Delegue d) { delegue = d ; // méthde indispensable cmme ActinListener public vid actinperfrmed(actinevent e) { Object src =... String param =... if (param == "Quitter") delegue.quitter() ; else if (param == "Désélectinner") delegue.annulle() ; else delegue.affichetexte() ; // méthdes indispensables cmme WindwListener public vid windwclsing(windwevent e) { delegue.quitter() ; public vid windwclsed(windwevent e) { public vid windwicnified(windwevent e) { public vid windwdeicnified(windwevent e) { public vid windwactivated(windwevent e) { public vid windwdeactivated(windwevent e) { public vid windwopened(windwevent e) { 9
Les cnversins et les calculs Tute dnnée entrée dans un champ de saisie u récupérée d une liste de sélectin est une chaîne de caractères. Pur être utilisable en vue de calculs, elle dit être cnvertie en nmbre. Inversement, tute dnnée à afficher dans une fenêtre graphique dit être de type chaîne de caractères. Il faut dnc cnvertir les nmbres en chaînes de caractères. Cnversin d une chaîne en nmbre En un entier n : int n =... int n =... En un duble d : duble d =... duble d =... Cnversins d un nmbre en chaîne Cnversin d un entier n en chaîne ch : String ch =... Cnversin d un duble d en chaîne ch : String ch =... Exercice Cmpiler et exécuter l applicatin UtilCalcul. Cmpléter ensuite cette applicatin pur qu elle exécute la cnversin d eurs en dllars : imprt java.awt.* ; imprt java.awt.event.* ; class Fenetre extends Frame { static duble t = 1.4 ; // 1 eur = 1.4 dllars ; mettre à jur le taux prtected Panel p0,p1,p2 ; prtected TextField txt1, txt2 ; prtected Buttn butn ; prtected Delegue delegue ; prtected Adaptateur adapt ; Fenetre() { p0 = new Panel() ; p0.add(new Label("Cnversin eurs --> dllars")); add("nrth", p0); p1 = new Panel() ; p1.setlayut(new GridLayut(2,3)); p1.add(new Label("mntant en ")); p1.add(new Label(" ")) ; p1.add(new Label("mntant en $")) ; txt1 = new TextField(3) ; p1.add(txt1); butn = new Buttn(" = "); p1.add(butn) ; txt2 = new TextField(3) ; p1.add(txt2); add("center", p1) ; p2 = new Panel() ; p2.add(new Label("Taux actuel : 1 eur vaut " + t + " $")); add("suth", p2); delegue = new Delegue(this) ; adapt = new Adaptateur(delegue) ; addwindwlistener(adapt) ; butn.addactinlistener(adapt) ; public class UtilCalcul { public static vid main(string args[]) { Fenetre f = new Fenetre() ; f.pack() ; f.shw() ; 10
class Delegue { prtected Fenetre fen ; Delegue(Fenetre f) { fen = f ; public vid quitter() { System.exit(0) ; public vid calcule() {... // méthde à cmpléter............ class Adaptateur implements ActinListener, WindwListener { prtected Delegue delegue ; public Adaptateur(Delegue d) { delegue = d ; public vid actinperfrmed(actinevent e) { delegue.calcule() ; public vid windwclsing(windwevent e) { delegue.quitter() ; public vid windwclsed(windwevent e) { public vid windwicnified(windwevent e) { public vid windwdeicnified(windwevent e) { public vid windwactivated(windwevent e) { public vid windwdeactivated(windwevent e) { public vid windwopened(windwevent e) { Applicatin financière (partie 1) Il s agit de cmpléter une applicatin financière permettant de déterminer si un emprunt pur un achat immbilier est autrisé u nn par une banque et de calculer les mensualités relatives au rembursement de cet emprunt. L accrd de la banque pur autriser l emprunt dépend : du prix du bien à acquérir de l apprt persnnel dnt dispse le client de l âge du client du revenu mensuel du client du nmbre d années de rembursement (de 10 à 30 ans) L interface de saisie des dnnées est furnie dans le fichier Emprunt.java du dssier applicatin-financire. Elle se présente cmme suit : 11
L autrisatin d accrder l emprunt dépend de tris cnditins : Cnditin 1 Le mntant à emprunter (différence entre le prix du bien et l apprt persnnel) ne peut dépasser 80 fis le revenu mensuel. Sinn, un message dit être affiché (vir ci-cntre) : Cnditin 2 La smme de l âge du client et du nmbre d années de rembursement de l emprunt dit être inférieure à 70. Sinn, un message est affiché (vir ci-cntre) : Si les deux premières cnditins snt remplies, alrs : le taux annuel du prêt est déterminé. Il dépend du nmbre d années de rembursement : - si nmbre d années <=10, taux = 6 % annuel - si 10 < nmbre d années <= 20, taux = 5.5 % annuel - si 20 < nmbre d années <= 30, taux = 5 % annuel la mensualité de rembursement est calculée la cnditin 3 est testée : un prêt ne peut être autrisé que si la mensualité de rembursement ne dépasse pas 33 % du revenu mensuel. Sinn, il est refusé avec un message expliquant le refus. Exemple ù le prêt est refusé : Exemple ù le prêt peut être autrisé : Cmpléter l applicatin en implémentant les fnctinnalités décrites ci-dessus. Les applets Java Qu est-ce qu une applet? Une applet est une petite applicatin prtable, insérée dans une page HTML et chargée par un navigateur en même temps que la page HTML. Exécutée par l interpréteur java du navigateur, l applet permet de délcaliser certains traitements (calculs, animatins graphiques, vérificatin de la validité d un frmulaire, etc.) chez le client. 12
Du pint de vue infrmatique, une applet est une instance d une classe java héritant de la classe Applet : class mnapplet extends Applet {... Elle gère seule sn apparence dans la zne de la page HTML qui lui est réservée. Insertin d une applet dans une page HTML <applet cdebase=cdebase_url cde="nmclasse.class" alt="texte_de_remplacement" name="nm_instance" width=pixels height=pixels > <param name=nm_param1 value="valeur1"> <param name=nm_param2 value="valeur2"> </applet> en gras les lignes bligatires URL ù n cherche le fichier.java nm du fichier de pseud-cde texte si navigateur nn cmpatible nm de l applet dans la page html largeur puis hauteur de la zne d affichage de l applet paramètres éventuels en nmbre quelcnque Méthdes d une applet La classe maître de l applet est une classe publique, dérivant de la classe Applet. Elle ne cmprte jamais de méthde main, mais dispse de méthdes spécifiques : init() réalisant l initialisatin de l applet (remplace le cnstructeur) paint(graphics g) qui redessine en permanence l applet sur l écran à l aide d un cntexte graphique g furni. Si l n veut permettre à l utilisateur d interagir avec l applet, il faut gérer les événements en définissant (cmme précédemment) les classes Adaptateur (cntrôleur) et Delegue (exécuteur). Exécutin d une applet Il y a deux manières d exécuter des applets : faire appel à un visualiseur (l appletviewer) à qui n dnne le nm de la page HTML cntenant l applet : appletviewer nmpage.html La page HTML n est pas visible, seule l applet est visualisée faire appel à un navigateur en lui faisant afficher la page HTML cntenant l applet Transfrmatin d une applicatin en applet On peut transfrmer une applicatin en applet à cnditin : de ne pas avir besin de lire u écrire des dnnées sur la machine cliente de ne pas avir de traitement à faire sur le serveur (autre que la simple lecture d un fichier, qui est autrisée) Liste des mdificatins à effectuer : imprter le paquetage java.applet faire dériver la classe de la fenêtre (la VUE) de la classe Applet (au lieu de la classe Frame) supprimer la classe principale de l applicatin (ce qui impse de renmmer le fichier) la classe de la fenêtre étant devenue la classe maître, la déclarer public et renmmer sn cnstructeur en static vid init() mdifier la classe Adaptateur pur qu'elle n'implémente plus l'interface WindwListener mdifier la classe Delegue en cnséquence écrire la page HTML cmpiler et tester avec l appletviewer et avec un navigateur. 13
Les paramètres d une applet Une page HTML peut passer des paramètres à une applet. Si la page HTML cntient les lignes : <applet cde= "truc.class" > <param name="nm" value="dupnt"> <param name="valeur" value="3.56"> </applet> alrs n peut récupérer le nm dans les méthdes de l applet par : String nm =getparameter("nm") ; String valeur =getparameter("valeur") ; On récupère tujurs une chaîne de caractères. Si n veut cnvertir cette chaîne en nmbre, n utilise les méthdes habituelles de cnversin d une chaîne en int, flat u duble. Applicatin financière (partie 2) 1) Transfrmer l applicatin Emprunt.java en une applet intégrée dans une page HTML. Ecrire la page emprunt.html appelant l applet de la manière suivante : <html> <head> <title> Applet</title> </head> <bdy> <h2><center>applet Emprunt</center></h2> <center> <applet cde="...class" width=800 height=400> </applet> </center> </bdy> </html> 2) Mettre les tris valeurs du taux en paramètres dans la page HTML. Mdifier ensuite l applet pur que ces valeurs sient récupérées et utilisées. 14