Paint e mouseDown insieme

I programmi visti fino ad ora sono di due tipi: quelli con paint, che disegnano qualcosa ma non reagiscono ai click del mouse, e quelli con mouseDown, che invece reagiscono al click del mouse, ma disegnano una finestra che inizialmente è vuota. Ci sono casi in cui si vogliono fare tutte e due queste cose, ossia si deve disegnare qualcosa all'inizio, e poi reagire alla pressione del tasto del mouse con azioni opportune.

Come abbiamo visto, l'applet che disegna quando viene premuto il tasto del mouse ha questa struttura:

import java.awt.*;

public class nomefile extends java.applet.Applet {
  public boolean mouseDown(Event e, int x, int y) {
    ...
  }
}
L'applet che fa un disegno all'inizio e poi basta ha invece una struttura leggermente diversa:

import java.awt.*;

public class nomefile extends java.applet.Applet {
  public void paint(Graphics g) {
    ...
  }
}
La differenza sta nel fatto che il primo tipo di applet contiene un blocco di istruzioni mouseDown(..) { ... }, mentre il secondo tipo contiene un blocco paint(..) { ... }. Come si è già detto, le istruzioni che si trovano all'interno delle parentesi graffe di mouseDown(..) { ... } sono quelle che vengono eseguite quando il pulsante del mouse viene premuto.

Nel caso degli applet che disegnano, il blocco di istruzioni all'interno delle parentesi graffe di paint(..) { ... } vengono invece eseguite comunque all'inizio della esecuzione dell'applet.

È possibile mettere nello stesso applet sia il blocco mouseDown(..) { ... } che quello paint(..) { ... }. In questo modo, possiamo specificare cosa deve succedere sia quando si preme il pulsante del mouse che quando si deve disegnare la finestra. Lo schema generale, a questo punto, risulta il seguente:

import java.awt.*;

public class nomefile extends java.applet.Applet {
  public boolean mouseDown(Event e, int x, int y) {
    bloccoA
  }

  public void paint(Graphics g) {
    bloccoB
  }
}
La sequenza di istruzioni bloccoA viene eseguito quando si preme il pulsante del mouse, mentre bloccoB si esegue all'inizio della esecuzione. Questo è molto interessante, e ci consente di realizzare un applet in cui possiamo contemporanemente disegnare qualcosa e rispondere al click.

Supponiamo per esempio di voler modificare l'applet CrociCerchi.java che disegna una croce se si fa click in un punto con x<=200 e un cerchio altrimenti. Vogliamo tracciare una linea sul confine fra i punti dove si disegnano le croci e i punti dove si disegnano i cerchi.

La linea che separa le due regioni è una linea verticale in cui x vale 200. Per esempio, si può tracciare con drawLine(200,0,200,500). Dal momento che questa linea va disegnata ogni volta che l'applet parte, la mettiamo all'interno di paint. Il programma complessivo CrociCerchiLinea.java è riportato qui sotto.

/*
  Disegna croci e cerchi, piu' la linea
  che li separa.
*/

import java.awt.*;

public class CrociCerchiLinea extends java.applet.Applet {

	/* risponde al click del mouse */
  public boolean mouseDown(Event e, int x, int y) {
    Graphics g=getGraphics();

    if( x<=200 ) {
      g.drawLine(x,y-5,x,y+5);
      g.drawLine(x-5,y,x+5,y);
    }
    else {
      g.drawOval(x-5,y-5,10,10);
    }

    return true;
  }

	/* disegna la linea di separazione */
  public void paint(Graphics g) {
    g.drawLine(200,0,200,500);
  }
}