Les zones de dessin (Canvas)

Introduction

On utilise les Canvas pour definir une zone graphique ou l'on va afficher des images, tracer des lignes, etc. Cela permet egalement de gerer des evenements qui surviennent dans cette zone. Pour l'utilisateur, le principe est d'ecrire une classe qui herite d'un Canvas. Les methodes de cette classes sont tres simples :
 
Canvas() 
    Constructeur
addNotify() 
    Creation de la prise en compte. 
paint(Graphics) 
    Methode de mise a jour de la zone. L'utilisateur doit surcharger cette methode.
 
Exemple : un objet de la classe MonCanvas sera defini dans une applet (par exemple). Suivant les actions se passant dans cette applet (definies par le programmeur), la methode set_action de MonCanvas sera appelee pour definir l'operation a effectuer lors de l'appel de la methode paint.
 
class MonCanvas extends Canvas
    Image img ;
    URL url_img ;
    int numColors=256 ;
    int cols = 8 ;
    int mon_action =-1;
    Classe_du_pere racine ;
    // Constructeur
    MonCanvas (Classe_du_pere racine)
      this.racine = racine ; // seul le pere qui est une applet peut ouvrir une URL, d'ou ce pointeur !
      try { url_img = new URL("http://www.ou_ca.fr/repertoire/mon_image.gif") ; }
      catch (Exception e) { e.printStackTrace(); }
     }
     
    // 3 action possibles  suivant la valeur de mon_action : ecrire un texte, afficher une image ou afficher une palette
    public void paint(Graphics g) 
      int i, k ;
      switch(mon_action)
        case 0 : g.drawString("J'affiche un petit texte", 10,50) ; 
        break ;
        case 1 :
          try 
          { img=racine.getImage(url_img) ; prepareImage(img, this);
          g.drawImage(img, 50, 0, this) ;

          catch (Exception e) 
          { e.printStackTrace(); }
        break ;
        case 2 :
          for (i=0; i<numColors; i++) 
          {
            int r = i / cols;
            int c = i % cols;
            g.setColor(new Color(i, c+r, (numColors-i)/2 ));
            g.fillRect(c * 10, r * 10, 10, 10);
          }
        break ;
      }
    }
     
    public void set_action(int i)
    { mon_action=i ; }
}
 
 

Ph. RIS 1997