import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Canicas extends JFrame {
    private AreaDibujo miAreaDibujo;
    private JButton miBoton1;
    private JButton miBoton2;
    List <Canica> misCanicas;
    Random r;
    MueveCanicas salto;
    
    public Canicas(){      
        JPanel AreaControl = new JPanel(new GridLayout(2, 1));
        miBoton1 = new JButton("Agregar");
        miBoton2 = new JButton("Quitar");
        
        miBoton1.addActionListener(new botonAgrega());
        miBoton2.addActionListener(new botonQuitar());
        
        r = new Random();        
        AreaControl.add(miBoton1);
        AreaControl.add(miBoton2);
                
        miAreaDibujo = new AreaDibujo();
        misCanicas = new ArrayList();
        
        this.add(AreaControl, BorderLayout.WEST);    
        this.add(miAreaDibujo,BorderLayout.EAST);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        pack();
        setVisible(true);
        salto = new MueveCanicas();
        salto.start();
    }      
    
    private class AreaDibujo extends JPanel{
        public AreaDibujo(){
            this.setBackground(Color.WHITE);
            this.setPreferredSize(new Dimension(600, 600)); 
        }
        
        @Override
        public void paint(Graphics g){
            super.paint(g);
            
            if(!misCanicas.isEmpty()) {
                for(Canica a : misCanicas) {
                    a.dibuja(g);
                }
            }
        }        
    }
    
    private class Canica {
        int x0, y0;
        
        public Canica(int unaX, int unaY) {
            x0 = unaX;
            y0 = unaY;
        }
        
         public void mueve(int dx, int dy) {
             int aux;
             
             aux = x0+dx;
             if(aux >=0 && aux <=600)
                 this.x0 = aux;
        
             aux = y0+dy;
             if(aux >=0 && aux <=600)
                 this.y0 = aux;
        }
         
         public void dibuja(Graphics g) {
            g.setColor(Color.BLACK);
            g.fillOval(x0, y0, 10, 10);
        }   
    }
    
    private class botonAgrega implements ActionListener{

        public void actionPerformed(ActionEvent arg0) {
            int x = Math.abs(r.nextInt())%600;
            int y = Math.abs(r.nextInt())%600;
            misCanicas.add(new Canica(x, y));
            repaint();
        }
    }  
    
    private class botonQuitar implements ActionListener{

        public void actionPerformed(ActionEvent arg0) {
            misCanicas.remove(0);
            repaint();
        }
    } 
    private class MueveCanicas extends Thread {
        
        @Override
        public void run(){
            while(true) {
               for(Canica a : misCanicas) 
                    a.mueve(r.nextInt()%2, r.nextInt()%2);
               repaint();
                try {
                    sleep(10);
                } catch (InterruptedException ex) {
                    Logger.getLogger(EjemploHilo.class.getName()).log(Level.SEVERE, null, ex);
                }
            }         
        }
    }
     
    static public void main(String args[]) {
        new Canicas();
    }
}
