Hello,
a) I have a Ball Object which implements the Runnable interface and traces the various positions of a ball.
b) I then have a Ball_Bounce JPanel inside a JFrame which creates two instances of the Ball object and then paints them to the JPanel.
As per my understanding, when the main() program in Ball_Bounce.java is started, there a total of three threads running in this program, one for each ball and one for the main(). What I cannot understand is whenever the balls collide, I end up getting the "Collision" message twice even though the collision is checked only in the main() thread.
I would be grateful for an explanation for why I am getting the collision message outputted twice.
Thank you!
[#]public class Ball implements Runnable { private boolean xUp, yUp, xUp1, yUp1; private int x, y, xDx, yDy; private final int MAX_X = 500, MAX_Y = 500; private boolean flag = true; private static Thread ball; public Ball(int xCoordinate, int yCoordinate) { x = xCoordinate; y = yCoordinate; xUp = false; yUp = false; xDx = 1; yDy = 1; ball = new Thread(this); ball.start(); } public int getX() { return x; } public int getY() { return y; } public void run() { while ( flag == true ) { try { ball.sleep(12); } catch ( InterruptedException exception ) { System.err.println( exception.toString() ); } if ( y <= 0 ) { yUp = true; yDy = ( int ) ( Math.random() * 5 + 2 ); } else if ( y >= MAX_Y - 50 ) { yDy = ( int ) ( Math.random() * 5 + 2 ); yUp = false; } if ( x <= 0 ) { xUp = true; xDx = ( int ) ( Math.random() * 5 + 2 ); } else if ( x >= MAX_X - 50 ) { xUp = false; xDx = ( int ) ( Math.random() * 5 + 2 ); } if ( xUp == true ) x += xDx; else x -= xDx; if ( yUp == true ) y += yDy; else y -= yDy; } } }[/#]---------------------------------------------------------------------------------------------------------------------------------------------- [#]import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.lang.Thread; public class Ball_Bounce extends JPanel implements ActionListener { private Ball ball[] = new Ball[2]; private Timer timer; private int count = 0; public Ball_Bounce() { timer = new Timer (12, this); timer.start(); ball[0] = new Ball( 300, 250); ball[1] = new Ball (450, 450); } public void actionPerformed (ActionEvent e) { repaint(); } public void paintComponent( Graphics g ) { super.paintComponent(g); for (int i = 0; i < 2; i++) { if (i == 0) { Color c = Color.RED; g.setColor (c); g.fillOval( ball[i].getX(), ball[i].getY(), 50, 50 ); } if ( i == 1) { Color c = Color.BLUE; g.setColor (c); g.fillOval( ball[i].getX(), ball[i].getY(), 50, 50 ); } } if (Math.abs(ball[0].getX()-ball[1].getX()) <= 50 && Math.abs(ball[0].getY()-ball[1].getY()) <= 50) { JOptionPane.showMessageDialog (null, "Collision"); } } public static void main (String args []) { JFrame f = new JFrame ("Bouncing Ball"); Ball_Bounce b = new Ball_Bounce (); f.add (b); f.setSize (500,500); f.setVisible(true); } }[/#]