23 - Classe abstraite � permet de définir des méthodes sans les implémenter : méthode abstraite abstract <definition_de_methode>; � classe abstraite abstract <definition_de_classe> { ... � une classe abstraite n'est pas instanciable � on peut définir une classe abstraite sans méthode abstraite � une sous-classe non abstraite d'une classe abstraite doit définir explicitement toutes les méthodes abstraites abstract class GeometriePlane { static final double PI=3.14159 ; abstract double perimetre(); abstract double surface();} class Rectangle extends GeometriePlane { double largeur,longueur; double perimetre() {return 2*(largeur+longueur);} double surface() {return largeur*longueur;}} Exemple 24 - Interface � "classe" entièrement abstraite � sans variable d'instance, avec des méthodes abstraites et des constantes uniquement � interface publique � toutes les méthodes sont implicitement abstraites et publiques et héritées par toute classe qui implémente l'interface � classe qui implémente une interface doit définir toutes ses méthodes pour être instanciable (non abstraite) � Une classe peut � hériter d'une classe au plus � MAIS, implémenter plusieurs interfaces � Une interface peut "hériter" de plusieurs interfaces Héritage multiple � pour définir un type abstrait : une interface décrit un ensemble de comportements, mais ne les implémente pas � pour implémenter l'héritage multiple Pourquoi utiliser une interface? interface Geometrie {static final double PI=3.14159 ;} interface Courbe extends Geometrie { double longueur();} interface Surface extends Geometrie { double surface() ;} Exemple class Rectangle implements Courbe, Surface { double largeur,longue; public double longueur() {return 2*(largeur+longue);} public double surface() {return largeur*longue;}} Interface I1 m() class C m() Interface I2 m() implements Si les méthodes m() de I1 et I2 ont la même signature et : - même type de retour : C doit implémenter m() - des types de retour différents : impossible Si les méthodes m() de I1 et I2 n'ont la même signature C doit implémenter les deux méthodes m() 25 – Classes internes Classe définie dans une autre classe Quatre types différents : � Classes internes membres � Classes internes membres statiques � Classes internes locales � Classes internes anonymes Classe interne membre � permet de définir plusieurs instances de la classe interne, liés à une même instance de la classe englobante class Ext { int var; public class Interne {//accède à toutes les variables de Ext int x; this.x=Ext.this.var; } ... } Ext o=new Ext(); Ext.Interne i1=o.new Interne(); Ext.Interne i2=o.new Interne(); Création d'objets internes Classe interne membre statique class Ext { static int var; static public class IntStat {//accède aux variables statiques de Ext int x; x=var; } ... } Ext o1=new Ext(); Ext o2=new Ext(); Ext.IntStat i1=new Ext.IntStat(); Ext.IntStat i2=new Ext.IntStat(); Création d'objets internes Classe interne locale class Ext { final int var; public Iterator m() { class IteratorSpecial implements Iterator {//accède aux variables final accessibles de Ext public boolean hasNext() {. . .} public Object next() {. . .} public void remove() {. . .} }//class IteratorSpecial return new IteratorSpecial(); }//methode m() ... }// class Ext Ext o1=new Ext(); Iterator i=e.m(); while (i.haxNext()) { . . . i.next(). . . Création d'objets internes Classe interne anonyme class Ext { final int var; public Iterator m() { return new Iterator(){ public boolean hasNext() {. . .} public Object next() {. . .} public void remove() {. . .} }; //new }//methode m() ... }// class Ext Ext e=new Ext(); Iterator i=e.m(); while (i.haxNext()) { . . . i.next(). . . Création d'objets internes Quand utiliser une classe anonyme? � quand une seule instance est nécessaire � quand le nom de la classe interne locale n'est pas utile � pour écrire un code plus concis � AWT � SWING II - Interfaces graphiques � composants légers, écrits en Java, indépendants du système natif � pluggable look and feel � ensemble d'outils graphiques beaucoup plus important que dans AWT � inclus dans le JDK depuis la versions 1.2 Une première fenêtre public class Fenetre extends Frame { final static int HTAILLE=550; final static int VTAILLE=450; public Fenetre(){ setTitle("Ma première fenêtre"); setSize(HTAILLE,VTAILLE); setVisible(true);}} Avec ce code, la fenêtre ne peut pas se fermer … Ouvrir la fenêtre class Test{ public static void main(String arg[]){ Fenetre f=new Fenetre();}} Toute application graphique commence par créer un objet Frame Dessiner � utiliser la classe Graphics package java.awt � méthodes de la classe Graphics : clearRect() drawLine() drawRect() drawOval() drawArc() drawImage() fillRect() fillOval() drawString() setColor() … � origine du système de coordonnées : coin haut gauche Affichage du dessin � un objet Component se dessine lorqu'il reçoit le message paint() � la méthode paint() est appelée quand le dessin d’un objet Component doit être mis à jour (première visualisation, changement de taille, réaffichage) � l'objet est redessiné complètement à chaque appel de la méthode paint() � les méthodes update() et repaint() permettent de mettre à jour l'objet La méthode paint(Graphics gc) � définie dans Component, ne fait rien � doit être redéfinie dans des classes dérivées de Frame, Canvas, Applet, pour dessiner l’objet s’il n’est pas utilisé comme objet Container � l'objet Graphics en argument � représente le contexte graphique de l’objet Component � reçoit les messages permettant de dessiner � est fourni par la machine virtuelle La classe java.awt.Graphics � est abstraite � regroupe toutes les méthodes de dessin � ne peut pas être instanciée par un new � accès aux instances de la classe avec les méthodes paint(), update() d'un objet Component Contexte graphique Exemple public class Fenetre extends Frame { public Fenetre() {}p{}ub.l.i.c vogi.ddrpaawiSnttr(iGnrga(p"hHieclslog"),100,100); } Méthodes repaint() et update() La méthode update() � est appelée indirectement par la méthode repaint() � remplit le composant avec sa couleur de fond � initialise la couleur du premier plan � appelle paint()pour redessiner l'objet Component La classe java.awt.Component � classe abstraite � super-classe de Canvas, Container, Frame, Applet, Button,… � méthodes : getParent() getPeer() getToolkit() getBackground() setBackground() getForeground() setForeground() paint() repaint() update() … Classes dérivées � objets Container et getGraphics() utilisés pour contenir d'autres objets ou pour afficher directement des dessins � Window Dialog : boîtes un titre Frame : l'hôte de dialogue ayant un cadre et fenêtres du système graphique de objets utilisés comme zone d'affichage pour ajouter des composants ou dessiner directement � objets Canvas rectangles blancs utilisés pour définir des composants graphiques personnalisés dessinés en utilisant les méthodes de la classe Graphics � autres objets � Panel : Button, Chekbox, List, Choice, Label Scollbar, TextComponent Disposition des composants � Chaque objet Container mémorise la liste des objets qui lui sont ajoutés (add() ) ou enlevés (remove() ) � Un objet Container dispose ses composants à l'écran en utilisant un objet Layout associé qui gère la disposition � quelques méthodes de la classe Container public Component add(Component c) public Component add(String name, Component c) public Component add(Component c, Object Constraints) Objets LayoutManager � gèrent la mise en page des composants d'interface � différents types : FlowLayout, BorderLayout, GridLayout, CardLayout, GridBagLayout � les objets Container ont un gestionnaire par défaut pour Panel et Applet : FlowLayout pour Window, Dialog et Frame : BorderLayout � choix d'un gestionnaire de mise en forme avec la méthode setLayout() � exemple : setLayout(new FlowLayout()); Objets MenuComponent Menu : un objet Menu contient des objets MenuItem MenuBar MenuItem Exemple : un éditeurgraphique Une classe FenetreEditeur public class FenetreEditeur extends Frame { final static int HTAILLE=550; final static int VTAILLE=450; public FenetreEditeur() { setTitle("Editeur graphique"); setSize(HTAILLE,VTAILLE); setVisible(true);}} Une classe MenuEditeur public class MenuEditeur extends MenuBar { public MenuItem menuNouveau, menuQuitter, menuApropos public MenuEditeur(){ Menu menuFichier = new Menu("Fichier"); menuNouveau = new MenuItem("Nouveau"); menuQuitter = new MenuItem("Quitter"); menuFichier.add(menuNouveau) ; menuFichier.add(menuQuitter) ; Menu menuAide = new Menu("aide"); menuApropos = new MenuItem("Apropos"); menuAide.add(menuApropos); add(menuFichier); add(menuAide); } seul un objet Frame peut contenir un menu public FenetreEditeur(){ setTitle("Editeur graphique"); setMenuBar(new MenuEditeur()); setSize(HTAILLE,VTAILLE); setVisible(true);} Ajouter un objet Menu Ajouter une objet Panel public class BarreOutils extends Panel{ public BarreOutils(){ Choice listeCouleur ; String libelleCoulleurs[]="Rouge","Jaune","Vert"}; Color couleurs[]={Color.blue,Color.red,Color.yellow,Color.green}; this.setBackground(Color.lightGray); listeCouleur=new Choice(); for (int i=0;i<libelleCouleurs.length;i++) listeCouleur.addItem(libelleCouleurs[i]); listeCouleur.select(0); add(listeCouleur); add(new Button("Défaire")); add(new Button("Effacer tout")); add(new Button("Quitter"));}} public class FenetreEditeur extends Frame{ final static int HTAILLE=550; final static int VTAILLE=400; public FenetreEditeur (){ ZoneGraphique graphique; setTitle("Editeur graphique"); setSize(HTAILLE,VTAILLE); setBackground(Color.darkGray); add(new BarreOutils(),"North"); add(new ZoneGraphique(),"Center"); setMenuBar(new MenuEditeur()); setVisible(true);} }// classe FenetreEditeur 2. Evénements � Toute action sur les éléments de l'interface utilisateur génère un événement � Un événement déclenché par une action sur une objet AWT est un objet de type java.awt.AWTEvent � Flux d'événement et traitement de l'événement sont traités séparément Types d'événements � événements de clavier � événements de souris : clics, mouvements � événements de fenêtre : ouverture, fermeture, sortie � événements d'interface utilisateur liés aux fonctionnalités des composants : clics ouverture de menu popups, ... de boutons, Gestion des événements � un objet source (composant graphique) émet un événement � l'objet source délègue la gestion des événements utilisateur à un autre objet " écouteur" (d'une classe dérivée de java.util. EventListener) � l'écouteur indique qu'il est intéressé par un événement particulier en implémentant une ou plusieurs interfaces dérivée de EventListener � pour relier la source et l'écouteur, la source "enregistre" l'écouteur concerné par l'événement qui peut être généré Créer l'écouteur (Listener ou Adapter) public class typeEcouteur implements typeListener { {publ/i/ct rvaoiitdemeevnetn edmee nlt'Aétvréanietmeern(t ttyyppeeEEvveenntt evenement)} /implémentation des autres méthodes} ou ---------------------------------------------------- public class typeEcouteur extends typeAdapter { {publ/i/ct rvaoiitdemeevnetn edmee nlt'Aétvréanietmeern(t ttyyppeeEEvveenntt evenement)}} Associer l'écouteur au composant public class ComposantParticulier { p{ubl.i.c. ComposantParticulier() //le composant peut être //source d'événements typeEvent addtypeListener(new typeEcouteur()); ... � Le composant (source de l'événement) enregistre un écouteur en appelant une méthode addtypeListener peut enregistrer plusieurs écouteurs (délégués) � Un écouteur peut traiter des événements venant de plusieurs composants Package java.awt.event � classes encapsulant les évènements � interfaces dérivées de EventListener décrivant les "listeners " � classes implémentant les interfaces dérivées de EventListener Interfaces ActionListener AdjustmentListener ComponentListener ContainerListener FocusListener ItemListener KeyListener MouseListener MouseMotionListener TextListener WindowListener Classes ActionEvent AdjustmentEvent ComponentAdapter ComponentEvent ContainerAdapter ContainerEvent FocusAdapter FocusEvent InputEvent ItemEvent KeyAdapter KeyEvent MouseAdapter MouseEvent MouseMotionAdapter PaintEvent TextEvent WindowAdapter WindowEvent Listeners - Adapters � Les "listeners" sont des interfaces � Les "adapters" sont des classes abstraites, permettent de ne pas implémenter méthodes de l'interface � exemple : l'interface ActionListener définit une seule méthode public void actionPerformed(ActionEvent e) s'applique aux objets boutons, liste item, menu item et champ de texte Il n'existe pas d'adapter pour ces évènements l'interface MouseListener définit public void mouseEntered(MouseEvent e) public void mousePressed(MouseEvent e) public void mouseExited(MouseEvent e) public void mouseReleased(MouseEvent e) public void mouseClicked(MouseEvent e) La classe MouseAdapter fournit une version vide de ces méthodes --------------------------------------------l'interface MouseMotionListener définit public void mouseMoved(MouseEvent e) public void mouseDragged(MouseEvent e) la classe MouseMotionAdapter fournit une version l'interface WindowListener définit public void windowOpened(WindowEvent e) public void windowClosed(WindowEvent e) public void windowClosing(WindowEvent e) public void windowIconified(WindowEvent e) public void windowDeiconifieed(WindowEvent e) public void windowActivated(WindowEvent e) public void windowDeactivated(WindowEvent e) vide de ces méthodes toutes les la classe WindowAdapter fournit une version vide de ces méthodes Exemple1 : un bouton Quitter public class Fenetre extends Frame { final static int HTAILLE=500; final static int VTAILLE=400; public Fenetre() { Bouton boutonQuitter=new Bouton("Quitter"); setSize(HTAILLE,VTAILLE); setTitle("Première fenêtre"); add(boutonQuitter,"North"); show();}} public class Bouton extends Button { public Bouton(String nom){ super(nom); addActionListener(new BoutonEcouteur());}} ----------------------------------------------ipmupbolritc jcalvaas.sa wBto.uetvoennEtc.o*u;teur implements {} p{}ublASicycts itvoeonmiL.diesxaticettn(ie0or)n;Performed(ActionEvent e) Exemple2 : Une fenêtre qui se ferme public class Fenetre extends Frame { final static int HTAILLE=500; final static int VTAILLE=400; public Fenetre(){ setSize(HTAILLE,VTAILLE); setTitle("Editeur graphique"); //la fenêtre peut être source d'événement //WindowEvent // elle enregistre l'écouteur FenetreEcouteur addWindowListener(new FenetreEcouteur()); show();} Création de l'écouteur import java.awt.event.*; class FenetreEcouteur extends WindowAdapter{ public void windowClosing(WindowEvent e){ System.exit(0);}} Pour gérer des événements � identifier l'objet source de l'événement � identifier le type de l'événement et lui associer un écouteur (méthode de � créer une classe qui implémente l'interface associée à l'événement � implémenter la méthode associée à l'événement Exemple 3 : un dialogue public class FenetreSaisieTexte extends Frame implements WindowListener { final static int HTAILLE=300; final static int VTAILLE=200; protected Dialogue monDialogue; private TextArea zoneAffichage; public FenetreSaisieTexte(){ setSize(HTAILLE,VTAILLE); setTitle("Fenêtre Saisie de Texte"); //création d'une zone de texte pour afficher //le texte saisi dans le dialogue zoneAffichage=new TextArea(5,40); add("Center",zoneAffichage); //création d'un bouton pour ouvrir //la boite de dialogue Button boutonOuvrirDialogue=new Button("Ouvrir Dialogue"); boutonOuvrirDialogue.addActionListener(new BoutonOuvrirDialogueEcouteur (this)); //creation d'un panneau pour placer le //bouton OuvrirDialogue Panel panneau=new Panel(); type addtypelistener) panneau.add(boutonOuvrirDialogue); add("South",panneau); //ici, la fenetre traite elle-meme //l'événement : mauvaise solution addWindowListener(this); sstVisible(true); }// FenetreSaisieTexte public void ajouterTexte(String unTexte) { zoneAffichage.append(unTexte + "\n"); }public void windowClosing(WindowEvent e) { System.exit(0);} public void windowActivated(WindowEvent e){} public void windowClosed(WindowEvent e){} public void windowDeactivated(WindowEvent e){} public void windowDeiconified(WindowEvent e){} public void windowIconified(WindowEvent e){} public void windowOpened(WindowEvent e) {} } // classe FenetreSaisieTexte public class Dialogue extends Dialog{ TextField champSaisie; FenetreSaisieTexte parent; Button boutonAjoutTexte; public Dialogue(Frame fenParent, String titre){ super(fenParent,titre,false); parent=(FenetreSaisieTexte) fenParent; //création d'un panneau pour la saisie du texte Panel panneau1=new Panel(); Label libelle=new Label("Saisissez un texte"); panneau1.add(libelle); champSaisie=new TextField(40); panneau1.add(champSaisie); add("Center",panneau1); //création d'un panneau pour placer le bouton Ajouter //du texte Panel panneau2=new Panel(); boutonAjoutTexte=new Button("Ajout Texte"); boutonAjoutTexte.addActionListener(new BoiteDialogueEcouteur(this)); panneau2.add(boutonAjoutTexte); add("South",panneau2); pack();} } //classe Dialogue public class BoutonOuvrirDialogueEcouteur implements ActionListener{ FenetreSaisieTexte laFenSaisie; public BoutonOuvrirDialogueEcouteur(FenetreSaisieTexte uneFen){ laFenSaisie=uneFen;}public void actionPerformed(ActionEvent e){ if (laFenSaisie.monDialogue==null) laFenSaisie.monDialogue= new Dialogue(this.laFenSaisie,"Dialogue"); laFenSaisie.monDialogue.show();} }// classe BoutonOuvrirDialogueEcouteur public class BoiteDialogueEcouteur implements ActionListener{ Dialogue laBoiteDialogue; FenetreSaisieTexte laFen; public BoiteDialogueEcouteur(Dialogue unDialogue){ laBoiteDialogue=unDialogue; laFen=unDialogue.parent;} public void actionPerformed(ActionEvent e){ Object source=e.getSource(); if (source==laBoiteDialogue.boutonAjoutTexte){ laFen.ajouterTexte( laBoiteDialogue.champSaisie.getText());} laBoiteDialogue.champSaisie.selectAll(); laBoiteDialogue.setVisible(false); } }// classe BoiteDialogueEcouteur 2- SWING � composants légers, écrits en Java � indépendants de la plate-forme � look and feel modifiables � des composants correspondants à ceux du AWT et de nouveaux composants (JFrame, Japplet, JButton, …) � package javax.swing et sous-packages � inclus dans le JDK depuis la version1.2 � même modèle de programmation d'évènements que AWT Pluggable Look and Feel (PLAF) � trois implémentations de PLAF : Motif, Windows, Metal (javasoft) � modèle MVC Model-View-Control : possiblité de passer d'un L&F à un autre à l'exécution Structure d'une fenêtre JFrame JRootPane rootPane Component glassPane JLayeredPane LayredPane Component contentPane JMenuBar menuBar SWING : 4 composants lourds JFrame,JWindow,JDialog,JApplet contiennent plusieurs surfaces d'affichage contentPane glassPane menuBar layeredPane rootPane Ajout d'un composant à une JFrame Attention : Ajouter les composants au contentPane (ou au glassPane) JFrame f = new JFrame(); JButton b = new JButton("XXX"); f.getContentPane().add(b); Button JButton Panel JPanel CheckBox JCheckBox Choice JComboBox Dialog JDialog Frame JFrame ... Composants AWT et correspondants Swing Nouveaux composants JInternalFrame JLayeredPane JSplitPane JTree JTable JPopMenu … Quelques packages Swing javax.swing javax.swing.event javax.swing.plaf javax.swing.tree javax.swing.plaf.metal javax.swing.text.html ... L'exemple SwingSet2 Conteneurs principaux Une interface graphique a toujours une fenêtre initiale JFrame, JApplet Tout conteneur principal contient un panneau (contentPane) qui contient lui-même tous les composants visibles du conteneur principal Un composant graphique doit être ajouté à la hiérarchie des conteneurs pour être visible Le conteneur principal peut être retrouver en appelant getContentPane() Lorsqu'on ferme une fenêtre JFrame, la fenêtre est cachée La méthode setDefaultCloseOperation permet de fixer le comportement de l'objet JFrame après un clic sur le bouton Quitter avec une des trois possibilités suivantes : DO_NOTHING_ON_CLOSE HIDE_ON_CLOSE DISPOSE_ON_CLOSE valeur par défaut : HIDE_ON_CLOSE. Fermer une fenêtre JFrame look and feel - à tout moment, une application a un seul "look and feel" - chaque fois qu'un composant est crée, il s'attache la classe UI implémentée par le L&F choisi - la classe UIManager permet de connaître le look and feel selectionné méthodes getLookAndFeel() setLookAndFeel() getCrossPlatformLookAndFeelClassName() getInstalledLookAndFeels() public static void main(String[] args){try { UIManager.setLookAndFeel( UIManager.getCrossPlatformLookAndFeelClassName()); } catch (Exception e) { }... JFrame frame = new JFrame();... SwingUtilities.updateComponentTreeUI(frame); } Chapitre 3 - Applets Une applet : "petite" application destinée à être � chargée depuis une machine distante (serveur) � exécutée sur une autre machine (client) � invoquée à partir d'une page HTML � exécutée sous contrôle d'une autre application ( navigateur muni d'un interprète Java, appletviewer) � soumise à des contraintes de sécurité Restrictions de sécurité : le bac à sable � Par défaut, une applet ne peut pas � accéder au système de fichiers sur la machine client � ouvrir une connexion réseau avec un serveur autre que celui d'où elle est chargée � lancer l'exécution d'un autre programme sur le système client � charger des programmes qui résident sur le système du client � créer des "threads" n'appartenant pas au groupe dethreads de l'applet � modifier des propriétés système sur la machine client Politique de sécurité � JDK 1.0 : le bac à sable � JDK 1.1 : le bac à sable + possibilité dedéfinir des signatures numériques � JDK 1.2 : le bac à sable + possibilité dedéfinir des contrôle d'accès et des permissions utilisant le package java.security (classes Policy, Permission, …) Servlets � application destinée à être � exécutée sur un serveur web pour construire des pages "à la volée" en exemple : pour un programme d'accès à une BD stockée sur le serveur, une applet permet de télécharger une classe permettant de manipuler les données une servlet chargée depuis le client permet de sélectionner les données Pour créer une applet � Créer une classe qui hérite de � java.applet.Applet � exemple : import java.applet.*; import java.awt.*; public class MaPremiereApplet extends Applet { public void paint(Graphics gc) { gc.drawString("Hello Web",40,40);}} Seule la méthode paint a été redéfinie La classe Applet Applet Panel Container Component Object Une applet est : - un objet graphique - un objet créé et contrôlé par un navigateur We Méthodes de la classe Applet � méthodes d'interface graphique héritées public void paint(Graphics g) public void add(Component c) ... � méthodes de contrôle public void init() public void start() public void stop() public void destroy() d'éxecution Insertion dans une page HTML <!-- Fichier MaPremiereApplet.html --> <HTML> <HEAD> <TITLE> MaPremiereApplet </TITLE> </HEAD> <BODY> <APPLET CODE="MaPremiereApplet.class" WIDTH=300 HEIGHT=150> </APPLET> </BODY> </HTML> L'applet s'exécute ... Construction d'un objet Applet Le navigateur � détermine la localisation de la classe, charge son byte-code � instancie l'objet de la classe dérivée de Applet (avec le constructeur par défaut) � envoie le message init()à l'objet pour le configurer Initialisation de l'applet : dans le constructeur par défaut ou dans la méthode init() Cycle de vie d'une applet stop destroy init() envoyé dès que l'objet estconstruit start() envoyé dès que la page HTML estactive stop() envoyé dès que la page HTML estinactive destroy() envoyé dès l'arrêt de la VM construite initialisée active inactive init start inexistante start La méthode paint public void paint(Graphics g) � héritée de Component � appelée après init() et start() � principale activité de l'applet � intervient lorsque la fenêtre revient au premier la méthode repaint() est appelée elle fait appel à update() qui fait appel à paint() Font f=new Font("Times Roman", Font.BOLD,36); public void paint(Graphics gc) { gc.setFont(f); gc.setColor(Color.red); gc.drawString("Hello web",40,40); } Redéfinition de paint() public class AppletObserver extends Applet { boolean ok; p{}ubloikc= tvrouied;init() p{}ublriecp avionitd()s;tart() p{}ublic vooikd=!sotko;p() plan ou est déplacée : Une applet qui se décrit public void paint(Graphics g) { if (ok) g.setColor(Color.blue); else g.setColor(Color.red); g.drawString("je me redessine en changeant de couleur",50,50); } } //classe AppletObserver Disposer une applet dans une page HTML � l'attribut CODE référence le fichier compilé (byte-code) d'une classe dérivée de la classe Applet CODE="AppletHorloge.class" WIDTH=300 HEIGHT=300 � les attributs HEIGHT et WIDTH indiquent <APPLET CODE="MaDeuxiemeApplet.class" WIDTH=300 HEIGHT=300 CODEBASE="http://mon_serveur/applets" la surface réservée à l'exécution de l'applet en pixels ALIGN="LEFT" HSPACE=10 VSPACE=10 ALT="Impossible de charger l'applet"> <PARAM NAME="accueil" VALUE="Bonjour il est :"> Si pveouuts plaiss eizn tceer ptreextteer cl'ee scto dqeu ej avvoatre navigateur ne </APPLET> L'URL de base � l'attribut CODE précise le nom de la classe, mais pas sa localisation � l'attribut CODEBASE précise l'URL de base de la classe à télécharger � exemple : CODEBASE="http://mon_serveur/mes_classes" il est nécessaire si les fichiers .html et .class ne sont pas situés dans le même répertoire � méthodes définies dans la classe Applet : getCodebase() getDocumentBase() � l'attribut ALIGN positionne l'applet par rapport à l'élément HTML situé après la balise </APPLET> � l'attribut ALT désigne le texte affiché par le navigateur si l'applet ne peut pas être chargée � les attributs HSPACE et VSPACE délimitent les marges horizontales et verticales qui encadrent l'applet en pixels � le texte libre entre <APPLET> et </APPLET> est affiché par un navigateur incapable d'interpréter Java Autres attributs Passage de paramètres à l'applet � la balise <PARAM NAME = "..." VALUE = "..."> est utilisée pour transmettre un paramètre à l'applet placée entre <APPLET> et </APPLET> <PARAM NAME="accueil" VALUE="Bonjour il est :"> � les noms doivent être identiques à ceux passés à la méthode public String getParameter(String nom) La méthode getParameter public String getParameter(String nom) � définie dans la classe Applet � paramètre de type String qui identifie le paramètre de l'applet dans la page HTML <PARAM NAME="accueil" VALUE="Bonjour il est :"> � la valeur de retour est un objet de type String qui représente la valeur du paramètre dans la public void init(){ accueil = getParameter("accueil") ;} public void paint(Graphics g){ ……………. g.drawString(accueil,50,30);} � méthode à appeler une fois que l'objet est instancié et plutôt dans la méthode init � déclenche l'exception NullPointerException si elle est appelée dans le constructeur par défaut page HTML Exemples d'applets les applets "demo", exemple : <title> Texte nerveux </title> <hr> <applet code="AppletNervousText.class" width=300 height=200> <param name="text" value="Mon Texte"> </applet> Insérer des images � objets de type java.awt.Image � les méthodes Image getImage(URL url) Image getImage(URL url, String name) objets Image à afficher dans la fenêtre de l'applet avec la méthode drawImage() de la classe java.awt.Graphics) � le paramètre de type URL identifie l'URL absolue contenant l'image � le paramètre de type String représente l'emplacement de l'image par rapport à l'URL � pour les sons : AudioClip getAudioClip(URL url) AudioClip getAudioClip(URL url , String name) public void init() { URL url =getCodeBase(); Image limage = getImage(url, "SmallTiger.gif"); } Exemple Visualiser un document méthodes de la classe AppletContext void showDocument(URL url) remplace le document visualisé dans la fenêtre de l'applet par l'url donné en paramètre void showDocument(URL url, String target) affiche le document dans la frame identifiée par le paramètre target Exemple String nomURL ="http://www.unice.fr"; AppletContext appletContext=getAppletContext(); try{ url=new URL(nomURL);} catch(Exception e){}; if (url != null) appletContext.showDocument(url); Faire communiquer des applets en utilisant l'une des méthodes suivantes de l'interface AppletContext Applet getApplet(String name) permet de retrouver une applet par son nom Enumeration getApplets() retourne toutes les applets du document du contexte de l'applet <HTML> <BODY> <H1>Emetteur</H1> <APPLET CODE=Emetteur.class WIDTH=200 HEIGHT=200> NAME="applet Emetteur"> </APPLET> <HR> <H1>Recepteur</H1> <APPLET CODE=Recepteur.class WIDTH=400 HEIGHT=90 > NAME="applet Recepteur"> </APPLET> </BODY> </HTML> 6 <HTML> <BODY> <H1>Emetteur</H1> <APPLET CODE=Emetteur.class WIDTH=200 HEIGHT=200> <PARAM NAME="name" value="applet Emetteur"> </APPLET> <HR> <H1>Recepteur</H1> <APPLET CODE=Recepteur.class WIDTH=400 HEIGHT=90 > <PARAM NAME="name" value="applet Recepteur"> </APPLET> </BODY> </HTML> public class Emetteur extends Applet{ private static Applet recepteur ; public void init(){ ... recepteur = getAppletContext().getApplet("applet Recepteur"); ... (Recepteur)recepteur).executerRequeteVenantDe ("applet Emetteur"); }//classe Emetteur public class Recepteur extends Applet{ public void init() { ... emetteur = getAppletContext().getApplet("applet Emetteur"); ...} public void executerRequeteVenantDe(String nomEmetteur){ ... this.getGraphics().drawString("Message reçu de . . . "!",100,150); emetteur.getGraphics().drawString("dans Recepteur",20,100);} }//classe Recepteur Exercice • Ecrire une applet AppletHorloge qui affiche l'heure système statiquement • Modifier l'applet AppletHorloge de manière à pouvoir passer en paramètre (dans le code HTML) un message à afficher au-dessus de l'heure • Ecrire une applet AppletHorlogeDyn qui affiche l'heure système dynamiquement Dates et heures classe java.util.Date valeur de type long nombre de millisecondes depuis le 01/01/1970 obtenue par : long time=System.CurrentMillis(); ou Date maintenant = new Date(); long time=maintenant.getTime(); formatter dates et heures en textes � Classe java.text.DateFormat définir obtenir des entiers (jour, mois, heure, …) à partir d'une date � Classe java.util.Calendar Dates et heures Classe java.text.DateFormat String format(Date date) formatte en chaîne de caractères static DateFormat getDateInstance() donne le formatteur de date selon les paramètres locaux static DateFormat getTimeInstance() donne le formatteur d'heure selon les paramètres locaux String chaineHeure = DateFormat.getTimeInstance().format(maintenant); Dates et heures Classe java.text.SimpleDateFormat pour définir un modèle propre de formattage SimpleDateFormat formatter = new SimpleDateFormat ("yyyy.MM.dd G 'at' hh:mm:ss a zzz"); Date current= new Date(); String dateString = formatter.format(current); SimpleDateFormat formatteur = new SimpleDateFormat ("HH:mm:ss"); String chaineHeure = formatteur.format(date); Horloge dynamique // pour rafraîchir la la fenetre public void paint(Graphics g) {. . . g.clearRect(0,0,getSize().width,getSize().height); // pour mettre en veille le processus courant public void paint(Graphics g) {. . . try {Thread.sleep(1000);} catch (InterruptedException signal){}. . . Applet et/ou Application public class AppletAppli extends JApplet {. . . static private JApplet applet; public void init() { . . .} public static void main(String[] arg) { applet = new AppletAppli(); JFrame fenetre=new JFrame(); fenetre.getContentPane().add(applet); applet.init(); applet.start(); Applet et/ou Application //la fenetre se ferme en stoppant l'execution fenetre.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ applet.stop(); applet.destroy(); System.exit(1);}}); fenetre.setVisible(true); }. . . Archives .jar � fichier .jar � format ZIP � archive de fichiers .class ressources auxiliaires meta-informations : fichier manifest � créé avec l'outil jar jar cf monArchive.jar *.class � peut être une entrée de la variable CLASSPATH � peut être utilisé pour faciliter le chargement d'une applet Chapitre 5 - Entrées-Sorties � Flux d'entrée-sortie � Package java.io � Entrée-Sortie Console � Fichiers � Sérialisation Flux d'entrée-sortie séquence de données qui ont une source (entrée) et une sortie (output) � permet de transporter une information (caractère, objet, image, sons) � Source : fichier, console, communication réseau � Données lues dans l'ordre où elles sont écrites � Un flux peut utiliser un tampon Package java.io Package java.io � Byte Streams : format 8 bits � input streams, output streams � data byte streams � object byte streams � Character Streams : format 16 bits UNICODE � readers , writers Package java.io • les classes de type Data Sink Streams •les classes de type Processing Streams Data Sink Streams Processing streams Flux d'octets Object OutputStream InputStream BufferedOutputStream FilterOutputStream FilterInputStream BufferedInputStream FileOutputStream FileInputStream Flux de caractères Object Writer Reader BufferedWriter BufferedReader LineNumberReader StringWriter StringReader Data Sink Streams Character Streams Byte Streams Processing Streams : opérent sur les données CharacterStreams Byte Streams Super – classes (abstraites) Octets InputStream int read() int read(byte cbuf[]) OutputStream void write( int c) void write(byte cbuf[]) Caractères Reader int read() int read(char cbuf[]) Writer void write( int c) void write(char cbuf[]) public abstract int read() throws IOException lit un octet et retourne sa valeur entre 0 et 255 ou bien -1 public long skip(long nb) throws IOException saute nb octets dans le flux d'entrée public int available() throws IOException retourne le nombre d'octets prêts à être lus public void flush() throws IOException vide le flux Classe InputStream package java.lang class System { public static InputStream in ; public static PrintStream out; public static PrintStream err; ... Les flux standard public static int lireOctet() { int a=0; try { a = System.in.read(); } catch (IOException e){}; return a; } Exemple 1 : Lire un octet au clavier Classes InputStreamReader OutputStreamWriter � InputStreamReader implémente un flux qui lit des bytes en entrée et les convertit en caractères Unicode � OutputStreamWriter implémente un flux qui convertit les caractères Unicode et les écrit vers un flux d'octets Classes PrintStream PrintWriter PrintStream et PrintWriter méthodes print et println public void println(String s) pour les types: char int float boolean char[] long double String Object Flux tampons évitent de lire et écrire directement dans le flux suivant améliorent les performances permettent de lire des lignes de texte classe BufferedReader public String readLine() throws IOException lit une ligne de texte et la retourne comme un objet String Exemple 2 : Lire une ligne au clavier public static String lireLigne() { BufferedReader fluxEntree = new BufferedReader( new InputStreamReader(System.in)); String s = null; try { ligne = fluxEntree .readLine(); } catch (IOException e){} return s;} Flux sur fichiers Classes FileInputStream, FileOutputStream, pour créer des flux d'octets FileReader, FileWriter, convertissent des flux d'octets en flux de caractères RandomAccessFile permet écriture et lecture dans le même flux Classe File boolean canRead() boolean canWrite() boolean isFile() boolean isDirectory() ... Exemple 3 : Ecrire dans un fichier BufferedReader entree = new BufferedReader(new StringReader(ch)); PrintWriter sortie= new PrintWriter(new BufferedWriter( new FileWriter("fic.out"))); while ((s=entree.readLine())!=null) sortie.println(s); sortie.close(); BufferedReader entree = new BufferedReader( new FileReader("Fic.in")); while((s=entree.readLine())!=null) System.out.println(s); entree.close(); Exemple 4 : Lire dans un fichier Flux d'objets � Classes ObjectInputStream et ObjectOutputStream permettent de lire et d'écrire des graphes d'objets � Lire et Ecrire des objets dans un flux : la sérialisation Sérialisation � sauvegarder un objet et les objets qu'il référence � principe pour sauvegarder un objet : sauver dans le flux, un descripteur de la classe suivi des valeurs des champs non statiques � exemple d'utilisation : échange d'objets via le réseau, persistance Sérialiser un objet � la classe de l'objet doit implémenter Serializable � construire un objet ObjectOutputStream à partir d'un objet FileOutputStream � utiliser la méthode writeObject sur l'objet ObjectOutputStream public final void writeObject(Object obj) throws IOException Exemple 5 FileOutputStream fout = new FileOutputStream("tmp"); ObjectOutputStream fluxObjets = new ObjectOutputStream(fout); Personne objetAserialiser = new Personne("Dupont"); fluxObjets.writeObject(objetAserialiser); Sérialiser un objet � Si un objet qui référence d'autres objets, est sérialisé, les objets référencés sont également sérialisés � La méthode writeObject propage une exception NotSerializableException si l'objet n'est pas sérialisable � un objet est sérialisable s'il implémente l'interface Serializable Lire un objet sérialisé � construire un objet ObjectInputStream à partir d'un objet FileInputStream � utiliser la méthode readObject sur l'objet ObjectInputStream public final Object readObject() throws OptionalDataException, ClassNotFoundException, IOException FileInputStream fin = new FileInputStream("tmp"); ObjectInputStream inStream = new ObjectInputStream(fin); try{ Personne objetDeserialise= (Personne)(inStream.readObject()); }catch(Exception e){} Chapitre 6 – Programmation distribuée 1. Programmation réseau � Téléchargement via une URL � Gestion des sockets TCP et UDP 2. Connexion à une base de données relationnelle (JDBC) 6.1 Programmation réseau • Deux approches : • programmation basée sur la connexion à une URL accès à une ressource sur le web • programmation basée sur sockets TCP ou UDP communications client/serveur • Un package : java.net • manipulation des adresses Internet : classe InetAddress • accès de type fichier désigné par URL : classes URL et URLConnection • communication de bas niveau (en mode non connecté) : classes DatagramPacket et DatagramSocket • communication en mode connecté : classes Socket et ServerSocket Package java.net Classe InetAddress • représente les adresses IP sur 32 bits • méthodes static InetAddress getLocalHost() throws UnknownHostException; static InetAddress getByName(String m) throws UnknownHostException; String getHostName(); try{ InetAddress address; System.out.println("Affichage de l'adresse IP de nyx a partir de son nom : "); address = InetAddress.getByName("nyx.unice.fr"); System.out.println(address); SysLtoecma.loHuots.tp"r)i;ntln("Affichage de l'adresse IP de address = InetAddress.getLocalHost(); System.out.println(address); System.out.println("Affichage du nom de l'hote"); System.out.println(address.getHostName()); }catch(UnknownHostException e){} Classe URL • permet de représentée une ressource accessible sur le web au moyen flux de données de type InputStream • constructeurs URL (String spec) throws MalformedURLException URL (String protocol, String host, int port, String file)throws MalformedURLException URL (String protocol, String host, String file) throws MalformedURLException public String getProtocol () public String getHost () public int getPort () public String getFile () retournent le protocole, l'hôte, le port, le chemin d'accès au fichier d'une instance de la classe URL InputStream openStream() ouvre une connexion en lecture avec l'URL retourne l'objet InputStream qui permet de lire le contenu de cette url. d’une URL comme un Deux façons d'accéder aux données une fois l'objet URL construit : InputStream openStream() ouvre une connexion en lecture avec l'URL retourne l'objet InputStream qui permet de lire le contenu de cette url comme un flux d'octets. OU Object getContent () retourne un objet correspondant au contenu du fichier représenté par un objet de classe URL. Par exemple, si le fichier est une image, cette méthode retourne une instance d'une classe dérivée de la classe Image. // afficher les 3 premieres lignes // d'un fichier HTML public static void main(String argv[]) IOExcepttihornows MalformedURLException, { BufferedReader in; URL url=nUeRwL ( "http:www.dtc.com" ) ; in=new BufferedReader( new InputStreamReader(url.openStream())); for (int nl=0; nl<3;nl++) { String ligne=in.readLine(); System.out.println(ligne);}} méthode de la classe URL : URLConnection openConnection () représente une connexion avec une URL, et retourne une instance de la classe URLConnection qui permet d'obtenir toute sorte de renseignements (dates, en-tête,...) sur le fichier correspondant à l'URL et donne un contrôle plus étendu sur la communication clientserveur (possibilité de gérer un flux de sortie du client vers le serveur) URL Connexions Classe URLConnection • abstraite • super-classe pour toutes les classes qui représente une connexion entre une application et une URL • une instance d'une classe dérivant de cette classe est obtenue grâce à la méthode openConnection () de la classe URL • méthodes permettant de créer un flux de données pour lire et/ou écrire dans le fichier désigné par une URL, et d'obtenir d'autres d'informations sur ce fichier (sa date de dernière modification, sa taille, son type,...) • la méthode connect() permet d'ouvrir la connexion Sockets • les données transmises à travers Internet sont éclatées en paquets (datagrammes) • le logiciel réseau natif gére la séparation en paquet sur l'émetteur et rassemble les paquets sur le recepteur • l'API java.net permet d'ignorer les problèmes de codage de paquets, … et se place à un niveau d'abstraction plus élévé en manipulant des sockets Un socket • représente une communication d'une machine avec une autre machine pour la transmission de données • permet de se connecter à une machine distante envoyer des données recevoir des données fermer la communication • est connecté à une seule machine à la fois • peut envoyer et recevoir des données avec le même hôte Sockets TCP Machine Cliente Machine Serveur port Socket C Application Client Application Serveur port Socket S • Un socket est caractérisé par une adresse Internet et un port sur la machine locale • La communication utilise deux sockets : un sur le client et un sur le serveur ServerSocket Modèle réseau Java 1. le serveur enregistre son service sous un numéro de port 2. il attend qu'un socket du client demande une connexion (méthode accept()) 3. le client connaît le nom de la machine serveur et le numéro du port auquel est connectée l'application serveur ; le client demande la création d'un socket vers le serveur 4. si la connexion est acceptée, le serveur sort de l'attente et crée un socket de communication avec le client 5. le client et le serveur communiquent en écrivant et en lisant dans leur socket Classe java.net.Socket • constructeurs public Socket (String host, int port) throws UnknownHostException, IOException public Socket (InetAddress address, int port) throws IOException permettent de créer une instance de la classe Socket et d'obtenir pour un programme client une connexion avec le programme serveur de la machine hôte en attente sur le port port • pour initialiser la connexion, le client doit construire une instance de Socket • une fois la connexion établie, les flux d'entrée et de sortie vers le serveur sont récupérables • méthodes : public InputStream getInputStream () throws IOException public OutputStream getOutputStream () throws IOException • quand l'application se termine, il faut Socket pour libérer le port public void close () throws IOException fermer l'objet Autres méthodes public InetAddress getLocalAddress () public int getLocalPort () retournent adresse et port sur la machine locale public InetAddress getInetAddress () public int getPort () retournent adresse et port adresse et port sur la machine distante public class ClientEchoTCP { public static final int PORT=7; public static void main(String arg[]) throws IOException { Socket socketEcho = null; PrintWriter fluxSortie = null; BufferedReader fluxEntree = null; // Récupération des adresses InetAddress adrLocale = InetAddress.getLocalHost (); InetAddress adrDistante = adrLocale ; //cas particulier try { // Ouverture d'une connexion sur le port 7 // de l'hôte distant socketEcho = new Socket(adrDistante , 7); // Récupération des flux d'entrés et de sortie fluxSortie = new PrintWriter( socketEcho.getOutputStream(), true); fluxEntree = new BufferedReader( new InputStreamReader(socketEcho.getInputStream())); } catch (UnknownHostException e) { System.err.println("Hote inconnu " ); System.exit(1); } catch (IOException e) { System.err.println("Pas d'E/S pour la connexion avec l'hote"); System.exit(1);} //envoi d'une ligne au serveur fluxSortie.println("essai de la socket Echo "); //affichage de ce qui est lu sur la connexion System.out.println("echo: " + fluxEntree.readLine()); fluxSortie.close(); fluxEntree.close(); socketEcho.close()} }//class ClientEchoTCP Classe ServerSocket Constructeurs public ServerSocket (int localPort) throws IOException public ServerSocket (int localPort, int maxWait, InetAddress addrLocal ) throws IOException permettent de créer un socket de serveur en attente sur le port port maxWait représente le nombre maximum de connexions pendantes Connexions • Une fois l'objet ServerSocket créé, l'appel sur cet objet de la méthode public Socket accept () throws IOException met le serveur en attente d'une demande de connexion d'un client et retourne un socket (objet Socket) qui correspond à cette connexion une fois qu'elle est établie • Le socket retourné est appelé socket de service Il est attaché à la même adresse Internet et au même port TCP que le socket serveur Serveur itératif ... socketService.close();}} ServerSocket s=new SocketServer(port); le serveur attend les connexions pendantes et traite de manière itérative, toute celles qu'il accepte Serveur concurrent • le serveur lance un processus léger pour traiter chaque connexion ; chaque connexion est traitée en concurrence avec les autres • le serveur est concurrent : class Serveur extends Thread {… • l'objet Serveur appelle la méthode accept() pour une nouvelle connexion et utilise le socket résultant pour créer un nouveau thread qui exécute le code du service à rendre pour ce nouveau client Exemple Un serveur doit attendre des clients pour leur rendre le service suivant : le client envoie un texte, ligne par ligne et le serveur compte le nombre de mots du texte class ClientCompteMot { static final int port=10000; public static void main(String[] argv) { BufferedReader lecteurFichier =null; BufferedReader fluxEntree =null; PrintStream fluxSortie =null; String ligne =null; Socket socket =null; try{ socket = new Socket(argv[1],port); lecteurFichier =new BufferedReader( new FileReader(argv[0])); fluxEntree = new BufferedReader(new InputStreamReader(socket.getInputStream())); fluxSortie = new PrintStream(socket.getOutputStream()); while ((ligne=lecteurFichier.readLine())!=null) fluxSortie.println(ligne); fluxSortie.println("xxxxxx"); System.out.println(fluxEntree.readLine()); socket.close(); } catch(IOException exc){ System.out.println("probleme a determiner");} } }//ClientCompteMot public class ServeurCompteMot extends Thread { final static int port=10000; ServerSocket receptionniste; public ServeurCompteMot() {try {receptionniste=new ServerSocket(port);} catch(IOException exc) {System.out.println("impossible de creer le serveur");} this.start(); } public void run() { Socket socket; Service c; try{while(true) { socket=receptionniste.accept(); c=new Service(socket); }}catch(IOException exc) {System.out.println("probleme de connection");} } public static void main(String argv[]) {new ServeurCompteMot();} }//class ServeurCompteMot class Service extends Thread { Socket socket; BufferedReader fluxEntree; PrintStream fluxSortie; Service(Socket socket) {this.socket=socket; try{fluxEntree=new BufferedReader(new InputStreamReader(socket.getInputStream())); fluxSortie=new PrintStream(socket.getOutputStream()); } catch(IOException exc){} try{socket.close();} catch(IOException e){}} this.start();} public void run() { String texte; int compteur=0; try{ while(!(texte=fluxEntree.readLine()). equals("xxxxxx")) compteur+=(new StringTokenizer(texte)).countTokens(); fluxSortie.println( "votre texte possede "+compteur+" mots"); }catch(IOException exc){} try{socket.close();}catch(IOException e){}} }//class Service EXERCICES TDS AWT exo 3 EXERCICE 3 /** * Une FenetreEditeur est une fenetre principale * qui contient une ZoneGraphique * Cette fenetre peut se fermer */ import java.awt.*; import java.awt.event.*; public class FenetreEditeur extends Frame{ final static int HTAILLE=500; final static int VTAILLE=400; public FenetreEditeur(){ ZoneGraphique zone = new ZoneGraphique(); setSize(HTAILLE,VTAILLE); setTitle("Editeur graphique"); add(zone,"Center"); add(new BarreOutils(zone),"North"); //la fenetre se ferme en stoppant l'execution addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0);}}); setVisible(true); } }//FenetreEditeur /** * * Une ZoneGraphique est un rectangle a fond bleu * a curseur en forme de croix * La zone graphique intercepte les clics de la souris * Pour le clic mousePressed, une droite est initiée et * pour le clic mouseReleased, la droite es tracée * */ import java.awt.*; import java.awt.event.*; public class ZoneGraphique extends Canvas{ private int xOrigine,yOrigine; public ZoneGraphique(){ setBackground(Color.blue); setForeground(Color.yellow); setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR)); addMouseListener(new MouseAdapter(){ public void mousePressed(MouseEvent e){ ZoneGraphique.this.initieDroite(e.getX(), e.getY());} public void mouseReleased(MouseEvent e){ ZoneGraphique.this.termineDroite(e.getX(), e.getY());}} ); }//ZoneGraphique() public void initieDroite(int x, int y){ xOrigine=x; yOrigine=y;} public void termineDroite(int x, int y){ Graphics g=getGraphics(); g.drawLine(x,y,xOrigine,yOrigine);} }// classe ZoneGraphique /** * * Une BarreOutils est un panneau à ajouter à un objet FenetreEditeur * et contenant un bouton QUITTER * et une liste déroulante de couleurs permettant de * changer la couleur du fond de la ZoneGraphique */ import java.awt.*; public class BarreOutils extends Panel{ Choice listeCouleur ; Button boutonQuitter; public BarreOutils(ZoneGraphique uneZone){ String libelleCouleurs[]={"Bleu", "Rouge","Jaune","Vert"}; Color couleurs[]={Color.blue,Color.red,Color.yellow,Color.green}; setBackground(Color.yellow); listeCouleur=new Choice(); for (int i=0;i<libelleCouleurs.length;i++) listeCouleur.addItem(libelleCouleurs[i]); listeCouleur.select(1); add(listeCouleur); add(boutonQuitter=new Button("Quitter")); //gestion des évènements listeCouleur.addItemListener(new OutilsEcouteur(couleurs,uneZone)); boutonQuitter.addActionListener(new OutilsEcouteur(uneZone));} } //classe BarreOutils /** * Pour traiter les évènements générés par * l'activation des objets d'une BarreOutils */ import java.awt.*; import java.awt.event.*; public class OutilsEcouteur implements ActionListener, ItemListener{ private ZoneGraphique zone; private Color couleurs[]; public OutilsEcouteur(ZoneGraphique uneZone){ this.zone=uneZone;} public OutilsEcouteur(Color desCouleurs[],ZoneGraphique uneZone){ this.couleurs=desCouleurs; this.zone=uneZone;} public void itemStateChanged(ItemEvent e){ Choice liste=(Choice) e.getSource(); this.zone.setBackground(couleurs[liste.getSelectedIndex()]);} public void actionPerformed(ActionEvent e){ System.exit(0);} }// classe OutilsEcouteur EXO Applet XERCICE3 ** applet qui met en evidence ces différents états */ IUT Département Informatique Programmation en Java M.Collard mport java.awt.*; mport java.applet.Applet; ublic class AppletObserver extends Applet { oolean ok; ublic void init() { k=true; } ublic void start() { epaint(); } ublic void stop() { k=!ok; } ublic void paint(Graphics g) { (ok) .setColor(Color.blue); lse .setColor(Color.red); .drawString("je me redessine en changeant de couleur",50,100); } // class AppletObserver XERCICE4 ** Affiche le contenu d'un fichier HTML specifié par une URL mport java.awt.*; mport java.applet.*; import java.net.*; IUT Département Informatique Programmation en Java M.Collard ublic class AppletShowDoc extends Applet { RL url ; ublic void init() { tring nomURL ="http://verdon.unice.fr"; ppletContext appletContext=getAppletContext(); y{ rl=new URL(nomURL); catch(Exception e){}; (url != null) appletContext.showDocument(url); lse System.out.println("ERREUR"); } // classe AppletShowDoc XERCICE5 ** affiche l'heure système et un message passé en parametre mport java.awt.*; mport java.applet.Applet; mport java.text.DateFormat; mport java.util.Date; ublic class AppletHorloge extends Applet { rivate String chaine; rivate String accueil; ublic AppletHorloge() { etFont(new Font("Courrier",Font.BOLD,36)); etBackground(Color.green); setForeground(Color.blue); IUT Département Informatique Programmation en Java M.Collard } ublic void init() { ccueil = getParameter("accueil") ; } ublic void paint(Graphics g) Date date = new Date(); tring chaine=DateFormat.getTimeInstance().format(date); .drawString(accueil,30,30); .drawString(chaine,50,85); //classe AppletHorloge * affiche l'heure système, met a jour l’affichage et affiche un message passé en parametre mport java.awt.*; mport java.applet.Applet; mport java.text.DateFormat; mport java.util.Date; ublic class AppletHorlogeDyn extends Applet { rivate String chaine; rivate String accueil; ublic AppletHorlogeDyn() { etFont(new Font("Courrier",Font.BOLD,36)); etBackground(Color.green); etForeground(Color.blue); } ublic void init() { ccueil = getParameter("accueil") ; } ublic void paint(Graphics g) { while (true) IUT Département Informatique Programmation en Java M.Collard { ate date = new Date(); tring chaine=DateFormat.getTimeInstance().format(date); .clearRect(0,0,getSize().width,getSize().height); .drawString(accueil,30,30); .drawString(chaine,50,85); y {Thread.sleep(1000);} atch (InterruptedException signal){} } } //classe AppletHorlogeDyn HTML> HEAD> TITLE>AppletHorlogeDyn</TITLE> /HEAD> BODY> H1>AppletHorlogeDyn</H1> HR> APPLET CODE=AppletHorlogeDyn WIDTH=300 HEIGHT=300> param name="accueil" value="Il est "> /APPLET> HR> /BODY> /HTML> XERCICE 6 ** Une AppletAppli peut s'exécuter indifféremment à partir d'une page web <br> ou à partir de la ligne de commande <br> Elle affiche l'heure système dynamiquement et affiche un message passé en parametre mport java.awt.*; mport javax.swing.*; import java.awt.event.*; IUT Département Informatique Programmation en Java M.Collard mport java.applet.Applet; mport java.text.DateFormat; mport java.util.Date; ublic class AppletAppliHorloge extends Applet //ou JApplet { rivate String chaine; rivate String accueil; * applet represente l'applet qui est ajoutee à la fenetre principale de l'application / tatic private Applet applet ; /ou /static private JApplet applet ; ublic AppletAppliHorloge() { etFont(new Font("Courrier",Font.BOLD,36)); etBackground(Color.green); etForeground(Color.blue); etSize(300,300); } ublic void init() { (applet != null) ccueil = "Il est :"; lse ccueil = getParameter("accueil") ; } ublic static void main(String[] arg) { * fenetre represente l'applet la fenetre principale de l'application / rame fenetre=new Frame(); /ou /JFrame fenetre=new JFrame(); pplet = new AppletAppliHorloge(); enetre.setSize(200,200); enetre.add(applet); //ou IUT Département Informatique Programmation en Java M.Collard /fenetre.getContentPane().add(applet); pplet.init(); pplet.start(); enetre.setVisible(true); } ublic void paint(Graphics g) { hile (true) { ate date = new Date(); tring chaine=DateFormat.getTimeInstance().format(date); .clearRect(0,0,getSize().width,getSize().height); .drawString(accueil,30,30); .drawString(chaine,50,85); y {Thread.sleep(1000);} atch (InterruptedException signal){} } } //classe AppletAppliHorloge ------------------------------------------------------------XERCICE 8 * un Emetteur est une applet qui envoie un message à l'applet Recepteur IUT Département Informatique Programmation en Java M.Collard mport java.awt.*; mport java.applet.*; mport java.awt.event.*; ublic class Emetteur extends Applet { rivate static Applet recepteur ; ublic void init() { etBackground(Color.yellow); etForeground(Color.blue); Panel panneau1=new Panel(); anneau1.add(new Label("Nom de cette applet : " + getParameter("NAME"), Label.LEFT)); dd(panneau1); anel panneau2=new Panel(); utton boutonEnvoyer = new Button("Envoyer message"); anneau2.add(boutonEnvoyer); dd(panneau2); ecepteur = getAppletContext().getApplet("applet Recepteur"); outonEnvoyer.addActionListener(new ActionListener() { ublic void actionPerformed(ActionEvent e) if (recepteur != null) if (!(recepteur instanceof Recepteur)) { metteur.this.getGraphics().drawString("Applet trouvee ; son nom : "+ recepteur.getParameter("name") + ", "+ " mais e n'est pas un recepteur\n",20,50); } lse { metteur.this.getGraphics().drawString("Applet trouvee ; son nom : "+ recepteur.getParameter("name") + " message nvoye!!!",20,50); (Recepteur)recepteur).executerRequeteVenantDe("applet Emetteur"); } } lse Emetteur.this.getGraphics().drawString("Impossible de trouver " "applet Recepteur" + ".\n",20,50);} } IUT Département Informatique Programmation en Java M.Collard ); //init //classe Emetteur ** un Recepteur est une applet qui reçoit et affiche un message venant de l'applet Emetteur mport java.applet.*; mport java.awt.*; mport java.awt.event.*; ublic class Recepteur extends Applet tatic final String messageAttente = "En attente d'un message... "; abel labelAttente = new Label(messageAttente, Label.RIGHT); tatic Applet emetteur; ublic void init() etBackground(Color.blue); etForeground(Color.yellow); anel panneau1=new Panel(); anneau1.add(new Label("Nom de cette applet : " + getParameter("NAME"), Label.LEFT)); dd(panneau1); anel panneau2=new Panel(); utton boutonEffacer = new Button("Effacer"); anneau2.add(boutonEffacer); dd(panneau2); anel panneau3=new Panel(); anneau3.add(labelAttente); dd(panneau3); emetteur = getAppletContext().getApplet("applet Emetteur"); IUT Département Informatique Programmation en Java M.Collard outonEffacer.addActionListener(new ActionListener() { ublic void actionPerformed(ActionEvent e) { ecepteur.this.labelAttente.setText(Recepteur.messageAttente ); ecepteur.this.getGraphics().clearRect(0,20,500,40); } }); }//init ublic void executerRequeteVenantDe(String nomEmetteur) { abelAttente.setText("Message reçu de " + nomEmetteur + "!"); } //classe Recepteur HTML> HTML> HEAD> TITLE>Communication entre applets</TITLE> /HEAD> BODY> TABLE> TR> H1>Emetteur</H1> APPLET CODE=Emetteur.class WIDTH=400 HEIGHT=200 AME="applet Emetteur"> PARAM NAME="NAME" value="applet Emetteur"> /APPLET> /TR> TR> HR> H1>Recepteur</H1> APPLET CODE=Recepteur.class WIDTH=400 HEIGHT=200 AME="applet Recepteur"> PARAM NAME="NAME" value="applet Recepteur"> /APPLET> /TR> /TABLE> /BODY> </HTML>