Newsgroup: it.comp.java
Titolo: capire a quale click sono.

Per disegnare una linea su un'applet devo fare due click ( o cmq premere il 
bottone del mouse due volte): una volta per indicare il punto di partenza e 
il secondo per indicare il punto di arrivo e disegnare la linea.
Pensavo di tenere traccia delle volte che avevo premuto il bottone del mouse 
con una semplice variabile intera sul metodo paint() dell'applet e di 
fargli cambiare valore ad ogni repaint().
Purtroppo la cosa non sempre funziona: evidentemente all'apertura 
dell'applet alle volte ci possono essere due chiamate al metodo paint, con 
la conseguenza che il primo click viene considerato come fosse un secondo 
click.
Come posso fare, allora, a tenere traccia del numero dei click senza sperare 
nella fortuna ?
per completezza posto il codice che uso: 
*******************************
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Point2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.text.NumberFormat;
public class Pendenza extends java.applet.Applet
{//applet Pendenza
   //variabili
   private final Point2D p1;
   private final Point2D p2;
   private final Point2D p3;
   private int n;
   /** Istanzia l'applet Pendenza */
   public Pendenza()
   {//costrtuttore Pendenza()
      //inizializzazione variabili
      p1 = new Point2D.Double();
      p2 = new Point2D.Double();
      p3 = new Point2D.Double();
      n = 3;
 
      /*CLASSE INTERNA*/
      class MouseClick extends MouseAdapter
      {//classe interna MouseClick
         public void mousePressed(MouseEvent e)
         {//metodo interno mousePressed(MouseEvent):void
            switch (n)
            {
               case 0:  //primo click
                  p1.setLocation(e.getX(), e.getY());
                  repaint();
                  break;
 
               case 1:  //secondo click
                  p2.setLocation(e.getX(), e.getY());
                  p3.setLocation(p1.getX(), p2.getY());
                  repaint();
                  break;
            }
         }//fine metodo interno mousePressed(MouseEvent):void
      }//fine classe interna MouseClick
      /*FINE CLASSE INTERNA*/
 
      this.addMouseListener(new MouseClick());
   }//fine costruttore Pendenza
 
   /** Classe che disegna sulla finestra dell'applet */
   public void paint(Graphics g)
   {//overridding paint (Graphics):void
      //cast di g
      Graphics2D g2 = (Graphics2D) g;
 
      switch (n)
      {
         case 0: //primo click
            Ellipse2D.Double point = new Ellipse2D.Double((p1.getX() - 2), 
(p1.getY() - 2), 4, 4);
            g2.draw(point);
            n = 1; //passa al secondo click
            break;
 
         case 1:        //secondo click
            Line2D.Double line = new Line2D.Double(p1, p2);
            g2.draw(line);
            //misura distanze e pendenza
            double min = p3.distance(p1);
            double max = p3.distance(p2);
            double pendence = (min / max) * 100;
            //formattatore
            NumberFormat formatter =NumberFormat.getNumberInstance();
            formatter.setMaximumFractionDigits(2);
            formatter.setMinimumFractionDigits(2);            
            //coordinate per stringa
            float k = 0;
            float h = 0;
            //controlla che venga scritta in mezzo alla linea
            if (p1.getX() < p2.getX())
               h = (float)(p1.getX() + max / 2);
 
            else 
               h = (float)(p2.getX() + max / 2);
 
            if (p1.getY() < p2.getY())
               k = (float)(p1.getY() + min / 2);
            else
               k = (float)(p2.getY() + min / 2);
 
            //scrive valori      
            g2.drawString("Pend: " + formatter.format(pendence) + "%. Dist: 
" + 
                           formatter.format(p1.distance(p2)), h, k );
            n = 0; //passa al primo click
            break;
 
         case 3:        //apertura applet
            n = 0; //passa al primo click
            break;
      }
   }//fine overriding paint(Graphics):void
 
}//fina applet Pendenza
-- 
Ciao. Fabrizio. ( icq: 241182067 )
< MISTAH KURTZ -- HE DEAD.
                A penny for the Old Guy> 
(T.S. Elliot: the hollow men)

Scusa, ma avendo poco tempo ho letto solo l'inizio del tuo post e non ho
guardato il codice.
Se usi una variabile booleana, basterebbe che tu ne facessi switchare il
valore solo alla pressione del mouse nel metodo mousePressed. E' solo qui
che deve switchare. Non nel metodo paint. Nel metodo paint controlli il
valore della boolean e a seconda agisci chiudendo la linea.
Spero di poterti essere stato utile. E' ovvio che la variabile non deve
cambiare valore nel metodo paint, altrimenti basta anche un repaint o
qualcos'altro del genere per farti cambiare valore. Ciao.

Alberto wrote:

Mi sei stato utilissimo, però invece di usare una varibile booleana ho 
preferito usare un int che può assumere tre stati n = 0, n = 1 e n = 3.
Ho fatto questo tipo di scelta per non dover disegnare nulla la prima volta 
(quando si apre l'applet).
Per cui alla fine (fermo restando il metodo paint a cui ho tolto le 
riassegnazione dell'int n) il metodo muosePressed è:
***********************************
public void mousePressed(MouseEvent e)
         {//metodo interno mousePressed(MouseEvent):void
            switch (n)  //tiene traccia dei click
            {
               case 1:  //primo click
                  p1.setLocation(e.getX(), e.getY());
                  n = 0;
                  repaint();                  
                  break;
 
               case 0:  //secondo click
                  p2.setLocation(e.getX(), e.getY());
                  p3.setLocation(p1.getX(), p2.getY());
                  n = 1;
                  repaint();
                  break;
 
               case 3:  //ancora nessun click
                  p1.setLocation(e.getX(), e.getY());
                  n = 0;
                  repaint();
                  break;                  
            }
         }//fine metodo interno mousePressed(MouseEvent):void
*****************************************************
Una cosa però non capisco: ho dovuto dare un colpetto a tutti gli 
assegnamenti di n, perchè malgrado le definissi dopo il repaint(), il 
repaint() sembrava cmq essere fatto dopo l'assegnamento ( non so se si 
capisce cosa voglio dire )
p.s.: Certo che se la smettessi di fissarmi che nelle classi interne devo 
usare per forza in tutti i casi delle variabili final .....
