import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
/* PannelloConPallinaConPallina.java
  Autore: Pietro Frasca, Giugno 2002
*/

class PannelloConPallina extends JPanel implements ActionListener,DocumentListener{
  private JButton start, stop, colore;
  private JTextField tx,ty;
  private int x,y,dx,dy,H,W;
  private boolean moto=false; 
  
  public PannelloConPallina(){
    x=0;y=0;
    dx=1;//incremento orizzontale
    dy=1;//incremento verticale
    start=new JButton("Start"); //bottone start
    stop=new JButton("Stop");// bottone stop
    colore=new JButton("Colore");
    tx=new JTextField("1",5);// casella di input per la traiettoria (componente x)
    ty=new JTextField("1",5);// casella di input per la traiettoria (componente y)
    
    add(start);// aggiunge il bottone start al PannelloConPallina
    add(stop);// aggiunge il bottone stop al PannelloConPallina
    add(colore);// aggiunge il bottone colore al PannelloConPallina
    add(tx);// aggiunge la casella di input tx
    add(ty);// aggiunge la casella di input ty

    // aggiunge l'ascoltatore di eventi agli oggetti di input (tasti e caselle)
    start.addActionListener(this);
    stop.addActionListener(this);
    colore.addActionListener(this);
    tx.getDocument().addDocumentListener(this);
    ty.getDocument().addDocumentListener(this);

  }
  public void insertUpdate(DocumentEvent e) {
  /* dx e dy sono gli incrementi orizzontale e verticali letti dalle caselle di input tx e ty.
     i metodi getText() ritornano un valore di tipo String per cui è necessario fare la 
     conversione in intero. 
  */ 
    dx=Integer.parseInt(tx.getText().trim()); 
    dy=Integer.parseInt(ty.getText().trim());
  }
  /* I due metodi di seguito non sono utilizzati, ma è necessario scriverli in quanto 
     la classe implementa l'intefaccia DocumentListener 
  */
  public void removeUpdate(DocumentEvent e){}
  public void changedUpdate(DocumentEvent e) {}

  public void actionPerformed(ActionEvent e){
    Object sorgente=e.getSource(); 
    if (sorgente==start) {
      /* è stato premuto il pulsante start
        x e y coordinate della pallina che inizialmente assumono valori random
        compresi tra 0 e W-1 e tra 0 e H-1 rispettivamente.
      */
      x=(int)(Math.random()*W);
      y=(int)(Math.random()*H);
      // System.out.println("x= "+x);
      moto=true; // variabile che stabilisce il moto: vedere l'uso all'interno di paintComponent
    } 
    else if (sorgente==stop) {
      moto=false;
      tx.setText("1"); // setta il valore delle caselle di input ad 1
      ty.setText("1");
    }
    else {
         /* è stato premuto il tasto colore
            le componenti di Color, r, g e b assumono valori random
            quindi con setBackground viene cambiato il colore di sfondo del PannelloConPallina
        */
         int r=(int)(Math.random()*256);
         int g=(int)(Math.random()*256);
         int b=(int)(Math.random()*256);
         setBackground(new Color(r,g,b)); 
    }
    repaint();
  }
  public void paintComponent(Graphics g){
    super.paintComponent(g);
	int ovalSize = 10;
    if (moto==true) {
      W=getSize().width; // ritorna la larghezza del PannelloConPallina
      H=getSize().height;// ritorna l'altezza del PannelloConPallina
      x=x+dx;// incrementa la x di una quantità pari a dx 
      y=y+dy;// incrementa la y di una quantità pari a dy

      if (x>W - ovalSize/2 || x<0) dx=-dx;
      if (y>H - ovalSize/2 || y<0) dy=-dy;
      g.fillOval(x,y,10,10);// disegna la pallina
      /* il metodo repaint() richiama di nuovo paintComponent.
         Si entra in un ciclo indefinito da cui è possibile uscire
         variando il valore della variabile moto da true a false.
         La variazione si ottiene premendo il tasto stop.
      */    
        
      repaint();
                
     }
     else {
       g.drawString("Pallina ferma",x,y);
     }
  }
}
public class TestPannelloConPallina {
  public static void main(String[] args){
    JFrame f=new JFrame("Test n.5");
    f.setSize(400,200);
    Container cp=f.getContentPane();
    cp.add(new PannelloConPallina());
    f.show(); 
  }
}         
