// Dit programma maakt gebruik van twee threads: een voor de gebruikersinterface (knoppen start en stop) // en een andere voor het tekenen van de stuiterende bal. // De tread voor de gebruikersinterface brengt de thread voor de stuiterende bal op gang. // **************** // Edited By: Tim Eeckhaut // Date: 3-3-2004 // Changes: // * kan draaien als app // * application draait fullscreen, applet op max grootte uit html-tag // * ballen in vector, zodat ze allemaal gestopt kunnen worden // * exception die kon optreden bij geen geactiveerde bal weggewerkt // * variabele kleur, diameter en snelheid om mooi te laten zien dat alles apart in het geheugen zit // Edited By: Tim Eeckhaut // Date: 6-3-2004 // Changes: // * variabele richting en startpunt toegevoegd import java.awt.*; import java.util.*; import java.awt.event.*; import javax.swing.*; class Bouncer extends JApplet implements ActionListener { private JButton start, stop; private Vector balls; public void init() { Container container = getContentPane(); container.setLayout(new FlowLayout()); start = new JButton("Start"); container.add(start); start.addActionListener(this); stop = new JButton("Stop"); container.add(stop); stop.addActionListener(this); balls = new Vector(); // ballen in een vector stoppen } public void actionPerformed(ActionEvent event) { if (event.getSource() == start) { Ball ball = new Ball(getGraphics(), getWidth(), getHeight()); // breedte en hoogte van applet meegeven ball.start(); balls.add(ball); } if (event.getSource() == stop && balls.size() > 0) // min 1 rollende ball { ((Ball)balls.elementAt(0)).pleaseStop(); // 'eerste' bal wordt gestopt balls.removeElementAt(0); // bal wegdoen, aangezien hij toch nooit kan resumen } } } class BounceApp extends JFrame { public BounceApp() { Container c = getContentPane(); JApplet applet = new Bouncer(); applet.init(); applet.start(); c.add(applet); pack(); // componenten goed ordenen setSize(getToolkit().getScreenSize()); // dimension van systeem opvragen setVisible(true); } public static void main(String[] args) { BounceApp app = new BounceApp(); app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } class Ball extends Thread { private boolean keepGoing; private Graphics g; private Color color; private int x, xChange; private int y, yChange; private int rectLeftX = 0, rectRightX; private int rectTopY = 0, rectBottomY; private int diameter, speed; public Ball(Graphics graphics, int width, int height) { g = graphics; keepGoing = true; rectRightX = width; // fullscreen werken rectBottomY = height; // fullscreen werken color = new Color((float)Math.random(), (float)Math.random(), (float)Math.random()); diameter = (int)(Math.random() * 11) + 10; // random diameter tussen 10 en 20 speed = (int)(Math.random() * 51) + 50; xChange = (int)(Math.random() * 11) + 1 * (Math.round((float)Math.random()) * -1); yChange = (int)(Math.random() * 11) + 1 * (Math.round((float)Math.random()) * -1); x = (int)(Math.random() * rectRightX); y = (int)(Math.random() * rectBottomY); } public void pleaseStop() { keepGoing = false; } public void run() // deze methode laat de thread draaien { g.drawRect(rectLeftX, rectTopY, rectRightX - rectLeftX, rectBottomY - rectTopY); while (keepGoing) { g.setColor(Color.white); g.fillOval (x, y, diameter, diameter); if (x + xChange <= rectLeftX) xChange = -xChange; if (x + xChange >= rectRightX) xChange = -xChange; if (y + yChange <= rectTopY) yChange = -yChange; if (y + yChange >= rectBottomY) yChange = -yChange; x = x + xChange; y = y + yChange; g.setColor(color); g.fillOval (x, y, diameter, diameter); //onderstaande code zorgt voor een vertragingseffect anders gaat het balletje veel te snel try { Thread.sleep(speed); // de thread van de stuiterende bal slaapt 50 ms // hierdoor krijgt de thread van de gebruikersinterface // wat processortijd om te draaien } catch (InterruptedException e) { System.err.println("sleep exception"); } } } }