L’API Graphique de Java Daniel Tschirhart : Programmation Java V1.37 Daniel Tschirhart : Programmation Java V1.37 AWT Java AWT (Abstract Windows Toolkit) est un ensemble de composants graphiques permettant de réaliser une application de type graphique indépendamment de la plateforme utilisée pour le développement. AWT utilise l’API graphique sous-jacente de la plateforme d’accueil. Une application AWT possède le look de la plateforme d’accueil. 2 Daniel Tschirhart : Programmation Java V1.37 Swing Java Swing est écrit entièrement en Java pour la portabilité. Contrairement à AWT, tous les éléments de l’interface graphique sont redessinés par Java. Swing possède également une fonctionnalité assez avancée, appelée le «pluggable look and feel », qui signifie que l'apparence de l'interface utilisateur peut être modifiée dynamiquement pour s'adapter aux habitudes des utilisateurs travaillant sur des plateformes et systèmes d'exploitation différents. Il est même possible (quoique difficile) d'inventer son propre «look and feel». 3 Daniel Tschirhart : Programmation Java V1.37 Classes AWT n Les principales classes sont : n n n Canvas qui permet de dessiner dans un cadre de fenêtre Frame qui permet d’afficher une fenêtre Graphics qui fourni l’accès aux outils de dessin. 4 Daniel Tschirhart : Programmation Java V1.37 Communication des actions utilisateurs à la fenêtre n Les actions utilisateurs et système sont transmis à un écouteur via un mécanisme d’abonnement. Dans l’application 5 Daniel Tschirhart : Programmation Java V1.37 Événements dans java n Java distingue deux types d’événements : n n n Les événements liés à la fenêtre : essentiellement les boutons Les événements liées à des composants placés dans la fenêtre : contrôles (boutons, listes, cases à cocher …) La communication d’un événement à l’application se fait par un mécanisme d’abonnement 6 Daniel Tschirhart : Programmation Java V1.37 Création d’une fenêtre Il y a deux méthodes pour dessiner une fenêtre : n 1. 2. En instanciant un objet de la classe Frame En dérivant une classe de la classe Frame Les deux possibilités seront mis en œuvre à travers une calculette Euro et un mini système graphique n n n Avec la calculette nous utiliserons la méthode 1 et nous verrons comment gérer des zones d'édition, Dans le mini système graphique utiliserons la méthode 2 et nous verrons comment dessiner et gérer des boutons, 7 Daniel Tschirhart : Programmation Java V1.37 Exemple Calculette1 Création d'un fenêtre par dérivation de la classe Frame Dérive de Frame Affiche la fenêtre 8 Daniel Tschirhart : Programmation Java V1.37 Création d'un fenêtre par dérivation de la classe Frame : exemple calculette euro Contrôle label n Contrôle d’édition La calculette fonction de façon suivante : n n Toute frappe dans la zone Dollar provoque la conversion dans la zone Euros Toute frappe dans la zone Euros provoque la conversion dans la zone Dollar 9 Daniel Tschirhart : Programmation Java V1.37 Principaux éléments d’IHM n Les objets d’interface graphique s’appellent des contrôles. Ils génèrent des événements aux quels on abonne des méthodes appelées gestionnaires d’événements. Contrôle Choise Contrôle Scrollbar Contrôle List 10 Daniel Tschirhart : Programmation Java V1.37 Positionnement des contrôles n Les contrôles sont positionnés dans la fenêtre suivant l’ordre donné par setLayout auquel on passe un objet de classe LayoutManager pouvant prendre les valeur suivantes : n FlowLayout : aligne les contrôles de gauche à droite et de haut en bas n GridLayout : aligne les contrôles suivant une grille n BorderLayout : aligne les contrôles suivant des coordonnées géographiques (nord, sud, est, ouest) 11 Daniel Tschirhart : Programmation Java V1.37 Les labels n n Les labels sont des zones de texte pouvant être lus ou écrits par programmes. Les labels ne génèrent aucun événement. Mise en place d'un label Facultatif Ajout du label dans la fenêtre 12 Daniel Tschirhart : Programmation Java V1.37 Les labels : principales méthodes 13 Daniel Tschirhart : Programmation Java V1.37 Exemple Calculette2 Les zones d'édition n n Les zones d'édition sont des zones permettant la saisie de données au clavier. Ces zones constituent un mini éditeur de texte (gestion du curseur, du presse papier, ...). Mise en place d'une zone d'édition Taille de la zone en caractères Ajout de la zone dans la fenêtre 14 Daniel Tschirhart : Programmation Java V1.37 Les zones d'édition : principaux constructeurs 15 Daniel Tschirhart : Programmation Java V1.37 Les zones d'édition : principales méthodes 16 Daniel Tschirhart : Programmation Java V1.37 Les boutons n Les boutons sont des éléments d'IHM utilisés généralement pour valider des actions. 17 Daniel Tschirhart : Programmation Java V1.37 Les boutons : principales méthodes 18 Daniel Tschirhart : Programmation Java V1.37 Les cases à cocher n Les cases à cocher permettent de choisir de valider ou non des éléments quelconques. 19 Daniel Tschirhart : Programmation Java V1.37 Les cases à cocher : constructeurs 20 Daniel Tschirhart : Programmation Java V1.37 Les cases à cocher : principales méthodes 21 Daniel Tschirhart : Programmation Java V1.37 Les combos n Les combo permettent d'effectuer un choix parmi n éléments. 22 Daniel Tschirhart : Programmation Java V1.37 Les combos : Méthodes et constructeur 23 Daniel Tschirhart : Programmation Java V1.37 Les combos : Méthodes principales 24 Daniel Tschirhart : Programmation Java V1.37 Les boites à listes n Les boites à listes permettent de mémoriser des chaines de caractères. Cet élément est par exemple utilisé dans la calculette complexe. 25 Daniel Tschirhart : Programmation Java V1.37 Les boites à listes : constructeurs 26 Daniel Tschirhart : Programmation Java V1.37 Les boites à listes : principales méthodes (1) 27 Daniel Tschirhart : Programmation Java V1.37 Les boites à listes : principales méthodes (1) 28 Daniel Tschirhart : Programmation Java V1.37 TextArea n Un TextArea une zone d'édition multi lignes. 29 Daniel Tschirhart : Programmation Java V1.37 TextArea : constructeurs 30 Daniel Tschirhart : Programmation Java V1.37 TextArea : principales méthodes 31 Daniel Tschirhart : Programmation Java V1.37 FileDialog n FileDialog est un contrôle permettant l'accès aux fichiers et répertoires. 32 Daniel Tschirhart : Programmation Java V1.37 FileDialog : constructeurs 33 Daniel Tschirhart : Programmation Java V1.37 FileDialog : principales méthodes 34 Daniel Tschirhart : Programmation Java V1.37 FileDialog : exemple 35 Daniel Tschirhart : Programmation Java V1.37 Caractéristiques communes aux contrôles : couleur n Couleur avant plan et arrière plan n n setForeground setBackground label1.setForeground(Color.RED); this.setBackground(new Color(0xE0F8FE)); bouton.setBackground(); bouton.setBackground(Color.PINK); bouton.setForeground(Color.BLUE); 36 Daniel Tschirhart : Programmation Java V1.37 Caractéristiques communes aux contrôles : taille n Taille du contrôle (Largeur, Hauteur) n setSize this.setSize(763, 373); bouton.setSize(100, 30); 37 Daniel Tschirhart : Programmation Java V1.37 Caractéristiques communes aux contrôles : nom n Nom interne n setName this.setName("Ma Fenêtre"); bouton.setName("Bouton 1"); n Ces noms sont des données qui ne sont pas affichées, ils peuvent être utilisées pour identifier un contrôle de façon dynamique. 38 Daniel Tschirhart : Programmation Java V1.37 Caractéristiques communes aux contrôles : position et dimension n Permet de définir la position et la taille du contrôle dans la fenêtre n setBounds bouton.setBounds(new Rectangle(x, y, largeur, hauteur)); . 39 Daniel Tschirhart : Programmation Java V1.37 Caractéristiques communes aux contrôles : police n Police n setFont bouton.setFont(new Font("",Font.BOLD,20)); bouton.setFont(new Font("Monospaced", Font.PLAIN | Font.BOLD | Font.ITALIC,20)); S'applique à tous les contrôles 40 Daniel Tschirhart : Programmation Java V1.37 Exemple CalculetteEuro!!! Gestionnaire événements n n n Les contrôles communiquent les actions effectuées par l'utilisateur à l'aide d'événements. Ces événements sont gérés par le système d'exploitation sousjacent et par la machine Java. Pour que l'événement remonte vers l'application, l'objet contrôlé doit abonner une ou plusieurs fonctions à ce celui-ci. La fonction abonnée s'appelle un gestionnaire d'événement ou un écouteur. 41 Daniel Tschirhart : Programmation Java V1.37 Types d'événements (non exhaustif) n Java propose des abonnements à une grande variété d’événements. 42 Daniel Tschirhart : Programmation Java V1.37 Exemple CalculetteEuro!!! Syntaxe des abonnements n Syntaxe < réf source événement>.<méthode>(<ref obj à abonner>) n < réf source événement> : référence de l'objet générateur d'événements n < méthode> : add<nom événement>Listener Exemple : addKeyListener n <ref obj à abonner> : référence de l'objet abonné. n n Si les gestionnaires d'événements appartiennent à la classe abonnante la référence de l'objet à abonner est this Si les gestionnaires d'événements appartiennent une classe différente de la classe abonnante la référence de l'objet est la référence d'un objet de cette classe. 43 Daniel Tschirhart : Programmation Java V1.37 Exemple Calculette1 Exemple d'abonnement Source des événements Type d'événement Référence de l'objet abonné 44 Daniel Tschirhart : Programmation Java V1.37 Exemple Calculette1 Exemple d'abonnement Source des événements Type d'événement Référence de l'objet abonné Classe abonnée 45 Daniel Tschirhart : Programmation Java V1.37 Exemple CalculetteEuro!!! Les écouteurs n n n Un écouteur est une fonction appelée par la machine java en réponse à un événement. Pour qu'un écouteur soit appelé, il faut l'abonner à cet événement. Un écouteur possède une signature particulière qui doit être absolument respectée. Pour respecter cette signature celle-ci est spécifiée dans une interface. n En implémentant (définissant) toutes les fonctions de l'interface on respecte obligatoirement cette signature. 46 Daniel Tschirhart : Programmation Java V1.37 Exemple • Dériver la classe comportant le contrôle, de l'interface où sont situées les signatures des écouteurs. • Définir dans cette la classe les fonctions présentes dans l'interface • Dans l'objet source de l'événement, • abonner les écouteurs en précisant l'objet qui les contient. source des événements référence de l'objet où sont situés les écouteurs référence de la source des événements 47 Daniel Tschirhart : Programmation Java V1.37 Code complet 48 Daniel Tschirhart : Programmation Java V1.37 Problèmes posés par cette méthode Exemple CalculetteEuro!!! n Si l'interface comporte 20 méthodes, il faut les définir toutes même si elles ne font rien. n Le code résultant devient peut lisible. 49 Daniel Tschirhart : Programmation Java V1.37 Amélioration de la méthode précédente n n n Dériver d'une l'interface comportant des écouteurs et implémenter tous les écouteurs par des fonctions vides. Définir cette classe comme abstraite pour interdire toute instanciation directe. Dériver cette classe et définir uniquement les écouteurs présentant un intérêt. 50 Daniel Tschirhart : Programmation Java V1.37 Illustration 51 Daniel Tschirhart : Programmation Java V1.37 Explications n La classe abstraite (par exemple WindowAdapter) hérite d'une l’interface (par exemple WindowListener). n n Cette classe définit toutes les fonctions de l’interface par des fonctions vides (comme la plupart des gestionnaires définis dans l’exemple précédent). La classe WindowAdapter est rendue abstraite (par le préfixe abstract) pour interdire toute instanciation directe de la classe. 52 Daniel Tschirhart : Programmation Java V1.37 Mise en place de l'écouteur • Dériver la classe la classe abstraite comportant les écouteurs (ici WindowAdapter WindowAdapter) ) et surcharger un ou plusieurs écouteurs. • Dans l'objet source de l'événement, • abonner l'écouteur en précisant l'objet où il se trouve. source des événements référence de l'objet où sont situés les écouteurs référence de la source des événements 53 Daniel Tschirhart : Programmation Java V1.37 Exemple complet 54 Daniel Tschirhart : Programmation Java V1.37 Exemple CalculetteEuro!!! Inconvénient de cette méthode n n Lourdeur si l'interface ne comporte que très peu d'écouteurs. Necessité de définir la classe surchargeant la classe abstraite. 55 Daniel Tschirhart : Programmation Java V1.37 Définir un écouteur dans une classe anonyme La définition de ce type de classe est similaire à celle d’une classe « normale ». Exemple X classe dérivant de Y: class X extends Y { public void uneFonctionQuiNeFaitRien() { } } Classe anonyme dérivant de la classe Y : extends Y { public void uneFonctionQuiNeFaitRien() { } } 56 Daniel Tschirhart : Programmation Java V1.37 Instancier une classe anonyme n n Instancier la classe anonyme précédente s’écrit : new Y() { public void uneFonctionQuiNeFaitRien() { } Cette anonyme hérite de la classe Y et peut être utilisée pour redéfinir une ou plusieurs méthodes de la classe Y. 57 Daniel Tschirhart : Programmation Java V1.37 Abonner un écouteur dans une classe anonyme Instanciation de la classe anonyme Classe héritée this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } } ); Source de l'événement Ecouteur Classe anonyme 58 Daniel Tschirhart : Programmation Java V1.37 Quels événements pour quels contrôles ? n n n n Le choix d'un événements associé à un contrôle est une question de logique.. La lecture de la documentation associée à la classe fournit dans le cas général le nom du gestionnaire le plus adapté. Les classes parentes peuvent fournir d'autres gestionnaires (naviguer dans la documentation de façon intelligente), mais le choix reste toujours une question de bon sens ! Eclipse fournit une aide similaire en présentant tous les gestionnaires présent dans la classe et dans les classes parentes, mais le choix reste toujours une question de bon sens. 59 Daniel Tschirhart : Programmation Java V1.37 Evénements liés à la fenêtre n Un événement peut se déclencher par : n n n n n n n L'activation de la fenêtre La fermeture effective de la fenêtre La fermeture de la fenêtre La désactivation de la fenêtre Le passage de l'état d'icône à l'état ouvert Le passage à l'état d'icône L'ouverture de la fenêtre 60 Daniel Tschirhart : Programmation Java V1.37 Abonnement n Abonnement par : addWindowListerner n Méthodes à abonner définies : n n n n en implémentant l'interface WindowListerner ou en dérivant la classe WindowAdapter Méthodes abonnées n n n n n n n public public public public public public public void void void void void void void windowClosing(WindowEvent e) windowActivated(WindowEvent e) windowClosed(WindowEvent e) windowDeactivated(WindowEvent e) windowDeiconified(WindowEvent e) windowIconified(WindowEvent e) windowOpened(WindowEvent e) 61 Daniel Tschirhart : Programmation Java V1.37 Exemple Calculette1 Définition des gestionnaires de fenêtre à l'aide de l'interface Implémente l'interfaceWindowListener (Déclare les méthodes abonnées) Abonner aux gestionnaires de la fenêtre Méthodes abonnées Ferme la fenêtre 62 Daniel Tschirhart : Programmation Java V1.37 Définition des gestionnaires de fenêtre à l'aide d'une classe 63 Daniel Tschirhart : Programmation Java V1.37 Exemple Calculette1 Remarque sur la syntaxe de l'abonnement Source des événements Abonner le gestionnaires de la fenêtre Référence de l'objet abonné Classe abonnée 64 Daniel Tschirhart : Programmation Java V1.37 Événements déclenchés par l‘appui d’un bouton n Interface à dériver ActionListener Abonnement par addActionListener n Ecouteur n public void actionPerformed(ActionEvent arg) n Détermination du bouton actionné 65 Daniel Tschirhart : Programmation Java V1.37 Evénements déclenchés par l'activation du contrôle n Peut se déclencher par : n n Le fait qu'un contrôle soit actif Le fait qu'un contrôle devienne inactifs 66 Daniel Tschirhart : Programmation Java V1.37 Abonnement n Abonnement par : addFocusListener n Méthodes à abonner définies : n n en implémentant dans l'interface FocusListerner n ou n en dérivant la classe FocusAdapter Méthodes abonnées n n public void focusLost(FocusEvent e) public void focusGained(FocusEvent e) 67 Daniel Tschirhart : Programmation Java V1.37 Exemple CalculetteEuro!!! Exemple d'abonnement et de définition d'un gestionnaires de focus 68 Daniel Tschirhart : Programmation Java V1.37 Evénements dus au claviers n Peut se déclencher par : n n n Une touche enfoncée Une touche relâchée Une touche frappée 69 Daniel Tschirhart : Programmation Java V1.37 Abonnement n Abonnement par : addKeyListener n Méthodes à abonner définies : n n n n en implémentant l'interface KeyListerner ou en dérivant la classe KeyAdapter Méthodes abonnées 70 Daniel Tschirhart : Programmation Java V1.37 Exemple CalculetteEuro!!! Exemple de gestionnaire d'événements pour le clavier 71 Daniel Tschirhart : Programmation Java V1.37 Evénements dus au mulot n Peut se déclencher par : n n n n n n n Clic bouton Curseur entrant dans la zone active Curseur sortant de la la zone active Clic enfoncé Clic relâché Zone de donnée déplacée à l'aide de la souris Souris déplacée 72 Daniel Tschirhart : Programmation Java V1.37 Abonnement mouse n Abonnement par : addMouseListener n Méthodes à abonner définies : n n n n en implémentant l'interface MouseListerner ou en dérivant la classe MouseAdapter Méthodes abonnées 73 Daniel Tschirhart : Programmation Java V1.37 Abonnement mouse motion n Abonnement par : addMouseMotionListener n Méthodes à abonner définies : n n n n en implémentant l'interface MouseMotionListerner ou dérivant la classe MouseMotionAdapter Méthodes abonnées 74 Evénements déclenchés par le changement de propriété d'un contrôle Daniel Tschirhart : Programmation Java V1.37 n Peut se déclencher par : n n n n n n n Le passage en arrière plan Le changement d'orientation L'activation du contrôle Le changement de police Le passage au premier plan La relocalisation du contrôle Le passage à l'état visible ou caché 75 Evénements déclenchés par le changements d'aspect d'un contrôle Daniel Tschirhart : Programmation Java V1.37 n Peut se déclencher par : n n n n Le passage à l'état invisible du contrôle Le déplacement du contrôle Le redimensionnement du contrôle Le passage à l'état visible du contrôle. 76 Daniel Tschirhart : Programmation Java V1.37 Abonnement n Abonnement par : addComponentListener n Méthodes à abonner définies : n n n n en implémentant l'interface ComponentListerner ou en dérivant la classe ComponentAdapter Méthodes abonnées 77 Daniel Tschirhart : Programmation Java V1.37 Evénements déclenchés par l'ajout d'un contrôle n Peu se déclencher part : n n Le fait qu'un contrôle soit ajouté à la fenêtre Le fait qu'un contrôle soit retiré de la fenêtre 78 Daniel Tschirhart : Programmation Java V1.37 Abonnement n Abonnement par : addContainerListener n Méthodes à abonner définies : n n n n en implémentant l'interface ContainerListerner ou dérivant la classe ComponentAdapter Méthodes abonnées 79 Evénements déclenchés par le changement de position du contrôle sur l'axe Z Daniel Tschirhart : Programmation Java V1.37 n Peut se déclencher par : n n Le fait que l'ordre de l'axe Z soit modifié. Le fait que l'élément en position Z-1 soit déplacé ou retaillé. 80 Daniel Tschirhart : Programmation Java V1.37 Abonnement n Abonnement par : addHierarchyListener n Méthodes à abonner définies : n n n n en implémentant l'interface HierarchyListener ou dérivant la classe HierarchyAdapter Méthode abonnée 81 Daniel Tschirhart : Programmation Java V1.37 Exemple Figures1 Création d’une fenêtre par instanciation de la classe frame Pour le moment on ne peut ni dessiner, ni fermer la fenêtre 82 Daniel Tschirhart : Programmation Java V1.37 Mise en place du mécanisme de fermeture d’une fenêtre Exemple Figures2 83 Daniel Tschirhart : Programmation Java V1.37 Dessiner dans une fenêtre n n Pour dessiner dans une fenêtre il faut sous classer Canvas. Cette classe fournit une méthode paint à laquelle elle transmet un objet Graphics avec lequel on peut dessiner. n La fonction paint est appelée : n n automatiquement chaque fois que le contenu de la fenêtre est altéré Manuellement chaque fois que l’on appelle la fonction repaint 84 Daniel Tschirhart : Programmation Java V1.37 Exemple Figures3 Dessiner dans une fenêtre (2) X, Y : centre du cercle trace un cercle tangent au bord supérieur gauche de la fenêtre 85 Daniel Tschirhart : Programmation Java V1.37 Exemple Figures3 Dessiner dans une fenêtre (3) Pour que la fenêtre utilise la classe Dessin il faut enregistrer l’objet gérant le dessin dans la classe Frame 86 Daniel Tschirhart : Programmation Java V1.37 Ajouter des éléments IHM n n Les éléments IHM les plus courants sont les boutons. Un bouton est créé en instanciant la classe Button n n n n Pour gérer des boutons, le plus simple est de créer une classe encapsulant les butons (classe MesBoutons). Pour que les boutons soient affichés dans la fenêtre il faut, comme pour le dessin enregistrer l’objet qui gère les boutons dans la classe Frame. L'objet contenant les boutons est positionné sur l’écran en précisant sa position cardinale dans la fenêtre (nord, sud, est, ouest, centre) lors de l’enregistrement. Cette position ne doit pas être en conflit avec d'autres positions. Pour qu'un bouton puisse agir sur un objet, il faut transmettre l’objet au constructeur de la classe gérant les boutons. 87 Daniel Tschirhart : Programmation Java V1.37 Exemple Figures Ajouter des éléments IHM (2) Enregistrer l’objet Dessin au centre de la fenêtre Créer un objet gérant les boutons et fournir au constructeur de la classe MesBoutons un objet Dessin Enregistrer l’objet gérant les boutons au bas de la fenêtre 88 Daniel Tschirhart : Programmation Java V1.37 Ajouter des éléments IHM (3) Créer des composants IHM : exemple de boutons n Un bouton est crée en instanciant la classe Button n n Pour pouvoir utiliser un bouton il faut signaler son existence en l’ajoutant à la classe Panel (fonction add). Il faut donc dériver la classe MesBoutons de la classe Panel pour pouvoir utiliser add. Un bouton produit lorsqu’il est actionné plusieurs événements (appuyé, relâché, …). n n n n Ces événements sont transmis à une fonction de rappel actionPerformed situé dans l’interface ActionListener (c’est sa seule fonction). Pour utiliser la fonction de rappel actionPerformed il faut l’implémenter dans la classe MesBoutons. La fonction addActionListener permet de relier la fonction de rappel à un bouton Dans la fonction de rappel ne pas oublier de forcer la mise à jour de la fenêtre le dessin à été modifié. 89 Daniel Tschirhart : Programmation Java V1.37 Exemple Figures Ajouter des éléments IHM (4) Sous classer Panel et implémenter l’interface ActionListener Récupérer l’objet dessin via le constructeur Créer les boutons et les enregistrer dans Panel Abonner à actionPerformed Réaliser les actions associés aux boutons Ne pas oublier de mettre à jour la fenêtre 90 Daniel Tschirhart : Programmation Java V1.37 La fenêtre finale 91 Daniel Tschirhart : Programmation Java V1.37 Les appletes Java n n n Un applet est un programme exécuté dans un navigateur Web Après avoir fait subir de légères modification au programme précédent (Figures) on peut le l'incorporer dans une page Web de façon suivante : on édite un fichier texte de nom quelconque (default.htm) contenant le code HTML suivant : Puis il suffit de lancer default.htm avec un navigateur web. 92 Daniel Tschirhart : Programmation Java V1.37 Créations d'appletes Java n Pour créer un applet il faut : 1. Dériver la classe principale de l'application de la classe Applet. 2. Ne instancier d'objets Frame, un applet utilise la fenêtre (frame) du navigateur 3. Définir une fonction init (non statique) à la place de main. 4. Préciser la mise en page de la fenêtre par SetLayout contrairement à une fenêtre Frame où l'appel à SetLayout est réalisé dans la classe Frame. 93 Daniel Tschirhart : Programmation Java V1.37 Exemple FigureApplet Créations d'applets Java (2) importer java.applet dériver la classe de Applet définir une fonction init à la place de main définir la couleur du fond (facultatif) IMPORTANT : préciser la mise en page (implicite dans un frame mais pas dans un applet) 94 Daniel Tschirhart : Programmation Java V1.37 Exemple FigureApplet Test de l'applete n Un applet peut être testé : n n soit dans le navigateur en créant une page html soit directement avec le programme appletviewer fourni avec le SDK 95 Daniel Tschirhart : Programmation Java V1.37 Exemple AppletCalculetteEuro Créations d'appletes Java : exemple 2 n Pour le convertisseur Euro-Dollar 1. Dériver la classe principale de l'application de la classe Applet. 2. Ne instancier d'objets Frame, un applet utilise la fenêtre (frame) du navigateur 3. Définir une fonction init (non statique) à la place de main. 4. Ne pas implémenter l'interface WindowListener et les gestionnaires associés. 96 Daniel Tschirhart : Programmation Java V1.37 Sécurité des appletes n Une applete ne peut n n ni accéder aux périphériques de stockage locaux, ni au serveur dont il est l’origine. 97 Daniel Tschirhart : Programmation Java V1.37 Les applications Java WebStart n n Une application Java WebStart est une application chargée depuis le serveur distant mais avec les possibilités d’une application classique. Pour accéder aux périphériques de stockage locaux et au serveur dont il est l’origine, l’application doit être signée. 98 Daniel Tschirhart : Programmation Java V1.37 Création d’une application Java WebStart n n A partir d’une application java classique (console, ou fenêtrée) faire une archive JAR Créer un fichier de lancement. C’est un fichier texte d’extension jnlp. Par exemple pour le QCM de type QUIZ on définit le fichier suivant quiz.jnlp contenant (en gras les lignes à paramétrer): 99 Daniel Tschirhart : Programmation Java V1.37 Fichier JNLP <?xml version="1.0" encoding="utf-8"?> <jnlp spec="1.0" codebase="http://daniel.tschirhart.free.fr/qcmprog" href="quiz.jnlp"> <information> <title>Quiz</title> <vendor>Daniel Tschirhart</vendor> <icon href=" "/> <offline-notallowed/> </information> <resources> <jar href="squiz.jar"/> <j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se"/> </resources> <security> <all-permissions/> </security> <application-desc main-class="s"/> </jnlp> 100 Daniel Tschirhart : Programmation Java V1.37 Générer une clé pour signer l’application n L’opération est réalisée avec l’utilitaire keytool fourni avec le JDK : keytool -genkey -validity 3650 -alias signature -keystore signatureStore n La clé possède ici une durée de validité de 10 ans (3650), elle est mémorisée dans le magasin signatureStore. Cette clé peut signer un nombre illimité d’applications 101 Daniel Tschirhart : Programmation Java V1.37 Signer l'application Signer l’application avec jarsigner fourni avec le JDK n Jarsigner -keystore SignatureStore -signedjar squiz.jar quizpro.jar signature On précise n n n n le magasin où est la clé est mémorisée, le nom du fichier une fois signé (ici squiz.jar) le nom de l’application à signer (ici quizpro.jar). 102 Daniel Tschirhart : Programmation Java V1.37 Mise en place de l'application n n Copier sur le site Web le fichier jnlp et le fichier jar signé. Préciser le lien du fichier jnlp dans la page Web de votre site. 103 Daniel Tschirhart : Programmation Java V1.37 Création d’une IHM avec Visual Editor n n Visual Editor est un plugin d’éclipse VE permet de créer facilement des IHM mais nécessite cependant de renseigner le code à la main. 104 Daniel Tschirhart : Programmation Java V1.37 Création d’une IHM avec VE 1. 2. 3. 4. 5. Créer un projet de type Java Sélectionner le nom du projet dans l’arborescence des projets et ajouter une classe avec VE (clic droit : Nouveau/Autre/Java/VisualClass) Choisir le type de style (Swing, AWT) et la classe parente (par exemple Frame pour AWT, Applet pour une applet). Cocher créer : public static void main(String[] arg) (!!! pas pour les applets). Nota : pour les applications conséquentes, il vaut mieux créer une classe à part. Donner un nom à la classe et valider VE créé le code source correspondant et affiche le modèle de fenêtre que vous avez choisi. 105 Daniel Tschirhart : Programmation Java V1.37 Création d’une IHM avec VE (2) 6. Modifier l’instruction d’import en mettant une * à la place du nom de la classe : Exemple : import java.awt.Frame; -> import java.awt.*; 7. 8. Dans public static void main, instancier la classe gérant l’IHM, et afficher la fenêtre. Exemple : si la classe s’appelle Ihm écrire : new Ihm().setVisible(true); Définir éventuellement la couleur d’arrière plan de la fenêtre : Exemple : this.setBackground(Color.ORANGE); 106 Daniel Tschirhart : Programmation Java V1.37 Mise en place des gestionnaires de fenêtre 9. Sélectionner la fenêtre, puis clic droit. A ce niveau vous pouvez : a. b. c. Définir le titre de la fenêtre, Définir le mode la disposition des composants sur la fenêtre : Set Layout -> choisir null pour avoir toute liberté de disposition. Définir un gestionnaire d’événement. 10. Définir le gestionnaire WindowsClosing sous peine de ne pas pouvoir arrêter l’application : remplacer System.out.println("windowClosing()"); par System.exit(0); 11. Tester l'application. 107 Daniel Tschirhart : Programmation Java V1.37 Classe anonyme n n VE utilise une possibilité de Java de créer des classes anonymes. Cette possibilité est utilisée pour l'abonnemnt d'un contrôle à un événement. Pour abonner une classe à une contrôle il faut préciser la classe à abonner, et une fonction de signature particulière situé cette la classe. 108 Daniel Tschirhart : Programmation Java V1.37 Abonner un écouteur dans une classe anonyme Instanciation de la classe anonyme Classe héritée this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } } ); Source de l'événement Ecouteur Classe anonyme 109 Daniel Tschirhart : Programmation Java V1.37 Ajout des contrôles dans le fenêtre 11. A droite de la fenêtre d’éclipse, cliquer sur Palette, dans le menu choisir le type de contrôle et cliquer sur la punaise pour fixer ce choix. 12. Mettre en place les contrôles de votre application, et leurs gestionnaires d’événements associés en sélectionnant le contrôle dans la palette et en dessinant le contrôle dans la fenêtre. 13. Personnaliser les contrôles en sélectionnant le contrôle puis en ouvrant l'onglet de propriétés. 110 Daniel Tschirhart : Programmation Java V1.37 Personalisation des contrôles: exemple de fenêtre de propriétes 111