Ciao a tutti,
sono alle prime armi con java e mi stavo divertendo a personallizare un esercizio trovato sempre online.
Si tratta di una specie di lavagna che tenendo premuto il tasto del mouse scrve sul JPanel.
Naturalmente finn quì tutto ok... anche perchè il codice è copiato dall'esempio....
Questo è l'esempio:


codice:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.JFrame.*;


public class Painter extends JPanel {
  private int startXPoint = 0; // coordinata x di partenza
  private int endXPoint = 0; // coordinata x di arrivo
  private int startYPoint = 0; // coordinata y di partenza
  private int endYPoint = 0; // coordinata y di
  boolean paint = false;

  //ascoltatore del moto del mouse
  class mMotionListener implements MouseMotionListener {
    public void mouseDragged(MouseEvent e) {
      //aggiorna le coordinate
      startXPoint = endXPoint;
      startYPoint = endYPoint;
      endXPoint = e.getX();
      endYPoint = e.getY();
      //disegna
      Painter.this.repaint();
    }

    public void mouseMoved(MouseEvent e) {
      // aggiorna le coordinate
      startXPoint = endXPoint;
      startYPoint = endYPoint;
      endXPoint = e.getX();
      endYPoint = e.getY();
    }
  }

// ascoltatore dei pulsanti del mouse
  class mListener implements MouseListener {

    // i seguenti metodi sono richiesti dalla
    // interfaccia MouseListener anche se non
    // vengono utilizzati

    public void mouseClicked(MouseEvent e) {}

    public void mouseEntered(MouseEvent e) {}

    public void mouseExited(MouseEvent e) {}

    public void mouseReleased(MouseEvent e) {}

    // pulsante premuto
    public void mousePressed(MouseEvent e) {
      //attiva la modalità di disegno
      paint = true;
    }

    // pulsante rilasciato
    public void MouseReleased(MouseEvent e) {
      // disattiva la modalità di  disegno
      paint = false;
    }
  }

  // Costruttore della classe principale
  public Painter() {
    super();
    MouseListener ml = new mListener();
    addMouseListener(ml);
    MouseMotionListener mml = new mMotionListener();
    addMouseMotionListener(mml);
  }

  public void paint(Graphics g) {
    // se è attiva la modalòità disegno, traccia una riga
    if (paint) {
      g.drawLine(startXPoint,startYPoint,endXPoint,endYPoint);
    }
  }
  public static void main(String argv[]) {
    Painter p = new Painter();
    JFrame f = new JFrame("Mia Prova Lavagna");

    f.getContentPane().add(p);
    f.setSize(500, 400);
    f.setVisible(true);
  }

}

dicevo tutto bene.. fino a quando non ho deciso...
cerco di imparare qualcosa personalizzandolo...
La mia idea era.. di creare un tasto che dopo averlo premuto mi cancella il tratto come una gomma sempre al passaggio del mouse...

Quindi ho aggiunto un pulsante... in questo modo....


codice:
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.JFrame.*;


public class Painter extends JPanel {
  private int startXPoint = 0; // coordinata x di partenza
  private int endXPoint = 0; // coordinata x di arrivo
  private int startYPoint = 0; // coordinata y di partenza
  private int endYPoint = 0; // coordinata y di
  boolean paint = false;

  //ascoltatore del moto del mouse
  class mMotionListener implements MouseMotionListener {
    public void mouseDragged(MouseEvent e) {
      //aggiorna le coordinate
      startXPoint = endXPoint;
      startYPoint = endYPoint;
      endXPoint = e.getX();
      endYPoint = e.getY();
      //disegna
      Painter.this.repaint();
    }

    public void mouseMoved(MouseEvent e) {
      // aggiorna le coordinate
      startXPoint = endXPoint;
      startYPoint = endYPoint;
      endXPoint = e.getX();
      endYPoint = e.getY();
    }
  }

// ascoltatore dei pulsanti del mouse
  class mListener implements MouseListener {

    // i seguenti metodi sono richiesti dalla
    // interfaccia MouseListener anche se non
    // vengono utilizzati

    public void mouseClicked(MouseEvent e) {}

    public void mouseEntered(MouseEvent e) {}

    public void mouseExited(MouseEvent e) {}

    public void mouseReleased(MouseEvent e) {}

    // pulsante premuto
    public void mousePressed(MouseEvent e) {
      //attiva la modalità di disegno
      paint = true;
    }

    // pulsante rilasciato
    public void MouseReleased(MouseEvent e) {
      // disattiva la modalità di  disegno
      paint = false;
    }
  }

  // Costruttore della classe principale

  public Painter() {
    super();
    MouseListener ml = new mListener();
    addMouseListener(ml);
    MouseMotionListener mml = new mMotionListener();
    addMouseMotionListener(mml);
  }

  public void paint(Graphics g) {
    // se è attiva la modalòità disegno, traccia una riga
    if (paint) {
      g.drawLine(startXPoint,startYPoint,endXPoint,endYPoint);
    }
  }






  public static void main(String argv[]) {
    Painter p = new Painter();
    JFrame f = new JFrame("Mia Prova Lavagna");


    ///************** AGGIUNTO DA MEEEEEEEEE ***************///

    JButton pulsante = new JButton("Cancella");
    f.getContentPane().setLayout(new BorderLayout());
    f.getContentPane().add((p), BorderLayout.NORTH);
    f.getContentPane().add((p), BorderLayout.EAST);
    f.getContentPane().add((p), BorderLayout.WEST);
    f.getContentPane().add((p), BorderLayout.CENTER);
    f.getContentPane().add((pulsante), BorderLayout.SOUTH);
    f.pack();

    ///************************************************///

    //f.getContentPane().add(p);


    f.setSize(500, 400);
    f.setVisible(true);
  }

}

e diciamo che già solo questo mi dà un pò di problemi visto che una volta premuto il pulsante cancella e ritorno sulla lavagna sopra in alto mi compare un'altro pulsante.
Naturalmente quest'ultimo pulsante non è proprio un pulsante ma una dovrebbe essere una copia fotografica del punto in cui è passato il mouse.
Vabbè... questo ne sono consapevole... .anche se non ho presente qual'è la soluzione.
Quello che mi interessa proprio di più è come aggiungere un metodo che mi possa cambiare il metodo

g.drawLine(startXPoint,startYPoint,endXPoint,endYP oint);

in uno che mi cancella.... sempre se così che si faccia.... e se sono nella direzione giusta...


Confido in un vostro aiuto...
grazie
Ciao Giuseppe R.