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