Repaint

Il programma PuntiMouseDue.java ha una struttura abbastanza tipica: mouseDown, (risposta a un click) effettua dei disegni, e poi memorizza delle informazioni che permettono a paint di ripetere questo disegno ogni volta che la finestra diventa visibile.

Un metodo che permette di semplificare leggermente questo schema è di limitare la mouseDown alla sola memorizzazione delle informazioni, lasciando che sia paint a fare tutti i disegni. Questo però genera un ulteriore problema: le cose che vengono memorizzate da mouseDown non sono visibili fino a che la finestra non viene coperta e poi scoperta. Il problema è che se il disegno viene fatto da paint, allora viene fatto solo in questa condizione.

È però possibile risolvere il problema usando la istruzione repaint() che forza il disegno dell'applet. Si può dire che, ogni volta che si esegue l'istruzione repaint(), è come se l'applet venisse coperto e poi scoperto di nuovo. Nel nostro caso, vogliamo che la finestra venga disegnata di nuovo ogni volta che si preme un pulsante del mouse, per cui l'istruzione repaint() va eseguita per ultima alla fine del blocco mouseDown. Il programma completo PuntiMouseTre.java è riportato qui sotto.

/*
  Disegna dei punti, sulla base del click del mouse
*/

import java.awt.*;

public class PuntiMouseTre extends java.applet.Applet {
  int xvett[] = new int[100];
  int yvett[] = new int[100];
  int npunti=0;

  public boolean mouseDown(Event e, int x, int y) {
    xvett[npunti]=x;
    yvett[npunti]=y;
    npunti=npunti+1;

    repaint();

    return true;
  }

  public void paint(Graphics g) {
    int i;

    for(i=0; i<=npunti-1; i++) 
      g.fillRect(xvett[i]-2,yvett[i]-2,4,4);
  }
}

È importante notare che la funzione mouseDown, in questo caso, non contiene la istruzione Graphics g=getGraphics(). Questa istruzione è necessaria solo se nella funzione si intende disegnare qualcosa. Nel programma di sopra il disegno viene fatto dalla funzione paint, mentre all'interno di mouseDown non si disegna niente, per cui questa istruzione non è necessaria.