import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; public class Space extends JFrame { int xLim = 500, yLim = 500; Vector balls = new Vector(); public static void main(String[] args) { new Space(); } Space() { setSize(xLim, yLim); setVisible(true); addKeyListener(new L()); } synchronized void addBall() { balls.add(new Ball()); setTitle("Antal bollar: " + balls.size()); } synchronized void removeBall(Ball ball) { balls.remove(ball); setTitle("Antal bollar: " + balls.size()); } synchronized void pauseBalls() { for(int i = 0; i < balls.size(); i++) { if(((Ball)balls.elementAt(i)).active) { ((Ball)balls.elementAt(i)).active = false; } else { ((Ball)balls.elementAt(i)).active = true; } } } class L extends KeyAdapter { public void keyPressed(KeyEvent e) { if(e.getKeyChar() == '+') addBall(); if(e.getKeyChar() == 'p') pauseBalls(); } } class Ball extends Thread { boolean alive = true, active = true; Random rnd = new Random(); int eMax= 500, e = rnd.nextInt(eMax), rMax = xLim / 2, r = rnd.nextInt(rMax), dr = 1, x = xLim / 2 - r / 2, y = yLim / 2 - r / 2, dx, dy, dMax = 3, ddx = 1, ddy = 1, gr = 5; Ball() { if(rnd.nextBoolean()) ddx = -1; dx = rnd.nextInt(dMax) * ddx; if(rnd.nextBoolean()) ddy = -1; dy = rnd.nextInt(dMax) * ddy; start(); } public void run() { while(alive) { while(active) { Graphics g = getGraphics(); g.setColor(getBackground()); g.fillOval(x, y, r, r); if((x <= 0) || (x >= xLim - r)) { dx *= -1; r -= dr * eMax / e; } if((y <= 30) || (y >= yLim - r)) { dy *= -1; r -= dr * eMax / e; } if((r <= 0) || (e <= 0)) { active = false; alive = false; removeBall(this); } else { e -= 1; int rChange = dr * eMax / e; r -= rChange; if(r < 0 ) r = 0; x += dx + rChange / 2; y += dy + rChange / 2; y += gr * (eMax - e) / eMax; g.setColor(new Color(255, 255, 255 - 255 * r / rMax)); g.fillOval(x, y, r, r); } try { sleep(500000 / (r * r)); } catch(Exception e) {} } try { sleep(100); } catch(Exception e) {} } } } }