import java.awt.*; import java.awt.event.*; import java.util.Random; import javax.swing.*; public class ShapesApp extends JPanel implements ActionListener { CircleFieldPanel jp; Timer timer; int speed=50;//msecs public ShapesApp() { super(new BorderLayout()); Circle c1 = new RandomXYCircle(300,300,10,Color.red); Circle c2 = new RandomAngleCircle(300,300,10,Color.blue); jp = new CircleFieldPanel(c1, c2); jp.setBackground(Color.white); add(jp,BorderLayout.CENTER); timer = new javax.swing.Timer(speed,this); } public static void main (String [] args) { ShapesApp a = new ShapesApp(); JFrame frame = new JFrame(); frame.add(a); final int FRAME_WIDTH = 600; final int FRAME_HEIGHT = 600; frame.setSize(FRAME_WIDTH, FRAME_HEIGHT); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); a.start(); } public void start() { timer.start(); } public void actionPerformed(ActionEvent e) { jp.repaint(); } } class CircleFieldPanel extends JPanel { CircleFieldPanel(Circle c1, Circle c2) { this.c1 = c1; this.c2 = c2; } protected void paintComponent(Graphics g) { super.paintComponent(g); c1.draw(g, this.getSize()); c2.draw(g, this.getSize()); } private Circle c1; private Circle c2; }; abstract class Circle { int x; int y; int d; Color c; int queueSz=10; int tidx=0; int [] X = new int[queueSz]; int [] Y = new int[queueSz]; public Circle(int x, int y, int d, Color c) { this.x = x; this.y = y; this.d = d; this.c = c; for (int i=0;i=0) { g.setColor(c); g.fillOval(X[i],Y[i],d,d); } } tidx++; } protected abstract void updateXY(Dimension dim); } class RandomXYCircle extends Circle { Random r; public RandomXYCircle(int x, int y, int d, Color c) { super(x,y,d,c); r = new Random(); } protected void updateXY(Dimension dim) { y += 2 * (r.nextInt(d+1)-d/2); x += 2 * (r.nextInt(d+1)-d/2); x = Math.max(0,Math.min(x,dim.width)); y = Math.max(0,Math.min(y,dim.height)); } } class RandomAngleCircle extends Circle { Random r; double angle; public RandomAngleCircle(int x, int y, int d, Color c) { super(x,y,d,c); r = new Random(); angle = r.nextDouble() * Math.PI *2; } protected void updateXY(Dimension dim) { angle += (r.nextDouble()-.5); //System.out.println("Angle " + angle); y += Math.sin(angle) * d/2; x += Math.cos(angle) * d/2; x = Math.max(0,Math.min(x,dim.width)); y = Math.max(0,Math.min(y,dim.height)); } }