Sto cercando di simulare il movimento di un punto nel piano mediante l'uso di Thread, ma questi non si muove!!

codice:
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
import javax.swing.undo.*;
import java.util.*;
import java.text.NumberFormat;
import java.util.Locale;
import java.lang.*;

public class BallTest {

  public static void main(String argv[]) {
		
	ballFrame frame = new ballFrame();
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	//quando viene chiuso il frame si esce dal programma
	frame.show();	//Visualizza la finestra
  }//main
}//BallTest

/**
	Crea un frame di ampiezza WIDTH ed altezza HEIGHT, acquisendo la risoluzione video
	lo presenta a partire ad 1/4 delle sue coordinate.
*/
class ballFrame extends JFrame{

	public ballFrame(){
		//prende le dimensioni dello schermo
		
		Toolkit kit = Toolkit.getDefaultToolkit();
		//restituisce le dimensioni dello schermo del client come oggetto Dimension
		Dimension screenSize = kit.getScreenSize();
		int screenHeight = screenSize.height;	//ampiezza dello schermo
		int screenWidth = screenSize.width;
		setSize(WIDTH, HEIGHT);	//Inposta la grandezza del frame
		setLocation(screenWidth/4, screenHeight/4);	//fa partire il frame da 1/4 del video
		setResizable(true);	//imposta che il frame non può essere ridimensionato
		Image img = kit.getImage("grafo.gif"); //imposta l'icona ed il titolo
		setIconImage(img);
		setTitle("BALLL");
		
		//aggiunge un pannello al frame
		Container contentPane = getContentPane();
		ballPanel panel = new ballPanel();
		contentPane.add(panel);
		
	}//clumpFrame
	
	public static final int WIDTH = 500;	//Ampiezza Frame
	public static final int HEIGHT = 350;	//Altezza Frame
	
}//ballFrame


class ballPanel extends JPanel implements Runnable {
  Thread runner;
  int x,y;

  public void start() {
    if( runner==null ) {
      runner=new Thread(this);
      runner.start();
    }
  }

  public void stop() {
    if( runner!=null ) {
      runner.stop();
      runner=null;
    }
  }

  public void run() {
    int i=0;

    for(x=0; x<=255; x++) {
      y=x;

      repaint();
      try { Thread.sleep(100); }
      catch( InterruptedException e ) { }
    }
  }

  public void paint(Graphics g) {
    g.fillOval(x,y,20,20);
  }
}