Le déplacement de la Balle en Java

quand je le lance, le repeindre ne fonctionne pas. La fenêtre s'ouvre et reste pour 2000ms et puis se ferme. autre chose, si je retire le Système.exit(0); déclaration, il n'est pas ferme, mais le peint ballon n'est pas toujours présente.

BallWorld.java

import java.awt.*;
import javax.swing.JFrame;

public class BallWorld extends Frame {

public static void main(String[] args) {

    BallWorld bw1 = new BallWorld(Color.red);
    bw1.show();


}

public static final int framewidth = 600;
public static final int frameheight = 400;

private Ball aball;
private int counter = 0;

private BallWorld(Color ballColor){

    setSize(framewidth,frameheight);
    setTitle("Ball World");

    aball = new Ball(10, 15, 5);
    aball.setColor(ballColor);
    aball.setMotion(3.0, 6.0);

}


public void paint(Graphics g){

    aball.paint1(g);

    aball.move();


    if((aball.x() < 0) || (aball.x() > framewidth))

        aball.setMotion(-aball.xMotion(), aball.yMotion());

    if((aball.yMotion() < 0) || (aball.yMotion() > frameheight))

        aball.setMotion(aball.xMotion(),-aball.yMotion());

    //redraw  the frame

    counter = counter + 1;

    if(counter < 2000)
    repaint();
    else
        System.exit(0); 
}   
}

l'autre classe est

Ball.java

import java.awt.*;
import java.awt.Rectangle;
public class Ball {
protected Rectangle location;
protected double dx,dy;
protected Color color;
public Ball(int x,int y, int r){
location =new Rectangle(x-r, y-r, 2*r, 2*r);
dx=0;   //initially no motion
dy=0;
color = Color.blue;
}
//Setters
public void  setColor(Color newColor){
color = newColor;
}
public void setMotion(double new_dx, double new_dy){
dx = new_dx;
dy = new_dy;
}
//Getters
public int radius(){    
return location.width/2;
}
public int x(){
return location.x + radius();
}
public int y(){
return location.y + radius();
}
public double xMotion(){
return dx;
}
public double yMotion(){    
return dy;
}
public Rectangle region(){
return location;
}
//Methods that change attributes of the ball
public void moveTo(int x, int y){
location.setLocation(x, y);
}
public void move(){
location.translate((int) dx,(int) dy);
}
public void paint1(Graphics g){
g.setColor(color);
g.fillOval(location.x, location.y,location.width,location.height);
}
}