Rendere permanenti tutte le modifiche

Analizziamo ora il problema di evitare la cancellazione di tutte le figure geometriche che vengono disegnate da mouseDown. In effetti, abbiamo già tutte le informazioni necessarie per realizzare un programma del genere. Si tratta infatti di memorizzare le caratteristiche di tutti i punti in cui il mouse viene premuto in delle variabili globali, in modo tale che paint possa fare tutti i disegni da capo.

Consideriamo quindi il programma DrawAndClick.java. Cosí come è scritto, i quadratini che corrispondono ai click del mouse non vengono disegnati ogni volta che la finestra diventa visibile. Il motivo è chiaro: viene fatto solo quello che si trova nel blocco del paint(){ ... }, e il disegno dei quadratini non si trova lí dentro.

Per rendere questi quadratini permanenti, è necessario che all'interno di paint vengano disegnati tutti i quadratini che corrispondono a tutti i punti in cui è stato premuto il pulsante. È quindi necessario memorizzare via via tutti i punti in cui è stato premuto il pulsante.

Dal momento che occorre memorizzare un numero non noto di valori per le coordinate x e y di ogni punto, usiamo due vettori: xvett e yvett. Ci serve poi sapere quanti punti sono stati disegnati fino a questo momento, e per questo usiamo una variabile intera npunti.

All'inizio, il numero dei punti disegnati è zero: questo è quindi il valore iniziale della variabile npunti. Il primo punto viene memorizzato nelle variabili xvett[0] e yvett[0], e a questo corrisponde un incremento della variabile npunti. Al secondo click del mouse, le variabili da usare sono xvett[1] e yvett[1], e si incrementa nuovamente npunti. In poche parole: a ogni click si memorizza il valore di x in xvett[npunti] e il valore di y in yvett[npunti]. La struttura di mouseDown() diventa quindi:

  public boolean mouseDown(Event e, int x, int y) {
    int i;

    g.fillRect(x-2,y-2,4,4);

    xvett[npunti]=x;
    yvett[npunti]=y;
    npunti=npunti+1;

    return true;
  }
Per quello che riguarda il disegno: all'interno di paint() occorre fare il disegno di tutti i punti che sono stati toccati fino a questo momento. Dal momento che le coordinate del primo punto sono memorizzate in xvett[0] e yvett[0], mentre le ultime sono in xvett[npunti-1] e yvett[npunti-1], è chiaro che occorre fare un ciclo in cui una variabile va da 0 a npunti-1 aumentando di 1 ogni volta:

  public void paint(Graphics g) {
    int i;

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

I due vettori xvett e yvett e la variabile npunti vanno dichiarati come variabili globali, dal momento che sia mouseDown che paint li devono usare.

public class PuntiMouseDue 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) {
    ...
  }

  public void paint(Graphics g) {
    ...
  }
}
Con questo tipo di dichiarazione, i due vettori xvett e yvett e la variabile npunti si possono usare in entrambi i blocchi di istruzioni, e sono esattamente gli stessi. In questo modo, ogni volta che viene premuto il pulsante del mouse, si attiva la sequenza mouseDown, che disegna il punto, memorizza le posizioni nei vettori e incrementa la variabile npunti. Ogni volta che la finestra diventa visibile, si ridisegnano tutti i punti memorizzati nei vettori. Il programma finale PuntiMouseDue.java risulta quindi il seguente:

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

import java.awt.*;

public class PuntiMouseDue 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) {
    Graphics g=getGraphics();

    g.fillRect(x-2,y-2,4,4);

    xvett[npunti]=x;
    yvett[npunti]=y;
    npunti=npunti+1;

    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);
  }
}