import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.awt.geom.Ellipse2D; import java.util.ArrayList; import java.util.Random; public class ThreadTestBall extends JFrame { private ArrayList<Ellipse2D> balls; private BallPanel ballPanel; public ThreadTestBall(){ balls = new ArrayList<Ellipse2D>(); ballPanel = new BallPanel(balls); add(ballPanel,BorderLayout.CENTER); JPanel ButtonPanel = new JPanel(); JButton startBt = new JButton("Start"); JButton stopBt = new JButton("Exit"); add(ButtonPanel,BorderLayout.SOUTH); ButtonPanel.add(startBt); ButtonPanel.add(stopBt); startBt.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ Thread t = new Thread(new Ball()); t.start(); } }); stopBt.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ System.exit(0); } }); setTitle("ThreadTestBall"); setSize(450,400); setLocation((int)((Toolkit.getDefaultToolkit().getScreenSize().getWidth()-300)/2), (int)((Toolkit.getDefaultToolkit().getScreenSize().getHeight()-400)/2)); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } public static void main(String[] args){ new ThreadTestBall(); } public class Ball implements Runnable{ private int dx=1; private int dy=1; private Ellipse2D ball; public Ball(){ double x = new Random().nextInt((int)ballPanel.getBounds().getMaxX()-20); double y = new Random().nextInt((int)ballPanel.getBounds().getMaxY()-20); ball = new Ellipse2D.Double(x,y,15,15); balls.add(ball); } public void run(){ for(int i=0;i<2000;i++){ move(); try { Thread.sleep(5); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } //System.out.println(Thread.currentThread().getName()+":"+i); ballPanel.repaint(); } } public void move(){ double x=ball.getX(); double y=ball.getY(); double maxx = ballPanel.getBounds().getMaxX(); double maxy = ballPanel.getBounds().getMaxY(); double minx = ballPanel.getBounds().getMinX(); double miny = ballPanel.getBounds().getMinY(); x+=dx; y+=dy; if (x>(maxx-15)) {x-=dx;dx=-dx;} if (x<(minx+15)) {x-=dx;dx=-dx;} if (y>(maxy-15)) {y-=dy;dy=-dy;} if (y<(miny+15)) {y-=dy;dy=-dy;} ball.setFrame(x, y, 15, 15); } } } class BallPanel extends JPanel { private ArrayList<Ellipse2D> balls; public BallPanel(ArrayList<Ellipse2D> balls){ this.balls = balls; } public void paintComponent(Graphics g){ super.paintComponent(g); Color[] color=new Color[]{Color.BLACK,Color.BLUE,Color.CYAN,Color.DARK_GRAY,Color.GREEN ,Color.LIGHT_GRAY,Color.MAGENTA,Color.ORANGE,Color.PINK,Color.RED}; Graphics2D g2 = (Graphics2D) g; g2.setPaint(color[new Random().nextInt(color.length)]); for(Ellipse2D ball:balls){ g2.fill(ball); } } }