Rilasciamento pulsante: mouseUp

La funzione mouseUp viene chiamata ogni volta che il pulsante del mouse, che precedentemente era stato premuto, è stato rilasciato. In altre parole, quello che suceede quando si preme il pulsante del mouse è:

si preme il pulsante del mouse
nella posizione (x,y)
viene attivata la funzione mouseDown
si rilascia il pulsante, mentre il mouse è
nella posizione (x,y)
viene attivata la funzione mouseUp

Va notato che la posizione in cui il pulsante viene rilasciato non è necessariamente la stessa in cui il pulsante è stato premuto. Infatti, l'utente potrebbe aver premuto il pulsante, poi mosso il cursore tenendo il pulsante premuto, e poi rilasciato il pulsante in una posizione diversa da quella iniziale. In effetti, questo metodo di tenere premuto il pulsante spostandosi viene spesso usato dai programmi di disegno, quando si vogliono disegnare figure geometriche che sono caratterizzate da due punti (per esempio, rettangoli).

Facciamo un esempio: disegnamo un quadrato nel punto il cui il pulsante viene premuto, e un cerchio nel punto in cui viene rilasciato. Chiaramente, se si preme e si rilascia il pulsante senza muovere il cursore, questi due punti sono lo stesso. D'altra parte, se si muove il mouse mentre il pulsante viene tenuto premuto, questi due punti sono differenti. Per realizzare due figure differenti nel caso di pressione e rilascio, dobbiamo semplicemente definire sia mouseDown che mouseUp. La prima disegna il rettangolo, mentre le seconda disegna il cerchio. Il programma completo QuadratiCerchi.java è questo:

/*
  Quadrati dove viene premuto il pulsante,
  cerchi dove viene rilasciato.
*/

import java.awt.*;

public class QuadratiCerchi extends java.applet.Applet {

  public boolean mouseDown(Event e, int x, int y) {
    Graphics g=getGraphics();

    g.drawRect(x-5,y-5,10,10);

    return true;
  }

  public boolean mouseUp(Event e, int x, int y) {
    Graphics g=getGraphics();

    g.drawOval(x-5,y-5,10,10);

    return true;
  }
}

Un altro esempio: il programma DisegnaCancella.java disegna un quadrato nel punto in cui viene premuto il pulsante, e lo cancella quando il pulsante viene rilasciato.

/*
  Disegna un punto finche' il mouse e' premuto,
  poi lo cancella.
*/

import java.awt.*;

public class DisegnaCancella extends java.applet.Applet {

  public boolean mouseDown(Event e, int x, int y) {
    Graphics g=getGraphics();

    g.fillRect(x-3,y-3,7,7);

    return true;
  }

  public boolean mouseUp(Event e, int x, int y) {
    Graphics g=getGraphics();

    g.clearRect(x-3,y-3,7,7);

    return true;
  }
}

Va notato che non necessariamente i quadrati vengono cancellati. Infatti, se si preme il pulsante in un punto e si sposta il cursore tenendolo premuto, allora la coordinate (x,y) della funzione mouseUp sono diverse dal punto (x,y) della funzione mouseDown. Il programma che effettivamente cancella il quadrato disegnato deve memorizzare la sua posizione in una variabile globale, come viene fatto in DisegnaCancellaDue.java, che viene riportato qui sotto.

/*
  Disegna un punto finche' il mouse e' premuto,
  poi lo cancella.
*/

import java.awt.*;

public class DisegnaCancellaDue extends java.applet.Applet {

  int lx,ly;

  public boolean mouseDown(Event e, int x, int y) {
    Graphics g=getGraphics();

    lx=x;
    ly=y;

    g.fillRect(x-3,y-3,7,7);

    return true;
  }

  public boolean mouseUp(Event e, int x, int y) {
    Graphics g=getGraphics();

    g.clearRect(lx-3,ly-3,7,7);

    return true;
  }
}

Va notato che le variabili globali non si possono chiamare x e y. Infatti, se si facesse cosí non si potrebbero usare all'intero delle funzioni mouseUp e mouseDown, che hanno le loro variabili con gli stessi nomi.