© Sofia ZAIDENBERGCNRS Mai 2007 1 Interfaces Graphiques Dessiner avec JAVA Contexte Graphique Rafraîchissement Java2D

Embed Size (px)

Text of © Sofia ZAIDENBERGCNRS Mai 2007 1 Interfaces Graphiques Dessiner avec JAVA Contexte Graphique...

  • Page 1
  • Sofia ZAIDENBERGCNRS Mai 2007 1 Interfaces Graphiques Dessiner avec JAVA Contexte Graphique Rafrachissement Java2D
  • Page 2
  • Sofia ZAIDENBERG CNRS Mai 2007 2 GUI Bibliographie The JFC Tutorial: A guide to constructing GUI Kathy Walrath, Mary Campione http://java.sun.com/docs/books/tutorial/uiswing Java Tutorial Specialized trails: Trail: 2D Graphics Deborah Adair, Jennifer Ball and Monica Pawlan http://java.sun.com/docs/books/tutorial/2d l Java 2D Graphics Jonathan Knudsen, Ed. O'Reilly l Java 2D API Graphics Vincent J. Hardy, Java Series, Prentice Hall
  • Page 3
  • Sofia ZAIDENBERG CNRS Mai 2007 3 GUI Adaptateurs dvnements Dessin des segments de droite l Gestion des vnements souris Dplacement de la souris sur la zone de dessin met jour les coordonnes du curseur dans la barre dtat MOUSE_MOVED, MOUSE_DRAGGED Appuyer sur un bouton de la souris ( MOUSE_PRESSED ) dfinit le dbut dune droite Relcher le bouton de la souris ( MOUSE_RELEASED ) dfinit la fin de la droite type dvnement : MouseEvent source : zone de dessin interface dcoute : MouseListener rcepteur : zone de dessin MouseListener void mouseClicked(MouseEvent) void mouseEntered(MouseEvent) void mouseExited(MouseEvent) void mousePressed(MouseEvent) void mouseReleased(MouseEvent) Comme pour la fermeture de la fentre seule deux des mthodes de l interface nous intressent
  • Page 4
  • Sofia ZAIDENBERG CNRS Mai 2007 4 GUI Adaptateurs dvnements Dessin des segments de droite import java.awt.*; import javax.swing.*; import java.awt.event.*; public class ZoneDessin extends JPanel implements MouseMotionListener { private BarreEtat be; public ZoneDessin(BarreEtat be) { setBackground(Color.white); setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR)); this.be = be; addMouseMotionListener(this); } public void mouseMoved(MouseEvent e) { be.afficheCoord(e.getX(),e.getY()); } public void mouseDragged(MouseEvent e) { be.afficheCoord(e.getX(),e.getY()); } } // ZoneGraphique addMouseListener(new GestionnaireClic(this)); public void initieDroite(int x, int y) { be.afficheMessage("Relacher pour dessiner la droite"); // on compltera ensuite } public void termineDroite(int x, int y) { be.afficheMessage("Cliquer pour initier une droite"); // on compltera ensuite } import java.awt.event.*; public class GestionnaireClic extends MouseAdapter { ZoneGraphique zone; public GestionnaireClic(ZoneGraphique z) { zone = z; } public void mousePressed(MouseEvent e) { zone.initieDroite(e.getX(),e.getY()); } public void mouseReleased(MouseEvent e) { zone.termineDroite(e.getX(),e.getY()); } Pour ne pas avoir dfinir des mthodes inutiles possibilit dutiliser un adaptateur dvnements : MouseAdapter
  • Page 5
  • Sofia ZAIDENBERG CNRS Mai 2007 5 GUI Adaptateurs dvnements Dessin des segments de droite import java.awt.*; import javax.swing.*; import java.awt.event.*; public class ZoneDessin extends Jpanel implements MouseMotionListener { private BarreEtat be; public ZoneDessin(BarreEtat be) { setBackground(Color.white); setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR)); this.be = be; addMouseMotionListener(this); } public void initieDroite(int x, int y) { be.afficheMessage( Relacher pour dessiner la droite ); // on compltera ensuite } public void termineDroite(int x, int y) { be.afficheMessage( Cliquer pour initier une droite ); // on compltera ensuite }... } // ZoneGraphique new MouseAdapter() { public void mousePressed(MouseEvent e) { initieDroite(e.getX(),e.getY()); } public void mouseReleased(MouseEvent e) { termineDroite(e.getX(),e.getY()); } } addMouseListener( ); Avec une classe interne ( inner class ) anonyme ZoneDessin.this Linstance de la classe anonyme a implicitement accs linstance de la classe externe qui (c.--d. linstance) a provoqu sa cration : en consquence elle a accs aux membres de la classe externe
  • Page 6
  • Sofia ZAIDENBERG CNRS Mai 2007 6 GUI Dessiner avec Java Dessin des segments de droite import java.awt.*; import javax.swing.*; import java.awt.event.*; public class ZoneDessin extends Jpanel implements MouseMotionListener { private BarreEtat be; public ZoneDessin(BarreEtat be) { setBackground(Color.white); setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR)); this.be = be; addMouseMotionListener(this); } public void initieDroite(int x, int y) { be.afficheMessage( Relacher pour dessiner la droite ); // on compltera ensuite } public void termineDroite(int x, int y) { be.afficheMessage( Cliquer pour initier une droite ); // on compltera ensuite }... } // ZoneGraphique new MouseAdapter() { public void mousePressed(MouseEvent e) { initieDroite(e.getX(),e.getY()); } public void mouseReleased(MouseEvent e) { termineDroite(e.getX(),e.getY()); } } addMouseListener( ); Comment dessiner avec Java ? // on compltera ensuite
  • Page 7
  • Sofia ZAIDENBERG CNRS Mai 2007 7 GUI Contexte Graphique Ici le support du dessin est reprsent par une instance de la classe JPpanel avec java.awt dans la plupart des cas il sagit dune instance de la classe Canvas l Il faut des outils pour dessiner : l primitives gomtriques (droites, cercles, rectangles ) l gestion des attributs de trac (couleur du trait, couleur de remplissage, polices de caractres ) Ces outils sont reprsents en Java par la classe Graphics du package java.awt Classe abstraite : les instances de cette classe sont fournies la demande par le systme dexploitation qui, grce la machine virtuelle, instanciera une sous-classe de Graphics spcifique la plate-forme utilise Object Graphics The Graphics class is the abstract base class for all graphics contexts that allow an application to draw onto components that are realized on various devices, as well as onto off-screen images. A Graphics object encapsulates state information needed for the basic rendering operations that Java supports. mthodes de Graphics pour dessiner des formes
  • Page 8
  • Sofia ZAIDENBERG CNRS Mai 2007 8 GUI Dessiner avec Java Dessin des segments de droite l Repre graphique Appuyer sur un bouton de la souris ( MOUSE_PRESSED ) dfinit le dbut dune droite Relcher le bouton de la souris ( MOUSE_RELEASED ) dfinit la fin de la droite type dvnement : MouseEvent Exprimes dans le repre de la source de lvnement : le JPanel X y x y ? ? ? ? x y Coordonnes position de la souris 150 50 250 110
  • Page 9
  • Sofia ZAIDENBERG CNRS Mai 2007 9 GUI Dessiner avec Java Dessin des segments de droite import java.awt.*; import javax.swing.*; import java.awt.event.*; public class ZoneDessin extends Jpanel implements MouseMotionListener { private BarreEtat be; public ZoneDessin(BarreEtat be) { setBackground(Color.white); setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR)); this.be = be; addMouseMotionListener(this); addMouseListener( new MouseAdapter() {... } ); } public void initieDroite(int x, int y) { be.afficheMessage( Relacher pour dessiner la droite ); } public void termineDroite(int x, int y) { be.afficheMessage( Cliquer pour initier une droite ); }... } // ZoneDessin int xInit, yInit; xInit = x; yInit = y; Lorsque le bouton de la souris est press : mmoriser le dbut dun nouveau segment Lorsque le bouton de la souris est relch : Graphics g = this.getGraphics(); 1) Rcuprer le contexte graphique associ au JPanel g.drawLine(xInit,yInit,x,y); 2) Utiliser lobjet Graphics pour effectuer le dessin
  • Page 10
  • Sofia ZAIDENBERG CNRS Mai 2007 10 GUI Dessiner en Java rafraichissement du dessin l Problme de raffichage aprs que la fentre ait t masque, redimensionne 1 23 Zone non rafraichie l Application seule ne peut pas dcider du moment o elle doit tre rafrachie l Le systme ne prend pas en charge seul le rafrachissement l avertit uniquement lapplication quelle doit se redessiner (en lui indiquant quel est son rectangle invalide) l la charge de celle-ci de se redessiner GO
  • Page 11
  • Sofia ZAIDENBERG CNRS Mai 2007 11 GUI Affichage d'un composant Quand un composant est-il affich ? l la demande du systme ( System triggered painting ) l la demande de lapplication ( Application triggered painting ) l quand le programme ou un composant Swing dtermine que le composant doit tre raffich l en interne dans les Swing (changement dun texte, dune couleur...) l dans votre propre programme en faisant une demande explicite de raffichage appel de la mthode repaint() du composant place une demande daffichage dans la file dattente des vnements le thread de gestion des vnements se chargera dappeler la mthode paint() l quand le composant est rendu visible pour la premire fois l quand le composant a t recouvert puis dcouvert appel de la mthode paint(Graphics g) du composant ne jamais appeler paint() directement, toujours utiliser repaint()
  • Page 12
  • Sofia ZAIDENBERG CNRS Mai 2007 12 GUI Affichage d'un composant Que fait la mthode paint() ? 1) Le fond (background) (si opaque) 2) Affichage spcifique (custom painting) (si prsent) 3) Bordure (border) (si prsent) 4) Les fils (children) (si prsent) dessine le composant lui-mme dj implmente pour les composants standards (fentres, boutons, ) doit tre redfinie ( overriden ) pour crer vos propres composants Dessine les bordures ajoutes au composant (en utilisant setBorder ) paintComponent(Graphics g) paintBorder(Graphics g) paintChildren(Graphics g) Ne pas appeler directement cette mthode ni la redfinir.
  • Page 13
  • Sofia ZAIDENBERG CNRS Mai 2007 13 GUI Affichage d'un composant l Un composant se dessine avant chacun des composants quil contient Laffichage dune interface Swing seffectue rcursivement en descendant la hirarchie des containers bouton 1 bouton 2 composant qui affiche du texte fentre contentPane panneau gauchepanneau droite composant textebouton1 bouton2 ordre daffichage