import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.awt.geom.*;
public class BallGame
{
  public static void main(String[]args)
  {
    Myframe frame=new Myframe();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.show();  
  }
  
}
class Myframe extends JFrame
{
  public Myframe()
  {
   this.setTitle("A Ball Game");
   this.setLocation(200,200);
   /*(this.setResizable(false);*/
   this.setSize(XSize,YSize);
   Container ContentPane=getContentPane();
   Mypanel panel=new Mypanel();
   ContentPane.add(panel,BorderLayout.SOUTH);
  }
  private int XSize=400;
  private int YSize=400;
}
class Mypanel extends JPanel
{
  public Mypanel()
  {
    JButton Startbtn=new JButton("Start");
    Startbtn.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent evt)
      {
        Ball m=new Ball(canvas);
        BallThread thread=new BallThread(m);
        addball(m);
        
        
             
      }
    }
    
    );
   JButton Closebtn=new JButton("Close");
    Closebtn.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent evt)
      {
        System.exit(0);
      }
    }
    
    );
  this.add(Startbtn);
  this.add(Closebtn);
  }
  public void addball(Ball a)
  {
    canvas.add(a);
  }
  public void add(Ball b)
  {
    balls.add(b);
    
  }
  public void paintComponent(Graphics g)
  {
    super.paintComponent(g);
    Graphics2D g2=(Graphics2D)g;
    for (int i=0;i<balls.size();i++)
    {
      Ball b=(Ball)balls.get(i);
      b.draw(g2);
    }
    
  }
  
  private int i;
  private ArrayList balls=new ArrayList();
  private Mypanel canvas;
}
class BallThread extends Thread
{
  public BallThread(Ball aball)
  {
    b=aball;
  }
  public void run()
  {
    try
    {
      for(i=0;i<=1000;i++)
      {
        b.move();
        Thread.sleep(5);
      }    
    }
    catch(InterruptedException exception)
    {
      
    }   
  }
  private Ball b;
  private int i;
}
class Ball
{
  public Ball(Component c)
 
  {
    canvas=c;
    
    
  }
  
  public void draw(Graphics2D g2)
  {
    g2.fill(new Ellipse2D.Double(x,y,XSIZE,YSIZE));
  }  public void move()
  {
   x+=dx;
    y+=dy;
    if(x<0)
    {
      x=0;dx=-dx;
    }
    if(x+XSIZE>=canvas.getWidth())
    {
      x=canvas.getWidth()-XSIZE;
      dx=-dx;
    }
    if(y<0)
    {
      y=0;dy=-dy;
    }
    if(y+YSIZE>=canvas.getWidth())
    {
      y=canvas.getWidth()-YSIZE;
      dy=-dy;
    }
    canvas.paint(canvas.getGraphics());
  }
  private Component canvas;
  private static final int XSIZE=15; 
  private static final int YSIZE=15;
  private int x=0;
  private int y=0;
  private int dx=2;
  private int dy=2;

为什么得不到预期的效果