Ciao, ho realizzato questo semplice programma di rimbalzo:

codice:
/**
 * Rimbalzi.java ver. 3.0
 * 12-05-2012
 * @author  D.Tremea - Feltre
 * Compito:
 * 		aggiungere altri pallini indipendenti tra di loro ...
 *
 */

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;


/*********************************************************************
 * una Finestra e' il contenitore dei vari componenti grafici
 *
 */
class Finestra extends JFrame
{
    Finestra(int x0, int y0, int larghezza, int altezza)
    {
        // settaggio caratteristiche della finestra
        setBounds(x0,y0,larghezza,altezza);
        setTitle(getClass().getName());
        setResizable(true);
        setVisible(true);

        // aggiunta di un ascoltatore per poter chiudere il frame
        addWindowListener(new WindowAdapter()
            {
                public void windowClosing(WindowEvent e)
                {
                   System.out.println("Fine dell'applicazione\n");
                   System.exit(0);  // chiusura dell'applicazione
                } // [m] windowClosing
            }
        );

    } // [c] Finestra

} // [class] Finestra


/*********************************************************************
 * un Pannello e' un componente su cui disegnare
 *
 */
class Pannello extends JPanel
{
    //#### (strutture) dati che memorizzano il disegno ####
    //private int x_mouse, y_mouse;  // ultimo clic del mouse
    private int b_mouse;           // ultimo bottone del mouse (16=sx, 4=dx)
    private String s = "";         // stringa scritta sul pannello
    private int x, y;
    private double a, V, vx, vy;
    final double gravity = 0.01;
    private int[] np = new int[10];
    private int[] X = new int[10];
    private int[] Y = new int[10];

    private static Font f = new Font("Times New Roman",Font.ITALIC,80);
    private Thread th;

    /**
     * costruttore
     */
    public Pannello(int x0, int y0, int lar, int alt)

    {
        // settaggi di configurazione
        setBounds(x0,y0,lar,alt);
        setBorder(new EtchedBorder());
        setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));

        //#### gestione degli eventi intercettati dal pannello ####

        // il pannello viene reso sensibile ai clic del mouse
        addMouseListener(new MouseAdapter()
            {
            //---- gestione del clic del mouse ----
            public void mouseClicked(MouseEvent e)
              {
              //x_mouse = e.getX();
              //y_mouse = e.getY();
              // cfr. InputEvent
              b_mouse = e.getModifiers();  // bottone del mouse (16=sx,4=dx)
              //s = "X="+x_mouse+" Y="+y_mouse+"     ";
              repaint(); // richiama paint()
              } // [m] mouseClicked

            //---- gestione dell'entrata del mouse ----
            public void mouseEntered(MouseEvent e)
              {
              setBackground(new Color(230,210,190));
              repaint(); // richiama paint()
              } // [m] mouseEntered

            //---- gestione dell'uscita del mouse ----
            public void mouseExited(MouseEvent e)
              {
              setBackground(new Color(230,210,190));
              repaint(); // richiama paint()
              } // [m] mouseExited

            }
        );

        // il pannello viene reso sensibile ai movimenti del mouse
        addMouseMotionListener(new MouseMotionAdapter()
            {
            //---- gestione del movimento del mouse ----
            public void mouseMoved(MouseEvent e)
              {
              //int x = e.getX();
              //int y = e.getY();
              //s = "x="+x+" x="+y+"    ";
              repaint(); // richiama paint()
              } // [m] mouseMoved
            }
        );

    } // [c] Pannello

    /**
     * esecuzione di un comando
     */
    public void esegui(String cmd)
    {
        System.out.println("Comando da eseguire = ["+cmd+"]");  // DA FINIRE
        if (cmd.equals("start"))
            attiva();
        else
      	  System.out.println("Comando errato = ["+cmd+"]");

    } // [m] esegui

    /**
     * ridisegno della parte grafica
     * (questo metodo viene richiamato automaticamente quando la finestra
     * deve essere ridisegnata (ad esempio quando viene sovrapposta
     * da un'altra)
     */

	public void paint(Graphics g)
    {
        super.paint(g);
        g.setColor(Color.red);
        	g.fillOval(x,y,15,15);
        g.setColor(Color.red);
        //g.drawLine(200,0,700,700);
        g.setColor(Color.blue);
        g.drawString(s,100,200);
    } // [m] paint

    public void inizio(int a, int V)
    {
    	x = 0; //(int)(Math.random()*700*380);
    	vx = Math.cos(a * 180 / 3.1415) * V;
    	y = 0; //(int)(Math.random()*700*380);
    	vy = Math.sin(a * 180 / 3.1415) * V;
    }

    //#### begin thread ####
    /**
     * - creazione del thread (new Thread())
     * - definizione del comportamento del thread (def. del metodo run())
     * - attivazione del thread (th.start())
     */
    public void attiva()
    {
       th = new Thread()
                {
                // ridefinizione del metodo run
                public void run()
                    {
                    	inizio(45,20); 		// inizio(angolo,Velocità);
                    	repaint();
                      while(true)  // ciclo infinito
                          {
                          	x+=vx;
                          	y+=vy;
                          	vy+=gravity;
                          	if(x>=695 || x<0)
                          		vx =- vx;
							if(y>=375 || y <0)
                				vy = -vy;
                          repaint();
                          try {
                              sleep(25);
                              }
                          catch (InterruptedException e)
                              {
                              System.out.println("thread interrotto");
                              return;
                              }
                          } // for
                    }
                };

        th.start();
    } // [m] attiva
    //#### end thread ####

} // [class] Pannello


