// 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. import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Bouncer2 extends JApplet implements ActionListener { private JButton start, stop; private Ball ball; 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); } public void actionPerformed(ActionEvent event) { if (event.getSource() == start) { Graphics g = getGraphics(); ball = new Ball(g); ball.start(); } if (event.getSource() == stop) ball.pleaseStop(); } } class Ball extends Thread { private boolean keepGoing; private Graphics g; private int x = 7, xChange = 7; private int y = 0, yChange = 2; private int diameter = 10; private int rectLeftX = 0, rectRightX = 100; private int rectTopY = 0, rectBottomY = 100; public Ball(Graphics graphics) { g = graphics; keepGoing = true; } 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.red); g.fillOval (x, y, diameter, diameter); //onderstaande code zorgt voor een vertragingseffect anders gaat het balletje veel te snel try { Thread.sleep(50); // 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"); } } } }