Cours INF 1573 Programmation II Laboratoire 8 Hiver 2008 Prof. Ilham Benyahia Chargées de laboratoire Diagne Fatou et Lahcen Boumedjout Objectifs du laboratoire - Renforcer la programmation par événements et la réutilisation de composantes de l’API de java, Utilisation de classes abstraites Introduire des éléments de la qualité de programmation : la documentation du code javadoc Les applets : - point d’entrée - le tag HTML Applet - la transmission de paramètres - le cycle de vie et le paradigme d’événements Le package AWT (Abstract Windowing Toolkit) : - La classe abstraite Graphics, les objets et les contextes graphiques - La classe Color - La classe Font - Autres packages graphiques Autres notions : restrictions de sécurité Les applets Exemple de code java : import java.applet.Applet; import java.awt.Graphics; public class Bienvenue extends Applet { public void paint(Graphics g) { g.drawString("Bienvenue dans le monde des applets!", 50, 25); } } Imbrication dans le code html : < APPLET [CODEBASE = codebaseURL] CODE = appletFile [ALT = alternateText] [NAME = appletInstanceName] WIDTH = pixels HEIGHT = pixels [ALIGN = alignment] [VSPACE = pixels] [HSPACE = pixels] > [< PARAM NAME = appletParameter1 VALUE = value >] [< PARAM NAME = appletParameter2 VALUE = value >] . . . [alternateHTML] </APPLET> Référence : http://java.sun.com/docs/books/tutorial/applet/appletsonly/appletTag.html Exercice 1.a Employez le code java ci-haut pour créer l’applet Bienvenue, puis l’exécuter dans le appletviewer et dans un navigateur. Cycle de vie d’un applet Le cycle de vie d’un applet se découpe en diverses étapes ponctuées par des événements : public class Simple extends Applet { . . . public void init() { . . . } // evt : (re)chargement de l’applet public void start() { . . . } // evt : chargement de l’applet public void stop() { . . . } // evts : changement de page, // sortie du navigateur public void destroy() { . . . } // ménage final . . . } Exercice 1.b Modifiez la classe Simple ci-haut pour créer une applet qui génère une trace du cycle de vie d’une applet à l’aide de la méthode println(). Hiérarchie de classe d’une applet java.lang.Object java.awt.Component java.awt.Container java.awt.Panel java.applet.Applet Référence : http://java.sun.com/j2se/1.4.2/docs/api/java/applet/Applet.html Exercice 1.c Trouvez la méthode paint() dans la hiérarchie ci-haut. A quelle classe appartient cette méthode ? Dans quelles circonstances est-elle invoquée ? Paramètres d’une applet - public String getParameter(String name) <APPLET CODE=AppletSubclass.class WIDTH=anInt HEIGHT=anInt> <PARAM NAME=parameter1Name VALUE=aValue> <PARAM NAME=parameter2Name VALUE=anotherValue> </APPLET> <APPLET CODE="Animator.class" WIDTH=460 HEIGHT=160> <PARAM NAME="image" VALUE="images/Beans"> <PARAM NAME="x" VALUE="50"> <PARAM NAME="y" VALUE="100"> . . . </APPLET> Référence : http://java.sun.com/docs/books/tutorial/applet/appletsonly/getParam.html Exercice 1.d Créez un paramètre dans le code html de l’exercise 1.a et modifier à nouveau la classe Simple pour obtenir la valeur de ce paramètre. Le package AWT (Abstract Windowing Tollkit) Hiérarchie partielle de AWT java.lang.Object java.awt.Color java.awt.Font java.awt.FontMetrics java.awt.Component java.awt.Graphics java.awt.Polygon java.awt.Toolkit La classe abstraite Graphics - Déclare un ensemble de méthodes : drawstring(), drawLine(), etc… Méthodes implémentées par la JVM spécifiquement pour chaque plate-forme L’invocation des méthodes se fait par l’intermédiaire d’un contexte graphique auquel nous avons accès grâce à l’objet graphique passé en référence à paint() public void paint(Graphics g) { Système de coordonnées de points, d’origine 0,0 située dans le coin supérieur gauche http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Component.html#paint(java.awt.Graphics) La classe Color Encapsule un ensemble de couleurs appartenant à l’espace de couleurs défini par une valeur RGB (Red Green Blue) (entre 0 et 2563 – 1, 16.7 millions de couleurs ) public class HelloWorld extends Applet { public void paint(Graphics g) { g.setColor(Color.red); g.setColor(new Color(255,0,0)); // constructeur1 g.setColor(new Color(256*256*255)); // constructeur2 } } http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Color.html La classe Font Une police est définie par son nom (ex. Helvetica), son style (ex. bold) et sa grandeur (size) ( ex. 14 points). Si une police n’est pas définie sur un système, celle-ci sera remplacée par la police par défaut. public class HelloWorld extends Applet { public void paint(Graphics g) { g.setFont(new Font("Helvetica”, Font.BOLD,14); } } La classe abstraite Toolkit et la classe abstraite GraphicsEnvironment Ces superclasses abstraites chapeautent les implémentations du AWT. Elles stipulent diverses méthodes pour accéder aux composants concrets d’une implémentation spécifique. Exercice 2.a 1) Compilez et exécutez la classe ListeDesPolices. 2) Remplacez la méthode obsolète (deprecated) getFontList() de la classe Toolkit par la méthode plus récente getAvailableFontFamilyNames() de la classe GraphicsEnvironment. Affichez les noms de polices avec drawString() en employant comme dimension d’espacement entre chaque ligne la dimension de la police courante. import java.applet.Applet.*; import java.awt.*; public class ListeDesPolices extends Applet { // liste des polices disponibles String [] Polices; public void init() { Polices = GetToolkit().getFontList(); } public void paint(Graphics g) { for (int i = 0; i < Polices.length; i++) { System.out.println(i + “: “ + Polices[i]); } } } Exercice 2.b Créez une applet pour dessiner diverses formes de diverses couleurs ainsi que leur nom respectif en employant différentes polices. Quelques références à leur sujet : http://java.sun.com/products/jfc/tsc/articles/painting/index.html http://java.sun.com/products/jfc/tsc/articles/painting/index.html#background http://java.sun.com/docs/books/tutorial/uiswing/index.html Exercice 2.c Pour cet exercice, vous devrez consulter la documentation en ligne de la classe Graphics. Indiquez si les énoncés sont vrai ou faux. Si faux, indiquez pourquoi. - Les deux premiers arguments de drawOval(x, y, 50, 100) spécifient les coordonnées du centre de l’ovale. - La méthode fillPolygon() dessine un polygone solide avec la couleur courante. - La méthode drawArc() permet des angles négatifs. - La méthode drawRoundRect peut être utilisée pour dessiner un cercle. - La méthode getSize() retourne la grandeur en centimètres de la police courante. - Le pixel de coordonnées (0,0) est situé exactement au centre du moniteur. 3. Notes sur la sécurité Les applets posent un risque de sécurité pour la machine où elles sont téléchargées. Pour cette raison le navigateur imposent des limitations sur ce qu’une applet peut faire : - L’applet s’exécute dans un espace restreint (sandbox) L’applet ne peut exécuter une application locale L’applet ne peut ni lire ni écrire de fichiers sur la machine locale L’applet ne peut établir un connexion réseau qu’avec l’hôte d’où il a été téléchargé Ces limitations sont mises en œuvre par la classe SecurityManager qui est configurée par le navigateur ou l’appletviewer.