/*********************************************************************
 * un Campo e' una finestra testo sulla quale si puo' scrivere
 *
 */
class Campo extends JTextField
{
    private static String stringaletta = "";

    /**
     * costruttore
     * Parametri:
     *   lar,alt : larghezza ed altezza
     */
    Campo(int x0, int y0, int lar, int alt)
    {
        setBounds(x0,y0,lar,alt);
        setFont(new Font("Monospaced",Font.PLAIN,11));
        setEditable(true);   // attiva il cursore
        setVisible(true);    // rende visibile

        // intercettamento dell'evento "tasto INVIO"
        addActionListener
            (new ActionListener()
                {
                // quando si batte INVIO stringaletta prende il testo
                public void actionPerformed(ActionEvent e)
                    {
                    stringaletta = "";
                    stringaletta = getText();
                    setText(""); // serve?
                    }
                }
            );

    }  // [c] Campo

    /**
     * lettura di una stringa
     * msg rappresenta la stringa iniziale proposta
     *
     */
    public String leggiStringa(String msg)
    {
        stringaletta = "";
        requestFocus();    // non attiva comunque il cursore
        setEditable(true);
        setText(msg);  // messaggio guida dell'input
        setCaretPosition(msg.length()); // 0 e' all'inizio
        while (stringaletta.equals(""))
            ;
        String rets = stringaletta;
        stringaletta = "";
        setEditable(false);
        return rets;
    } // [m] leggiStringa

    /**
     * lettura di una stringa
     *
     */
    public String leggiStringa()
    {
        return leggiStringa("");
    } // [m] leggiStringa

    /**
     * scrittura di una stringa sul campo testo (come messaggio)
     *
     */
    public void scriviStringa(String s)
    {
        setText(s);
    } // [m] scriviStringa

} // [class] Campo


class Progetto
{
    public static void main(String[] args)
    {
        // creazione finestra e componenti
        Finestra f = new Finestra(10,20,800,550);  // contenitore top-level
        Pannello p = new Pannello(50,50,700,380);  // pannello su cui disegnare
        Campo c    = new Campo(50,450,700,20);     // campo comandi

        // settaggio colore dei componenti
        f.setBackground(new Color(200,100,100));
        f.setTitle("Rimbalzi - ver.3.0");
        p.setBackground(new Color(230,210,190));
        c.setBackground(new Color(210,230,250));

        // assemblaggio del sistema grafico: Finestra+Pannello+Campo
        f.setLayout(null);  // altrimenti il pannello invade tutta la finestra
        f.add(p);           // attacco del pannello alla finestra
        f.add(c);           // attacco del campo alla finestra

        // attivazione del thread associato al pannello
        //p.attiva();

        // visualizzazione
        f.setVisible(true);
        p.repaint();

        // gestione comandi scritti sul campo testo
        String s=null;
        boolean b = false;

        do  {
              s = c.leggiStringa("");
              b = s.equals("fine");
              p.esegui(s);
            } while (b==false);

    } // [m] main

} // [class] Progetto
Quello che volevo realizzare adesso è: aggiungere altri pallini tutti tra di loro indipendenti, ma come?