Supponiamo quindi di avere dieci rettangoli affiancati, ognuno dei quali è largo 20 e alto 100. Lasciamo uno spazio di 20 punti al di sopra del rettangolo per poter scrivere il numero di volte che il pulsante viene premuto all'interno di ciascuno di questi rettangoli.
Il problema è il seguente: dobbiamo memorizzare il numero di click all'interno di ognuno dei rettangoli. Dal momento che si tratta di dieci rettangoli, non è il caso di usare dieci variabili normali. Conviene invece usare un vettore. Dopo la intestazione del programma, dichiariamo quindi un vettore di interi con dieci componenti:
import java.awt.*;
public class ContaPunti extends java.applet.Applet {
int quantevolte[]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
Ogni elemento di questo vettore rappresenta il numero di
volte che il pulsante è stato premuto all'interno
di ognuno dei rettangoli. Inizialmente tutti gli elementi
di questo vettore valgono zero, dal momento che il mouse
non è mai stato premuto quando si inizia l'esecuzione
dell'applet. Lasciamo per un momento da
parte la funzione mouseDown, e vediamo invece la
funzione paint. Per prima cosa, dobbiamo disegnare
i rettangoli. Questi sono costituiti da due linee orizzontali
e da undici linee verticali. Non è difficile
verificare che il modo giusto per disegnare queste linee
è il seguente:
public void paint(Graphics g) {
int i;
g.drawLine(0,20,20*quantevolte.length,20);
g.drawLine(0,120,20*quantevolte.length,120);
for(i=0; i<=quantevolte.length; i=i+1) {
g.drawLine(i*20, 20, i*20, 120);
}
for(i=0; i<=quantevolte.length-1; i=i+1) {
g.drawString(""+quantevolte[i],i*20+5, 18);
}
}
Le prime due istruzioni drawLine disegnano le due
linee orizzontali, mentre il ciclo disegna le linee verticali.
Il secondo ciclo visualizza il contenuto del vettore
quantevolte. Questo è richiesto dal problema,
dal momento che sopra ogni rettangolo bisogna visualizzare
il numero dei click, che è rappresentato appunto dalle
variabili di questo vettore.Passiamo ora alla funzione mouseDown. Questa funzione riceve la posizione del cursore in cui il pulsante è stato premuto: deve controllare se questo punto si trova all'interno di uno dei rettangoli, ed eventualmente aumentare di uno la variabile che conta il numero di click di quel rettangolo.
La cosa si può fare in questo modo: per prima cosa, se y è minore di 20 o maggiore di 120, siamo sicuramente fuori da tutti i rettangoli. Una volta appurato che 20 <= y <= 120, dobbiamo ancora capire in quale rettangolo ci troviamo; inoltre, la x potrebbe essere troppo grande (cioè siamo a destra dell'ultimo rettangolo). Il primo rettangolo comprende i punti con coordinate x comprese fra 0 e 19, mentre il secondo comprende i punti in cui x va da 20 a 39, ecc. Quindi, se x ha un valore qualsiasi, si può capire in quale rettangolo ci si trova facendo la divisione intero x/20. Infatti, se x è compreso fra 0 e 19 questa espressione vale 0, se x sta fra 20 e 39 l'espressione vale 1, ecc. Quindi, se il pulsante è stato premuto nel punto x, la variabile da aumentare di 1 è quantevolte[x/20]. Da questo si capisce anche che, se x/20 super quantevolte.lenght, allora siamo fuori dalla fila di rettangoli.
Il programma completo ContaPunti.java, che include la funzione mouseDown spiegata sopra, è il seguente:
/*
Conta il numero di volte che il pulsante del mouse
viene premuto all'interno di ognuno dei rettangoli
disegnati.
*/
import java.awt.*;
public class ContaPunti extends java.applet.Applet {
int quantevolte[]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
public boolean mouseDown(Event e, int x, int y) {
if( (y>=20) && (y<=120) && (x<20*quantevolte.length) ) {
quantevolte[x/20]=quantevolte[x/20]+1;
}
repaint();
return true;
}
public void paint(Graphics g) {
int i;
g.drawLine(0,20,20*quantevolte.length,20);
g.drawLine(0,120,20*quantevolte.length,120);
for(i=0; i<=quantevolte.length; i=i+1) {
g.drawLine(i*20, 20, i*20, 120);
}
for(i=0; i<=quantevolte.length-1; i=i+1) {
g.drawString(""+quantevolte[i],i*20+5, 18);
}
}
}