import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; public class SnowStorm extends JFrame { private Cloud cloud = new Cloud(); public static void main(String[] args) { new SnowStorm(); } public SnowStorm() { P p = new P(); getContentPane().add(p); addWindowListener(new L1()); addKeyListener(new L2()); setSize(500, 500); show(); p.requestFocus(); } class L1 extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } } class L2 extends KeyAdapter { public void keyPressed(KeyEvent e) { if(e.getKeyChar() == '1') cloud.stopGenerator(); if(e.getKeyChar() == '2') cloud.startGenerator(); } } class P extends JPanel implements Runnable { Thread thread = new Thread(this); public P() { setBackground(Color.black); setForeground(Color.white); thread.start(); } public void run() { while(true) { try { thread.sleep(100); } catch(Exception e) { } repaint(); } } public void paintComponent(Graphics g) { super.paintComponent(g); setTitle("Växelverka med 1 och 2 - antal snöflingor/trådar: " + new Integer(cloud.getContent().size()).toString()); cloud.paintComponent(g); } } } class Cloud implements Runnable { private Vector content = new Vector(); private boolean generate = true; private Random rnd = new Random(); private Thread thread = new Thread(this); public Cloud() { thread.start(); } public void stopGenerator() { generate = false; } public void startGenerator() { generate = true; } public Vector getContent() { return content; } public void paintComponent(Graphics g) { for(int i = 0; i < content.size(); i++) { ((Snow)content.elementAt(i)).paintComponent(g); } } public void run() { while(true) { int sleepTime = rnd.nextInt(200) + 10; try { thread.sleep(sleepTime); } catch(Exception e) { } if(generate) content.add(new Snow(this)); } } } class Snow extends Thread { private static Random rnd = new Random(); private Cloud cloud; private int x = rnd.nextInt(492), y = 0; private int size = rnd.nextInt(5) + 1; private Color color = Color.white; public Snow(Cloud cloud) { this.cloud = cloud; start(); } public Color getColor() { return color; } private int getNewX() { if(rnd.nextBoolean()) { x = x + rnd.nextInt(3); if(x > 492) x = 492; } else { x = x - rnd.nextInt(3); if(x < 0) x = 0; } return x; } public void paintComponent(Graphics g) { g.setColor(color); g.fillOval(x, y, size, size); } public void run() { while(y != 473) { // Slumpmässig fart beroende på size - 3D int sleepTime = rnd.nextInt(700/(size*2)) + 1; try { sleep(sleepTime); } catch(Exception e) { } x = getNewX(); y = y + 1; if(rnd.nextInt(100) < 10) color = Color.white; else color = Color.gray; } cloud.getContent().remove(this); } }