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