Dessiner en mémoire

Il arrive parfois que l'on désire construire une image en mémoire avant de l'afficher. C'est le cas lorsqu'on veut créer des animations ou lorsqu'on veut conserver le contenu d'une zone de dessin sans structures particulières. Nous allons écrire une applet de dessin à la souris qui utilise cette possibilité.

Les déclarations

Nous utiliserons une variable img de type Image qui représentera l'image en mémoire et une variable gi de type Graphics qui sera le contexte graphique servant à dessiner dans l'image. Des variables oldx et oldy contiendront les coordonnées du dernier point dessiné ou -1 si celui-ci n'existe pas. Ceci nous donne :

        import java.awt.*;
        import java.awt.event.*;
        import java.applet.*;

        public class dessin extends Applet 
         implements MouseListener, MouseMotionListener {

          Image img=null;
          Graphics gi=null;
  
          int oldx=-1;
          int oldy=-1;

Les interfaces MouseListener et MouseMotionListener nous permettront de gérer les évènements souris.

Méthode init

La méthode init de l'applet nous permettra de construire img et gi en utilisant la méthode createImage de l'applet et la méthode getGraphics de l'image obtenue. On obtient :

          public void init() {
           addMouseListener(this);
           addMouseMotionListener(this);
           img=createImage(getSize().width, getSize().height);
           gi=img.getGraphics();
          }

Méthodes paint et update

La méthode paint se contente de dessiner l'image. Nous réécrivons la méthode update pour éviter les effacements d'écran à chaque appel de repaint.

          public void paint (Graphics g) {
           g.drawImage(img,0,0,getSize().width,getSize().height,this);
          }

          public void update (Graphics g) {
           paint(g);
          } 

Gestion de la souris

Nous devons enfin écrire les méthodes exidées par les interfaces de gestion de la souris. Nous effectuerons les opérations suivantes :

On obtient le code suivant :

          // Gestion de l'événement "bouton de la souris enfoncé"
          public void mousePressed(MouseEvent evt) {
           oldx = evt.getX();
           oldy = evt.getY();
           gi.drawLine(oldx,oldy,oldx,oldy);
           repaint();
          }

          // Gestion de l'événement "bouton de la souris relevé"
          public void mouseReleased(MouseEvent evt) {
           if (oldx>=0 && oldy>=0) {
            gi.drawLine(oldx,oldy,evt.getX(),evt.getY());
            oldx=-1;
            oldy=-1;
            repaint();
           } 
          }

          public void mouseEntered(MouseEvent e) {}

          public void mouseExited(MouseEvent e) {}

          public void mouseClicked(MouseEvent e) {}

          // Gestion de l'événement "déplacement souris avec bouton enfoncé"
          public void mouseDragged(MouseEvent evt) {
           if (oldx>=0 && oldy>=0) {
            int newx=evt.getX();
            int newy=evt.getY();
            gi.drawLine(oldx,oldy,newx,newy);
            oldx=newx;
            oldy=newy;
            repaint();
           } 
          }

          public void mouseMoved(MouseEvent evt) {}



Retour au menu