Bouncing balls collision

I am creating a program that has two balls which produce a sound when bouncing off the walls and each other. I am having trouble when they collide with each other, as my value for when they hit each other does not seem to be working. Here is my source code :
import java.applet.Applet;
import java.awt.Graphics;
import java.awt.*;
import java.applet.AudioClip;
import java.awt.event. *;
public class BallBouncing extends Applet implements Runnable {
        int x_pos = 20;
        int y_pos = 100;
        int x_speed = 1;
        int y_speed = 1;
        int x1_pos = 70;
        int y1_pos = 130;
        int x1_speed = 1;
        int y1_speed = 1;
        int appletsize_x = 300;
        int appletsize_y = 200;
        int radius = 20;
        int pos = (x_pos - x1_pos)*(x_pos - x1_pos) + (y_pos - y1_pos)*(y_pos - y1_pos);
        double pos1 = Math.sqrt(pos);       
        public AudioClip sound1, sound2;       
        Thread t;
        Button b1 = new Button("Reverse Direction");
        public void init() {
            b1.addActionListener(new B1());           
            add(b1);
        class B1 implements ActionListener {
        public void actionPerformed(ActionEvent e) {
        x_speed = +3;
        y_speed = -3;
        public void start() {
                        t = new Thread(this);
                        t.start();
        public void stop() {
        public void paint(Graphics g) {
                g.setColor (Color.blue);
                g.fillOval(x_pos - radius, y_pos - radius, 2 * radius, 2 * radius);
                g.fillOval(x1_pos - radius, y1_pos - radius, 2 * radius, 2 * radius);
        public void run() {
                sound1 = getAudioClip( getDocumentBase(), "Audio1.au" );
                sound2 = getAudioClip( getDocumentBase(), "Audio2.au" );
                while (true) {
                    try {
                        Thread.sleep(20);
                    } catch (InterruptedException e) {}
                    if (x_pos > appletsize_x - radius)
                        x_speed = -3;
                        sound2.play();
                    else if (x_pos < radius)
                        x_speed = +3;
                        sound2.play();
                    else if (y_pos > appletsize_y - radius)
                        y_speed = -3;
                        sound2.play();
                    else if (y_pos < radius)
                        y_speed = +3;
                        sound2.play();
                    else if (x1_pos > appletsize_x - radius)
                        x1_speed = -3;
                        sound2.play();
                    else if (x1_pos < radius)
                        x1_speed = +3;
                        sound2.play();
                    else if (y1_pos > appletsize_y - radius)
                        y1_speed = -3;
                        sound2.play();
                    else if (y1_pos < radius)
                        y1_speed = +3;
                        sound2.play();
                    else if (pos1 < 40)
                        x_speed = -3;
                        x1_speed = +3;
                        y_speed = -3;
                        y1_speed = +3;
                        sound1.play();
                        x_pos += x_speed;
                        y_pos += y_speed;
                        x1_pos += x1_speed;
                        y1_pos += y1_speed;
                        repaint();
}Any help would be appreciated, thanks.

Hi, here is a solution to your problem I hope. I have also included some extra features and brought your code up to a higher standard in terms of java conventions (however the {} on the next line is my convention, from C# :p).
A few things:
- For the balls deflecting at the proper angles then you will need to learn vector maths and I am afraid that my knowledge of that is rather sketchy (still 1st year uni student, more on that next year :p)
- I used Graphics2D purely because I was lazy so I could write g2.draw(bounds); instead of using g.drawRect(x, y, height, width); - both methods give the same result
- You will need to look up how to do drawing in applets to remove that flickering, I'm not sure if you do the same thing as normal swing/awt components (ie double buffering), as applets aren't my strong point.
- I removed the button because it was unneccessary, it will take you 60 seconds to add it back in if you want.
- You really REALLY should write a 'Ball' class and make some Ball objects instead of having separate variables for each ball. I will leave that up to you :)
- I STRONGLY recommend the use of comments throughout any program you use, not because of convention but because it not only helps other developers to understand your code and what it does, but also to refresh your memory when you come back from a break and try to keep writing. (trust me, do not underestimate the power of comments!) . I have put a few in to show you what they should look like; they should be brief and concise, explain what a section of code does, and how it does it.
- Enjoy!
package sunforum_bounceball;
import java.applet.*;
import java.awt.*;
public class BallBouncing extends Applet implements Runnable
     private static final long serialVersionUID = 1L;
     // ball 1
     private int x1_pos;
     private int y1_pos;
     private int x1_speed;
     private int y1_speed;
     private int b1_radius;
     // ball 2
     private int x2_pos;
     private int y2_pos;
     private int x2_speed;
     private int y2_speed;
     private int b2_radius;
     // other variables
     private Rectangle bounds;
     private Dimension appletSize;
     private boolean hasCollision;
     private boolean debugCollisionTesting;
     private AudioClip sound1, sound2;       
     private Thread t;
     public BallBouncing()
          // ball 1
          x1_pos = 100;
          y1_pos = 109;
          x1_speed = 2;
          y1_speed = 1;
          b1_radius = 40;
          // ball 2
          x2_pos = 100;
          y2_pos = 237;
          x2_speed = 1;
          y2_speed = 1;
          b2_radius = 20;
          hasCollision = false;
          // This is just for your help; turn this on to disable the balls changing direction when they collide.
          // This will enable you to check that when the balls are touching, we are detecting it.
          debugCollisionTesting = false;
          // Variables for the size of the applet and the bounding rectangle for the balls.
          appletSize = new Dimension(400, 400);
          bounds = new Rectangle(0, 0, 400, 400);
     public void start()
          t = new Thread(this);
          t.start();
     public void stop()
     public void paint(Graphics g)
          Graphics2D g2 = (Graphics2D)g;
          if (hasCollision)
          { g2.setColor(Color.RED); }
          else
          { g2.setColor(Color.BLUE); }
          g2.fillOval(x1_pos - b1_radius, y1_pos - b1_radius, 2 * b1_radius, 2 * b1_radius);
          g2.fillOval(x2_pos - b2_radius, y2_pos - b2_radius, 2 * b2_radius, 2 * b2_radius);
          g2.setColor(Color.BLACK);
          g2.draw(bounds);
     public void run()
          // +1 just so we can see the border of the collision area. Try taking out the +1's and see what happens.
          this.setSize(appletSize.width + 1, appletSize.height + 1);
          sound1 = getAudioClip( getDocumentBase(), "Audio1.au" );
          sound2 = getAudioClip( getDocumentBase(), "Audio2.au" );
          // Used to hold the distance between the balls.
          double p;
          while (true)
               try
               { Thread.sleep(20); }
               catch (InterruptedException e)
               // ball 1 x coordinate.
               if (x1_pos > (bounds.x + bounds.width) - b1_radius || x1_pos < bounds.x + b1_radius)
                    x1_speed *= -1;
                    sound2.play();
               // ball 1 y coordinate.
               else if (y1_pos > (bounds.y + bounds.height) - b1_radius || y1_pos < bounds.y + b1_radius)
                    y1_speed *= -1;
                    sound2.play();
               // ball 2 x coordinate.
               if (x2_pos > (bounds.x + bounds.width) - b2_radius || x2_pos < bounds.x + b2_radius)
                    x2_speed *= -1;
                    sound2.play();
               // ball 2 y coordinate.
               else if (y2_pos > (bounds.y + bounds.height) - b2_radius || y2_pos < bounds.y + b2_radius)
                    y2_speed *= -1;
                    sound2.play();
               // Checks the distance between the balls. If it is less than the sum of the radii, then they are colliding.
               p = Math.sqrt(Math.pow((x1_pos - x2_pos), 2) + Math.pow((y1_pos - y2_pos), 2));
               if (p < (b1_radius + b2_radius))
                    // To check there is a collision. Useful for debugging.
                    // System.out.println("Collision");
                    hasCollision = true;
                    // see declaration for details
                    if (!debugCollisionTesting)
                         x1_speed *= -1;
                         x2_speed *= -1;
                         y1_speed *= -1;
                         y2_speed *= -1;
                         sound1.play();
               else
               { hasCollision = false; }
               // Move both balls.
               x1_pos += x1_speed;
               y1_pos += y1_speed;
               x2_pos += x2_speed;
               y2_pos += y2_speed;
               // Repaint the scene
               repaint();
}Cheers
Sutasman
Edited by: Sutasman on Dec 6, 2009 1:17 AM

Similar Messages

  • Java Bouncing Balls Threads problem?

    Hello,
    I am working on a homework assignment to represent a java applet with some bouncing balls inside. So far so good. The balls bounce and behave as they are supposed. The only thing is that I want to make 2 buttons, Start and Stop (this is not part of the assignment, but my free will to provide some extra stuff :) ) . I am implementing Runnable for the animation and ActionListener for the buttons. I did research on threading, but somehow I am still not getting quite the result I want. The applet is not displaying my buttons (I guess I am not implementing them correctly) and I dont know whether I have synchronized the threads correctly as well. So, I am asking for some guidance how can I do this? Thanks in advance!
    As a remark, I am new to Java, as I am just starting to learn it and this is my first assignment.
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.FlowLayout;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JApplet;
    import javax.swing.JButton;
    import javax.swing.JPanel;
    public class Balls extends JApplet implements Runnable, ActionListener
         Thread runner = null;     
         Image img;
        Graphics gr;          
        BallCollision ball[];
        Balls can;
        JButton stopButton;
        JButton startButton;
        JPanel controls;
        boolean stop,start;
        //field for 10 balls
        static final int MAX=10;
         public void init()
              setSize(800,600);
              img = createImage(size().width,size().height);
              gr = img.getGraphics();     
              startButton = new JButton("Start");
              stopButton = new JButton("Stop");
              stopButton.addActionListener(this);
              startButton.addActionListener(this);
              controls = new JPanel();
              controls.setLayout(new FlowLayout());
              controls.add(startButton);
              controls.add(stopButton);
              //new Thread(this).start();
              ball = new BallCollision[MAX];
              int w=size().width;
              int h=size().height;          
              //creation of balls, which have different coordinates,
              //speed, direction and colors
              ball[0] = new BallCollision(w,h,50,20,1.5,7.5,Color.orange);
            ball[1] = new BallCollision(w,h,60,210,2.0,-3.0,Color.red);
            ball[2] = new BallCollision(w,h,15,70,-2.0,-2.5,Color.pink);
            ball[3] = new BallCollision(w,h,150,30,-2.7,-1.0,Color.cyan);
            ball[4] = new BallCollision(w,h,210,30,2.2,-12.5,Color.magenta);
              ball[5] = new BallCollision(w,h,360,170,2.2,-1.5,Color.yellow);
              ball[6] = new BallCollision(w,h,210,180,-1.2,-2.5,Color.blue);
              ball[7] = new BallCollision(w,h,330,30,-2.2,-1.8,Color.green);
              ball[8] = new BallCollision(w,h,180,220,-2.2,-1.8,Color.white);
              ball[9] = new BallCollision(w,h,330,130,-2.2,9.0,Color.gray);     
         public void actionPerformed(ActionEvent e)
              if(e.getSource() == startButton) start = true;
                   can.start();
              if(e.getSource() == stopButton) start = false;
                   can.stop();
         public void start()
              if (runner == null)
                   runner = new Thread (this);
                   runner.start();
         public void stop()
              if (runner != null)
                  runner.stop();
                    runner = null;
         public void run()
              while(true)
                   try {Thread.sleep(15);}
                     catch (Exception e) { }               
                   //move our balls around
                   for(int i=0;i<MAX;i++)
                        ball.move();
                   handleCollision();
                   repaint();     
         boolean collide(BallCollision b1, BallCollision b2)
              double wx=b1.getCenterX()-b2.getCenterX();
              double wy=b1.getCenterY()-b2.getCenterY();
              //the distance between 2 colling balls' centres is
              //calculated by the theorem of Pythagoras
              double distance=Math.sqrt(wx*wx+wy*wy);
              if(distance<b1.diameter)
                   return true;          
                   return false;     
         private void handleCollision()
              //ecah ball is checked for possible collisions
              for(int i=0;i<MAX;i++)
                   for(int j=0;j<MAX;j++)
                             if(i!=j)
                                  if(collide(ball[i], ball[j]))
                                       ball[i].hit(ball[j]);
                                       ball[j].hit(ball[i]);
         public void update(Graphics g)
              paint(g);
         public void paint(Graphics g)
              gr.setColor(Color.black);
              gr.fillRect(0,0,size().width,size().height);          
              //paint the balls
              for(int i=0;i<MAX;i++)
                        ball[i].paint(gr);          
              g.drawImage (img,0,0, this);                    
    class BallCollision
         int width, height;
         int diameter=30;
         //balls' coordinates and values to be incremented for directions
         double x, y, xIncremented, yIncremented, coll_x, coll_y;
         boolean collide;
         Color color;
         Graphics g;
         //constructor
         public BallCollision(int w, int h, int x, int y, double xInc, double yInc, Color c)
              width=w;
              height=h;
              this.x=x;
              this.y=y;
              this.xIncremented=xInc;
              this.yIncremented=yInc;          
              color=c;          
         public double getCenterX() {return x+diameter/2;}
         public double getCenterY() {return y+diameter/2;}
         public void move()
              if (collide)
                   double xvect=coll_x-getCenterX();
                   double yvect=coll_y-getCenterY();
                   if((xIncremented>0 && xvect>0) || (xIncremented<0 && xvect<0))
                        xIncremented=-xIncremented;
                   if((yIncremented>0 && yvect>0) || (yIncremented<0 && yvect<0))
                        yIncremented=-yIncremented;
                   collide=false;
              x+=xIncremented;
         y+=yIncremented;
              //if the ball reaches a wall, it bounces to the opposite direction
         if(x<1 || x>width-diameter)
              xIncremented=-xIncremented;
                   x+=xIncremented;
              if(y<1 || y>height-diameter)
                   yIncremented=-yIncremented;
                   y+=yIncremented;
         public void hit(BallCollision b)
              if(!collide)
                   coll_x=b.getCenterX();
                   coll_y=b.getCenterY();
                   collide=true;
         public void paint(Graphics graphics)
              g=graphics;
              g.setColor(color);
              //the coordinates in fillOval have to be int, so we cast
              //explicitly from double to int
              g.fillOval((int)x,(int)y,diameter,diameter);

    well i didnt arrive at this point without reading tutorials and researching.... sometimes other people can spot your mistakes a lot easier than you can, that's why I asked for help. 10x anyway for the interest!

  • Many Bouncing Balls Program

    I am trying to create a program that can use one method to create many bouncing balls.I want each ball to function independently of each other.
    The problem I am having is that when I call my BouncingBall () method three times, it only creates one ball that moves randomly instead of three.
    If you have any idea of how to tackle this problem I would really appreciate if you shared them with me. I am relatively new to java.
    I read that threads might be a good option to work on this problem but I am not sure how to use them.
    *(Code Starts)*
    import acm.graphics.*;
    import acm.program.*;
    import acm.util.*;
    import java.awt.*;
    import java.awt.event.*;
    public class BouncingBalls extends GraphicsProgram {
         public void run(){
              BouncingBall(50, 50);
              BouncingBall(100, 100);
              BouncingBall(300, 300);
         public void BouncingBall(double width, double height) {
              //Create variables for x and y position of balls
              double xPosition = getWidth()/2;
              double yPosition = getHeight()/2;
              //Create Ball
              GOval Ball = new GOval (xPosition, yPosition, width, height);
              add (Ball);
              // Initialize variables for use in Random movement method
              double xMoveBall = rgen.nextDouble(-4.0, 4.0);
              double yMoveBall = rgen.nextDouble(-4.0, 4.0);
              //Ball's Random Movement
              while (true) {     
                        Ball.move(xMoveBall,yMoveBall);
                        pause(10);
                             xPosition += xMoveBall;
                             yPosition += yMoveBall;
                   //Ball's Collisions     with walls
                   if (xPosition >= (getWidth() - width)) {
                        xMoveBall = -(xMoveBall);
                        pause(10);
                   if (xPosition <= 0){
                        xMoveBall = -(xMoveBall);
                        pause(10);
                   if (yPosition <= 0){
                        yMoveBall = -(yMoveBall);
                        pause(10);
                   if (yPosition >= getHeight() - height){
                        yMoveBall = -(yMoveBall);
                        pause(10);
         private RandomGenerator rgen = RandomGenerator.getInstance();{}
    *(Code Ends)*

    Hi,
    I have been experimenting with threads for the last couple of days. Here is the code I have been working on. I explain what I am trying to do below it:
    import acm.graphics.*;
    import acm.program.*;
    import acm.util.*;
    import java.awt.*;
    import java.awt.event.*;
    public class BB5 extends GraphicsProgram implements Runnable{
         // Debbuging Label
         private GLabel label = new GLabel("");
         //Initialize variables for ball's position
         private double xPosition = getWidth()/2;
         private double yPosition = getHeight()/2;
         //Initialize variables for use in Random movement method
         private double yMoveBall;
         private double xMoveBall;
         //Initialize variables for width and height of ball, so that they can be used in both metods: bounce() and CreateBall()
         private double width;
         private double height;
         public void mouseClicked (MouseEvent e){
              new Thread(this).start();
         public void run() {
              CreateBall(50,50).bounce();
         public void CreateBall(double x, double y) {
              //Create variables for x and y position of balls
                 xPosition = getWidth()/2;
                 yPosition = getHeight()/2;
              //Create Ball
              x = width;
              y = height;
              GOval Ball = new GOval (xPosition, yPosition, width, height);
              add (Ball);
         public void bounce() {     
         yMoveBall = rgen.nextDouble(-4.0, 4.0);
         xMoveBall = rgen.nextDouble(-4.0, 4.0);
              //Ball's Random Movement
              while (true){
                   //Put thread to sleep for 5 milliseconds so that other balls can use bounce()
                   try { Thread.sleep(5); } catch(InterruptedException e) {}
                        //Move Ball created in previous methods
                        Ball.move(xMoveBall,yMoveBall);
                        pause(10);
                             xPosition += xMoveBall;
                             yPosition += yMoveBall;
                             label.setLabel(""+xPosition); add (label, 50, 50);
                   //Ball's Collisions     with walls
                   if (xPosition >= (getWidth() - width)) {
                        xMoveBall = -(xMoveBall);
                        pause(10);
                   if (xPosition  <= 0){
                        xMoveBall = -(xMoveBall);
                        pause(10);
                   if (yPosition  <= 0){
                        yMoveBall = -(yMoveBall);
                        pause(10);
                   if (yPosition  >= getHeight() - height){
                        yMoveBall = -(yMoveBall);
                        pause(10);
         private RandomGenerator rgen = RandomGenerator.getInstance();{}
    }The idea is that I have a method that creates the ball CreateBall(), and another that bounces the ball bounce().
    My init method creates one ball. Then, when I click the mouse, I create a new thread which applies the bounce method to the ball by running the run method.
    Inside the bounce method, I have a thread sleep so that other threads can be started.
    Eventually, what I would like to do, is that everytime I click the mouse, a new ball is created and the bounce is applied to it.
    I am also having trouble with getting the ball from my CreateBall() method, to work inside my bounce().
    Can you please help me understand what might be wrong with my code?
    Thank you!

  • Major Lag with my Application and a 2D Ball collision question

    Well, check it. Basically I'm running an application that looks something like this:
    public class Gameextends Canvas implements KeyListener,MouseInputListener{
         /*-------Variable Declarations-------*/
         //GameApp Objects
         BufferStrategy strategy;
         JFrame gameWindow;
         Graphics g;     
         public Game(){
              version=2.0; //see update history for details
              debug=false;     
              //all basic variable setups
              stage=1;
              fps=0;
              gridSize=10;
              numCols=80;
              numRows=60;
              WIDTH=numCols*gridSize;
              HEIGHT=numRows*gridSize;
              //sets all booleans related to game states
              isPaused=false;
              isFinished=false;     
              //Behind the scenes settings
              //maxFPS=80;
              initObjects();
              //Setup gamewindow
              gameWindow = new JFrame("SnakeSoccer v"+version);
            JPanel panel = (JPanel)gameWindow.getContentPane();
            setBounds(0,0,WIDTH,HEIGHT);
            panel.setPreferredSize(new Dimension(WIDTH,HEIGHT));
            panel.setLayout(null);
            panel.setBackground(Color.white);
            panel.add(this);
              gameWindow.setResizable(false);
              gameWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              gameWindow.pack();
              //makes the buffer work
              createBufferStrategy(2);
              strategy = this.getBufferStrategy();
              //sets up all listeners
              addMouseListener(this);
              addMouseMotionListener(this);
              addKeyListener(this);
              this.requestFocus();
              gameWindow.setVisible(true);
         public void initObjects(){
         public void run(){
              tm=System.currentTimeMillis();
              while(!isFinished){
                   if(!isPaused){
                        g=strategy.getDrawGraphics();
                        switch(stage){
                             case 1: //Draw Title Screen
                                  drawTitleScreen(g);
                                  stage=2; //This must be taken out once KeyListener works
                                  break;
                             case 2: //Main Game loop
                                  checkWorld();
                                  updateWorld();
                                  drawWorld(g);
                                  break;     
                        strategy.show();               
                   if(debug)
                        if(System.currentTimeMillis()-tm>1000)
                                  drawFPS(g);
              System.exit(0);
         }Basically, you should be able to tell what's going on. I can limit the FPS by putting an if statement in the beginning of 'case 2' by making it look like this:
    case 2: //Main Game loop
    if(fps<maxFPS)
                                  checkWorld();
                                  updateWorld();
                                  drawWorld(g);
                                  break;     basically, in the drawWorld method it does if(debug)fps++;
    Then in the drawFPS it resets the FPS and all that jazz.
    Anyways, that's the game loop and everything. It does it's thing, but I noticed weird FPS output. Anywhere from 30 all the way up to 3k+ when I didn't limit it. It also is extremely laggy on my PC (good specs, shouldn't be a problem) whether it's capped or uncapped. Any advice would be awesome.
    Also, ball collision... check it:
    Ball class is basically this:
    int x,y,size;
    x,y are the top left points of the ball, and the size is the diameter. I'm trying to have it bounce of two moving objects and all the walls. The obvious thing for this is:
    if(ball.x<0) ball.invertX(); //inverts the movement of the ball along the X axis. Does not affect the velocity.
    or something to that nature. But I guess the real question is what happens if the velocity would land it on the other side of the wall. IE: it's at 5,5 and it moves 8 up and 8 over every time. So it would appear slightly outside the screen. How would I solve this? Sorry it's kinda choppy, but any help would be awesome. I'm programming as we speak, so I will be checking every 5min. My AIM is SAOniKami if you guys wanna chat.
    Let me know if you need anymore info. Thanks.

    Ok, so a few questions:
    1. With the sleeper stuff, why should I use my current thread? My application starts like this:
    public class Runner{
         public static void main(String[] args){
              SnakeSoccer app = new SnakeSoccer();
              app.run();
    }I actually never reference a thread, so it should be all on one thread. Is this bad? When you mentioned that other sleep method it just got me thinking.
    Also, about the collisions: I'm not quite sure what you're saying. Right now I have this in my ball class:
    public class Ball extends GameObject{
         //Data Fields
         private int x,y,vY,vX,radius;
         private boolean isVisible,isXMoveable,isYMoveable;
         private Color ballColor;
         private Image ballImage;
         Ball(){
              x=50;
              y=50;
              vX=3;
              vY=3;
              radius=5;
              ballImage = new ImageIcon("images/ballPic.gif").getImage();
              isXMoveable=true;
              isYMoveable=true;
         Ball(int x,int y,int vX,int vY,int size,Color c){
              this.x=x;
              this.y=y;
              this.vX=vX;
              this.vY=vY;
              this.radius=radius;
              ballColor=c;
              isXMoveable=true;
              isYMoveable=true;
         Ball(int x,int y,int vX,int vY,int size,Image i){
              this.x=x;
              this.y=y;
              this.vX=vX;
              this.vY=vY;
              this.radius=radius;
              ballImage=i;
              isXMoveable=true;
              isYMoveable=true;
         public int getX(){ return x; }
         public int getY(){ return y; }
         public int getVX(){ return vY; }
         public int getVY(){ return vY; }
         public int getRadius(){ return radius; }
         public boolean isVisible(){ return isVisible; }
         public boolean isXMoveable(){ return isXMoveable; }
         public boolean isYMoveable(){ return isYMoveable; }
         public void setX(int n){ x=n; }
         public void setY(int n){ y=n; }
         public void setVX(int n){ vX=n; }
         public void setVY(int n){ vY=n; }
         public void setVisible(boolean b){ isVisible=b; }
         public void setXMoveable(boolean b){ isXMoveable=b; }
         public void setYMoveable(boolean b){ isYMoveable=b; }
         public void inverseX(){ vX*=-1; }
         public void inverseY(){ vY*=-1; }
         public void tick(){
              if(isXMoveable)
                   x+=vX;
              if(isYMoveable)
                   y+=vY;
         public void draw(Graphics g){
              if(ballImage==null){
                   g.setColor(ballColor);
                   g.fillOval(x-radius,y-radius,radius*2,radius*2);     
              else
                   g.drawImage(ballImage,x-radius,y-radius,null);
    }Basically, vX and vY are how many pixels it moves everytime it's updated. Then I just call invertX or invertY to just times it by -1. Unfortunately, this is a very simple collision engine, but it seems to serve it's purpose.
    How I detect them is something like this:
              //check for wall collisions
              if(ballX-radius-1<=0) //left wall
                   ball.inverseX();
              else if(ballX+radius+1>=numCols*gridSize) //right wall
                   ball.inverseX();
              if(ballY-radius-1<=0) //top wall
                   ball.inverseY();
              else if(ballY+radius+1>=(numRows-10)*gridSize) //bottom wall
                   ball.inverseY();gridSize is the size of a grid in my program. While, there are no 'grids', I just use that to scale the program. IE: If I change the gridSize from 10 to 20, the window will be twice as big, and everything else will work fine also.
    Anyways, let me know if you see anything wrong with that.

  • How to repaint a JPanel in bouncing balls game?

    I want to repaint the canvas panel in this bouncing balls game, but i do something wrong i don't know what, and the JPanel doesn't repaint?
    The first class defines a BALL as a THREAD
    If anyone knows how to correct the code please to write....
    package fuck;
    //THE FIRST CLASS
    class CollideBall extends Thread{
        int width, height;
        public static final int diameter=15;
        //coordinates and value of increment
        double x, y, xinc, yinc, coll_x, coll_y;
        boolean collide;
        Color color;
        Rectangle r;
        bold BouncingBalls balls; //A REFERENCE TO SECOND CLASS
        //the constructor
        public CollideBall(int w, int h, int x, int y, double xinc, double yinc, Color c, BouncingBalls balls) {
            width=w;
            height=h;
            this.x=x;
            this.y=y;
            this.xinc=xinc;
            this.yinc=yinc;
            this.balls=balls;
            color=c;
            r=new Rectangle(150,80,130,90);
        public double getCenterX() {return x+diameter/2;}
        public double getCenterY() {return y+diameter/2;}
        public void move() {
            if (collide) {
            x+=xinc;
            y+=yinc;
            //when the ball bumps against a boundary, it bounces off
            //bounce off the obstacle
        public void hit(CollideBall b) {
            if(!collide) {
                coll_x=b.getCenterX();
                coll_y=b.getCenterY();
                collide=true;
        public void paint(Graphics gr) {
            Graphics g = gr;
            g.setColor(color);
            //the coordinates in fillOval have to be int, so we cast
            //explicitly from double to int
            g.fillOval((int)x,(int)y,diameter,diameter);
            g.setColor(Color.white);
            g.drawArc((int)x,(int)y,diameter,diameter,45,180);
            g.setColor(Color.darkGray);
            g.drawArc((int)x,(int)y,diameter,diameter,225,180);
            g.dispose(); ////////
        ///// Here is the buggy code/////
        public void run() {
            while(true) {
                try {Thread.sleep(15);} catch (Exception e) { }
                synchronized(balls)
                    move();
                    balls.repairCollisions(this);
                paint(balls.gBuffer);
                balls.canvas.repaint();
    //THE SECOND CLASS
    public class BouncingBalls extends JFrame{
        public Graphics gBuffer;
        public BufferedImage buffer;
        private Obstacle o;
        private List<CollideBall> balls=new ArrayList();
        private static final int SPEED_MIN = 0;
        private static final int SPEED_MAX = 15;
        private static final int SPEED_INIT = 3;
        private static final int INIT_X = 30;
        private static final int INIT_Y = 30;
        private JSlider slider;
        private ChangeListener listener;
        private MouseListener mlistener;
        private int speedToSet = SPEED_INIT;
        public JPanel canvas;
        private JPanel p;
        public BouncingBalls() {
            super("fuck");
            setSize(800, 600);
            p = new JPanel();
            Container contentPane = getContentPane();
            final BouncingBalls xxxx=this;
            o=new Obstacle(150,80,130,90);
            buffer=new BufferedImage(getSize().width, getSize().height, BufferedImage.TYPE_INT_RGB);
            gBuffer=buffer.getGraphics();
            //JPanel canvas start
            final JPanel canvas = new JPanel() {
                final int w=getSize().width-5;
                final int h=getSize().height-5;
                @Override
                public void update(Graphics g)
                   paintComponent(g);
                @Override
                public void paintComponent(Graphics g) {
                    super.paintComponent(g);
                    gBuffer.setColor(Color.ORANGE);
                    gBuffer.fillRect(0,0,getSize().width,getSize().height);
                    gBuffer.draw3DRect(5,5,getSize().width-10,getSize().height-10,false);
                    //paint the obstacle rectangle
                    o.paint(gBuffer);
                    g.drawImage(buffer,0,0, null);
                    //gBuffer.dispose();
            };//JPanel canvas end
            addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
            addButton(p, "Start", new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    CollideBall b = new CollideBall(canvas.getSize().width,canvas.getSize().height
                            ,INIT_X,INIT_Y,speedToSet,speedToSet,Color.BLUE,xxxx);
                    balls.add(b);
                    b.start();
            contentPane.add(canvas, "Center");
            contentPane.add(p, "South");
        public void addButton(Container c, String title, ActionListener a) {
            JButton b = new JButton(title);
            c.add(b);
            b.addActionListener(a);
        public boolean collide(CollideBall b1, CollideBall b2) {
            double wx=b1.getCenterX()-b2.getCenterX();
            double wy=b1.getCenterY()-b2.getCenterY();
            //we calculate the distance between the centers two
            //colliding balls (theorem of Pythagoras)
            double distance=Math.sqrt(wx*wx+wy*wy);
            if(distance<b1.diameter)
                return true;
            return false;
        synchronized void repairCollisions(CollideBall a) {
            for (CollideBall x:balls) if (x!=a && collide(x,a)) {
                x.hit(a);
                a.hit(x);
        public static void main(String[] args) {
            JFrame frame = new BouncingBalls();
            frame.setVisible(true);
    }  And when i press start button:
    Exception in thread "Thread-2" java.lang.NullPointerException
    at fuck.CollideBall.run(CollideBall.java:153)
    Exception in thread "Thread-3" java.lang.NullPointerException
    at fuck.CollideBall.run(CollideBall.java:153)
    Exception in thread "Thread-4" java.lang.NullPointerException
    at fuck.CollideBall.run(CollideBall.java:153)
    and line 153 is: balls.canvas.repaint(); in Method run() in First class.
    Please help.

    public RepaintManager manager;
    public BouncingBalls() {
            manager = new RepaintManager();
            manager.addDirtyRegion(canvas, 0, 0,canvas.getSize().width, canvas.getSize().height);
        public void run() {
            while(true) {
                try {Thread.sleep(15);} catch (Exception e) { }
                synchronized(balls)
                    move();
                    balls.repairCollisions(this);
                paint(balls.gBuffer);
                balls.manager.paintDirtyRegions(); //////// line 153
       but when push start:
    Exception in thread "Thread-2" java.lang.IllegalMonitorStateException
    at java.lang.Object.notifyAll(Native Method)
    at fuck.CollideBall.run(CollideBall.java:153)
    Exception in thread "Thread-3" java.lang.IllegalMonitorStateException
    at java.lang.Object.notifyAll(Native Method)
    at fuck.CollideBall.run(CollideBall.java:153)
    i'm newbie with Concurrency and i cant handle this exceptons.
    Is this the right way to do repaint?

  • Balls don't move in bouncing balls game.Please Help !?

    I want to repaint the canvas panel in this bouncing balls game, but i do something wrong i don't know what, and the JPanel doesn't repaint?
    The first class defines a BALL as a THREAD
    If anyone knows how to correct the code please to write....
    package ****;
    //THE FIRST CLASS
    class CollideBall extends Thread{
        int width, height;
        public static final int diameter=15;
        //coordinates and value of increment
        double x, y, xinc, yinc, coll_x, coll_y;
        boolean collide;
        Color color;
        Rectangle r;
        bold BouncingBalls balls; //A REFERENCE TO SECOND CLASS
        //the constructor
        public CollideBall(int w, int h, int x, int y, double xinc, double yinc, Color c, BouncingBalls balls) {
            width=w;
            height=h;
            this.x=x;
            this.y=y;
            this.xinc=xinc;
            this.yinc=yinc;
            this.balls=balls;
            color=c;
            r=new Rectangle(150,80,130,90);
        public double getCenterX() {return x+diameter/2;}
        public double getCenterY() {return y+diameter/2;}
        public void move() {
            if (collide) {
            x+=xinc;
            y+=yinc;
            //when the ball bumps against a boundary, it bounces off
            //bounce off the obstacle
        public void hit(CollideBall b) {
            if(!collide) {
                coll_x=b.getCenterX();
                coll_y=b.getCenterY();
                collide=true;
        public void paint(Graphics gr) {
            Graphics g = gr;
            g.setColor(color);
            //the coordinates in fillOval have to be int, so we cast
            //explicitly from double to int
            g.fillOval((int)x,(int)y,diameter,diameter);
            g.setColor(Color.white);
            g.drawArc((int)x,(int)y,diameter,diameter,45,180);
            g.setColor(Color.darkGray);
            g.drawArc((int)x,(int)y,diameter,diameter,225,180);
            g.dispose(); ////////
        ///// Here is the buggy code/////
        public void run() {
            while(true) {
                try {Thread.sleep(15);} catch (Exception e) { }
                synchronized(balls)
                    move();
                    balls.repairCollisions(this);
                paint(balls.gBuffer);
                balls.canvas.repaint();
    //THE SECOND CLASS
    public class BouncingBalls extends JFrame{
        public Graphics gBuffer;
        public BufferedImage buffer;
        private Obstacle o;
        private List<CollideBall> balls=new ArrayList();
        private static final int SPEED_MIN = 0;
        private static final int SPEED_MAX = 15;
        private static final int SPEED_INIT = 3;
        private static final int INIT_X = 30;
        private static final int INIT_Y = 30;
        private JSlider slider;
        private ChangeListener listener;
        private MouseListener mlistener;
        private int speedToSet = SPEED_INIT;
        public JPanel canvas;
        private JPanel p;
        public BouncingBalls() {
            super("****");
            setSize(800, 600);
            p = new JPanel();
            Container contentPane = getContentPane();
            final BouncingBalls xxxx=this;
            o=new Obstacle(150,80,130,90);
            buffer=new BufferedImage(getSize().width, getSize().height, BufferedImage.TYPE_INT_RGB);
            gBuffer=buffer.getGraphics();
            //JPanel canvas start
            canvas = new JPanel() {
                final int w=getSize().width-5;
                final int h=getSize().height-5;
                @Override
                public void update(Graphics g)
                   paintComponent(g);
                @Override
                public void paintComponent(Graphics g) {
                    super.paintComponent(g);
                    gBuffer.setColor(Color.ORANGE);
                    gBuffer.fillRect(0,0,getSize().width,getSize().height);
                    gBuffer.draw3DRect(5,5,getSize().width-10,getSize().height-10,false);
                    //paint the obstacle rectangle
                    o.paint(gBuffer);
                    g.drawImage(buffer,0,0, null);
                    //gBuffer.dispose();
            };//JPanel canvas end
            addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
            addButton(p, "Start", new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    CollideBall b = new CollideBall(canvas.getSize().width,canvas.getSize().height
                            ,INIT_X,INIT_Y,speedToSet,speedToSet,Color.BLUE,xxxx);
                    balls.add(b);
                    b.start();
            contentPane.add(canvas, "Center");
            contentPane.add(p, "South");
        public void addButton(Container c, String title, ActionListener a) {
            JButton b = new JButton(title);
            c.add(b);
            b.addActionListener(a);
        public boolean collide(CollideBall b1, CollideBall b2) {
            double wx=b1.getCenterX()-b2.getCenterX();
            double wy=b1.getCenterY()-b2.getCenterY();
            //we calculate the distance between the centers two
            //colliding balls (theorem of Pythagoras)
            double distance=Math.sqrt(wx*wx+wy*wy);
            if(distance<b1.diameter)
                return true;
            return false;
        synchronized void repairCollisions(CollideBall a) {
            for (CollideBall x:balls) if (x!=a && collide(x,a)) {
                x.hit(a);
                a.hit(x);
        public static void main(String[] args) {
            JFrame frame = new BouncingBalls();
            frame.setVisible(true);
    }  This code draws only the first position of the ball:
    http://img267.imageshack.us/my.php?image=51649094by6.jpg

    I'm trying to draw everything first to a buffer:
    buffer=new BufferedImage(getSize().width, getSize().height, BufferedImage.TYPE_INT_RGB);
    gBuffer=buffer.getGraphics();
    The buffer is for one JPanel and then i want to draw this buffer every time when balls change their possitions(collide or just move).
    The logic is something like this:
    startButton -> (ball.start() and add ball to List<balls>),
    ball.start() -> ball.run() -> (move allballs, paint to buffer and show buffer)
    In the first class:
    BouncingBalls balls; //A REFERENCE TO SECOND CLASS
    In the second class:
    private List<CollideBall> balls=new ArrayList();
    the tames are the same but this isn't an error.
    Edited by: vigour on Feb 14, 2008 7:57 AM

  • Bouncing ball question

    Hi, I'm new to the forums and really new to java and I was wondering if anyone could help me with a simple java program that I'm writing.
    It deals simply with a bouncing ball (yes I know there's a topics on this one heh) that bounces aimlessly inside a drawing window.
    Here's my problem:
    I can make the ball bounce off two boundaries (top and right, left and bottom, right and bottom etc.) but when the ball reaches the 3rd boundary it just passes through it. It wont bounce off opposite sides (left and right, top and bottom) it only bounces off the first.
    I believe it has something to do with my if statements under the move method.
    I need to make some kind of loop so it keeps checking if the ball comes to a new boundary.
    Right now it's only checking it once and after it bounces the ball one time thats it.
    (I've tested all the boundaries to see if they bounce the ball and they all do, its just I can't bounce it more than 2 times)
    I'm stuck on how to write this loop statement. Any help would be greatly appreciated! Thanks.
    My code (If this isnt enough let me know please):
    (BallTester.java)
    import element.*;
    public class BallTester{
    public static void main(String[] args){
    int width = 500;
    int height = 400;
    DrawingWindow d = new DrawingWindow(width,height);      
    Ball b = new Ball(70,30,width,height);
    b.send(d);                                   
    (Ball.java)
    import element.*;
    public class Ball{
    int base; // center line of where the circle starts
    int size; // radius of circle
    int xPos,yPos; // circle ctr
    Circle c;
         int width, height;
         int dx,dy;
    public Ball(int base, int size, int width, int height) {
              this.base = base;
    this.size = size;
    c = new Circle(50,base,size);
              this.width = width; this.height = height;
              xPos = 50;
              yPos = base;
    public void drawOn(DrawingWindow d){
              //draws the circle
              c.drawOn(d);
    public void clearOn(DrawingWindow d){
              d.invertMode(); // black-> white
              drawOn(d); //redraw in white: erase!
              d.invertMode(); // white -> black
    public void move(int dx, int dy){
              //Sets boundaries for x values
              if((xPos<=size)||(xPos>=width-size)){
              dx = -dx;
              else
              xPos += dx;
              //Sets boundaries for y values
              if((yPos<=size)||(yPos>=height-size)){
              dy = -dy;
              else     
              yPos += dy;
              c.move(dx,dy);
    public void send(DrawingWindow d){
              Waiting w = new Waiting();
    //This below keeps the ball drawing up until j = width)
    for(int j = 0; j < width; j++){
              move(6,-3); // moves the circle based on dx, dy values
              this.drawOn(d);
    w.snooze(60);
    this.clearOn(d);}

    You don't need a loop to check - you just need to check every loop (before you repaint).
    I created an example for you. If this assignment is homework, don't hand it in - use it as a reference. Try to understand what's going on in the code and why it works.
    import java.awt.*;
    import javax.swing.*;
    public class Test extends JFrame {
        public Test () {
            getContentPane ().setLayout (new BorderLayout ());
            getContentPane ().add (new TestPanel ());
            setDefaultCloseOperation (DISPOSE_ON_CLOSE);
            setTitle ("Test");
            pack ();
            setLocationRelativeTo (null);
            setVisible (true);
        public static void main (String[] parameters) {
            new Test ();
        private class TestPanel extends JPanel {
            private Ball ball;
            public TestPanel () {
                ball = new Ball ();
                Thread painter = new Thread (new Runnable () {
                    public void run () {
                        while (true) {
                            try {
                                Thread.sleep (20);
                            } catch (InterruptedException exception) {}
                            repaint ();
                painter.setDaemon (true);
                painter.start ();
            public Dimension getPreferredSize () {
                return new Dimension (300, 200);
            public void paintComponent (Graphics g) {
                super.paintComponent (g);
                ball.move (getWidth (), getHeight ());
                ball.paint (g);
            private class Ball {
                private static final int W = 10;
                private static final int H = 10;
                private int x;
                private int y;
                private int dx;
                private int dy;
                public Ball () {
                    x = 0;
                    y = 0;
                    dx = 2;
                    dy = 2;
                public void move (int width, int height) {
                    int x = this.x + dx;
                    int y = this.y + dy;
                    if ((x < 0) || (x + W > width)) {
                        dx = -dx;
                        x = this.x + dx;
                    if ((y < 0) || (y + H > height)) {
                        dy = -dy;
                        y = this.y + dy;
                    this.x = x;
                    this.y = y;
                public void paint (Graphics g) {
                    g.fillOval (x, y, W, H);
    }

  • Bouncing Ball without Main Method

    Hi. I needed to reserch on the Internet sample code for a blue bouncing ball which I did below. However, I try coding a main class to start the GUI applet and it's not working. How can I create the appropriate class that would contain the main method to start this particular application which the author did not provide? The actual applet works great and matches the objective of my research (http://www.terrence.com/java/ball.html). The DefaultCloseOperation issues an error so that's why is shown as remarks // below. Then the code in the Ball.java class issues some warning about components being deprecated as shown below. Thank you for your comments and suggestions.
    Compiling 2 source files to C:\Documents and Settings\Fausto Rivera\My Documents\NetBeansProjects\Rivera_F_IT271_0803B_01_PH3_DB\build\classes
    C:\Documents and Settings\Fausto Rivera\My Documents\NetBeansProjects\Rivera_F_IT271_0803B_01_PH3_DB\src\Ball.java:32: warning: [deprecation] size() in java.awt.Component has been deprecated
        size = this.size();
    C:\Documents and Settings\Fausto Rivera\My Documents\NetBeansProjects\Rivera_F_IT271_0803B_01_PH3_DB\src\Ball.java:93: warning: [deprecation] mouseDown(java.awt.Event,int,int) in java.awt.Component has been deprecated
      public boolean mouseDown(Event e, int x, int y) {
    2 warnings
    import javax.swing.*;
    public class BallMain {
    * @param args the command line arguments
    public static void main(String[] args) {
    Ball ball = new Ball();
    //ball.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    ball.setSize( 500, 175 ); // set frame size
    ball.setVisible( true ); // display frame
    import java.awt.*;*
    *import java.applet.*;
    import java.util.Vector;
    // Java Bouncing Ball
    // Terrence Ma
    // Modified from Java Examples in a Nutshell
    public class Ball extends Applet implements Runnable {
    int x = 150, y = 100, r=50; // Position and radius of the circle
    int dx = 8, dy = 5; // Trajectory of circle
    Dimension size; // The size of the applet
    Image buffer; // The off-screen image for double-buffering
    Graphics bufferGraphics; // A Graphics object for the buffer
    Thread animator; // Thread that performs the animation
    boolean please_stop; // A flag asking animation thread to stop
    /** Set up an off-screen Image for double-buffering */
    public void init() {
    size = this.size();
    buffer = this.createImage(size.width, size.height);
    bufferGraphics = buffer.getGraphics();
    /** Draw the circle at its current position, using double-buffering */
    public void paint(Graphics g) {
    // Draw into the off-screen buffer.
    // Note, we could do even better clipping by setting the clip rectangle
    // of bufferGraphics to be the same as that of g.
    // In Java 1.1: bufferGraphics.setClip(g.getClip());
    bufferGraphics.setColor(Color.white);
    bufferGraphics.fillRect(0, 0, size.width, size.height); // clear the buffer
    bufferGraphics.setColor(Color.blue);
    bufferGraphics.fillOval(x-r, y-r, r*2, r*2); // draw the circle
    // Then copy the off-screen buffer onto the screen
    g.drawImage(buffer, 0, 0, this);
    /** Don't clear the screen; just call paint() immediately
    * It is important to override this method like this for double-buffering */
    public void update(Graphics g) { paint(g); }
    /** The body of the animation thread */
    public void run() {
    while(!please_stop) {
    // Bounce the circle if we've hit an edge.
    if ((x - r + dx < 0) || (x + r + dx > size.width)) dx = -dx;
    if ((y - r + dy < 0) || (y + r + dy > size.height)) dy = -dy;
    // Move the circle.
    x += dx; y += dy;
    // Ask the browser to call our paint() method to redraw the circle
    // at its new position. Tell repaint what portion of the applet needs
    // be redrawn: the rectangle containing the old circle and the
    // the rectangle containing the new circle. These two redraw requests
    // will be merged into a single call to paint()
    repaint(x-r-dx, y-r-dy, 2*r, 2*r); // repaint old position of circle
    repaint(x-r, y-r, 2*r, 2*r); // repaint new position of circle
    // Now pause 50 milliseconds before drawing the circle again.
    try { Thread.sleep(50); } catch (InterruptedException e) { ; }
    animator = null;
    /** Start the animation thread */
    public void start() {
    if (animator == null) {
    please_stop = false;
    animator = new Thread(this);
    animator.start();
    /** Stop the animation thread */
    public void stop() { please_stop = true; }
    /** Allow the user to start and stop the animation by clicking */
    public boolean mouseDown(Event e, int x, int y) {
    if (animator != null) please_stop = true; // if running request a stop
    else start(); // otherwise start it.
    return true;
    }

    FRiveraJr wrote:
    I believe that I stated that this not my code and it was code that I researched.and why the hll should this matter at all? If you want help here from volunteers, your code or not, don't you think that you should take the effort to format it properly?

  • Mac is way too slow and bouncing ball is constant

    I ran the etrecheck and this is what it came back with.  What should I do?
    Problem description:
    Bouncing ball all the time…computer super slow.
    EtreCheck version: 2.1.7 (114)
    Report generated January 31, 2015 at 5:37:13 PM PST
    Download EtreCheck from http://etresoft.com/etrecheck
    Click the [Support] links for help with non-Apple products.
    Click the [Details] links for more information about that line.
    Click the [Adware] links for help removing adware.
    Hardware Information: ℹ️
        MacBook Pro (15-inch, Early 2011) (Technical Specifications)
        MacBook Pro - model: MacBookPro8,2
        1 2 GHz Intel Core i7 CPU: 4-core
        4 GB RAM Upgradeable
            BANK 0/DIMM0
                2 GB DDR3 1333 MHz ok
            BANK 1/DIMM0
                2 GB DDR3 1333 MHz ok
        Bluetooth: Old - Handoff/Airdrop2 not supported
        Wireless:  en1: 802.11 a/b/g/n
        Battery Health: Normal - Cycle count 263
    Video Information: ℹ️
        Intel HD Graphics 3000 - VRAM: 384 MB
        AMD Radeon HD 6490M - VRAM: 256 MB
            Color LCD 1440 x 900
    System Software: ℹ️
        OS X 10.10.2 (14C109) - Time since boot: 0:13:39
    Disk Information: ℹ️
        ST9500325ASG disk0 : (500.11 GB)
            EFI (disk0s1) <not mounted> : 210 MB
            Recovery HD (disk0s3) <not mounted>  [Recovery]: 650 MB
            Macintosh HD (disk1) / : 498.88 GB (235.63 GB free)
                Core Storage: disk0s2 499.25 GB Online
        HL-DT-ST DVDRW  GS23NR 
    USB Information: ℹ️
        Apple Inc. FaceTime HD Camera (Built-in)
        HP Photosmart Plus B210 series
        Apple Inc. Apple Internal Keyboard / Trackpad
        Apple Inc. BRCM2070 Hub
            Apple Inc. Bluetooth USB Host Controller
        Apple Computer, Inc. IR Receiver
    Thunderbolt Information: ℹ️
        Apple Inc. thunderbolt_bus
    Gatekeeper: ℹ️
        Mac App Store and identified developers
    Kernel Extensions: ℹ️
            /System/Library/Extensions
        [loaded]    com.LaCie.ScsiType00 (1.2.9 - SDK 10.6) [Support]
        [loaded]    com.jmicron.driver.jmPeripheralDevice (2.0.4) [Support]
        [not loaded]    com.kaspersky.kext.klif (3.0.0d23) [Support]
        [loaded]    com.kaspersky.nke (1.0.2d43) [Support]
        [loaded]    com.lacie.driver.LaCie_RemoteComms (1.0.1 - SDK 10.4) [Support]
        [loaded]    com.oxsemi.driver.OxsemiDeviceType00 (1.28.13 - SDK 10.5) [Support]
    Launch Daemons: ℹ️
        [loaded]    com.adobe.fpsaud.plist [Support]
        [running]    com.fitbit.galileod.plist [Support]
    User Launch Agents: ℹ️
        [loaded]    com.adobe.ARM.[...].plist [Support]
    User Login Items: ℹ️
        iTunesHelper    Application Hidden (/Applications/iTunes.app/Contents/MacOS/iTunesHelper.app)
    Internet Plug-ins: ℹ️
        FlashPlayer-10.6: Version: 16.0.0.296 - SDK 10.6 [Support]
        QuickTime Plugin: Version: 7.7.3
        Flash Player: Version: 16.0.0.296 - SDK 10.6 [Support]
        Default Browser: Version: 600 - SDK 10.10
        SharePointBrowserPlugin: Version: 14.3.9 - SDK 10.6 [Support]
        Silverlight: Version: 5.1.20913.0 - SDK 10.6 [Support]
        JavaAppletPlugin: Version: 15.0.0 - SDK 10.10 Check version
    Safari Extensions: ℹ️
        Pin It Button [Installed]
    3rd Party Preference Panes: ℹ️
        Flash Player  [Support]
    Time Machine: ℹ️
        Skip System Files: NO
        Mobile backups: ON
        Auto backup: YES
        Volumes being backed up:
            Macintosh HD: Disk size: 498.88 GB Disk used: 263.25 GB
        Destinations:
            LaCie [Local]
            Total size: 499.76 GB
            Total number of backups: 11
            Oldest backup: 2013-04-08 05:32:50 +0000
            Last backup: 2014-12-29 20:32:29 +0000
            Size of backup disk: Too small
                Backup size 499.76 GB < (Disk used 263.25 GB X 3)
    Top Processes by CPU: ℹ️
             5%    WindowServer
             0%    systemstatsd
             0%    HP Scanner 3
             0%    AppleSpell
             0%    fontd
    Top Processes by Memory: ℹ️
        232 MB    Image Capture Extension
        159 MB    ocspd
        133 MB    Safari
        120 MB    com.apple.WebKit.WebContent
        94 MB    Dock
    Virtual Memory Information: ℹ️
        40 MB    Free RAM
        1.56 GB    Active RAM
        1.53 GB    Inactive RAM
        1.14 GB    Wired RAM
        1.40 GB    Page-ins
        5 MB    Page-outs
    Diagnostics Information: ℹ️
        Jan 31, 2015, 05:24:14 PM    Self test - passed

    I can't stand peremptory affirmations like "Nothing is wrong with Safari".
    Thousands of users can't be wrong (see the discussions).
    If I read you the right way, it's never software' fault, it's the user who's the culprit.
    Amazing!
    In this very case, the fact is we can't give to "christinefromfonthill" a good solution because weren't sitting in front of her Mac.
    You give her a good advice which could, perhaps, lead to an improvement.
    But must also admit that Safari is a very slow browser compared to Firefox or Chrome.
    And you can't ignore all the problems which arose when upgrading to Lion and were related to the new build and specs of Safari 5.1.
    The best example is the apparition of "garbage type" (use of Last Resort font) when reading numerous sites. This never occured before and is the direct consequence of Safari compliance to Web Open Type. This standard prohibits the use of Type 1 Postscript Fonts and is the reason why so many people are in trouble.
    I use a Mac for more than 25 years.
    I am a very "clean" user who hates the bells and whistles of third party.
    My Mac is always up-to-date and despite all my Mac loving care, I run into some problems.
    Imagine the nightmare which can occurs for the vulgum pecus who isn't, by definition, a power user aware of all the requirements for running a System in optimal conditions.
    May be Safari is one step in advance on its time but lambda users are paying the price for it.

  • Possibility of drawing numbers on java bouncing balls?

    Can anyone show me how to put numbers on these moving balls in my code. I need the numbers 1-60 on them. I have two sets the red and white. Here is my code. Any help is appreciated. I am trying to write a program to represent the powerball.
    import java.awt.*;
    import java.applet.*;
    import java.util.*;
    import javax.swing.*;
    import java.awt.Rectangle;
    class CollideBall{
    int width, height;
    public static final int diameter=20;
    //coordinates and value of increment
    double x, y, xinc, yinc, coll_x, coll_y;
    boolean collide;
    Color color;
    Graphics g;
    Rectangle r;
    //the constructor
    public CollideBall(int w, int h, int x, int y, double xinc, double yinc, Color c){
    width=w;
    height=h;
    this.x=x;
    this.y=y;
    this.xinc=xinc;
    this.yinc=yinc;
    color=c;
    r=new Rectangle(150,80,130,90);
    public double getCenterX() {return x+diameter/2;}
    public double getCenterY() {return y+diameter/2;}
    public void alterRect(int x, int y, int w, int h){
    r.setLocation(x,y);
    r.setSize(w,h);
    public void move(){
    if (collide){  
    double xvect=coll_x-getCenterX();
    double yvect=coll_y-getCenterY();
    if((xinc>0 && xvect>0) || (xinc<0 && xvect<0))
    xinc=-xinc;
    if((yinc>0 && yvect>0) || (yinc<0 && yvect<0))
    yinc=-yinc;
    collide=false;
    x+=xinc;
    y+=yinc;
    //when the ball bumps against a boundary, it bounces off
    //ball width is 6 so if the ball becomes less then 6 it is touching the frame
    //if ball is greater than the entire width-the diameter of the rectangle, then the ball is just touching the frame of the rectangle and must switch to negative to go in opposit direction
    if(x<6 || x>width-diameter){
    xinc=-xinc;
    x+=xinc;
    //same thing as about just about the Y-axis instead of the x-axis
    if(y<6 || y>height-diameter){
    yinc=-yinc;
    y+=yinc;
    public void hit(CollideBall b){
    if(!collide){
    coll_x=b.getCenterX();
    coll_y=b.getCenterY();
    collide=true;
    public void paint(Graphics gr){
    g=gr;
    g.setColor(color);
    //the coordinates in fillOval have to be int, so we cast
    //explicitly from double to int
    g.fillOval((int)x,(int)y,diameter,diameter);
    //Draws half white and half dark gray arc around the balls to give light and shadow effect
    g.setColor(Color.white);
    g.drawArc((int)x,(int)y,diameter,diameter,45,180);
    g.setColor(Color.darkGray);
    g.drawArc((int)x,(int)y,diameter,diameter,225,180);
    public class BouncingBalls extends Applet implements Runnable { 
    Thread runner;
    Image Buffer;
    Graphics gBuffer;
    CollideBall ball[];
    //Obstacle o;
    //how many balls?
    static final int MAX=60;
    boolean intro=true,drag,shiftW,shiftN,shiftE,shiftS;
    boolean shiftNW,shiftSW,shiftNE,shiftSE;
    int xtemp,ytemp,startx,starty;
    int west, north, east, south;
    public void init() {  
    Buffer=createImage(getSize().width,getSize().height);
    gBuffer=Buffer.getGraphics();
    ball=new CollideBall[MAX];
    int w=getSize().width-5;
    int h=getSize().height-5;
    //our balls have different start coordinates, increment values
    //(speed, direction) and colors
    for (int i = 0;i<30;i++){
    ball=new CollideBall(w,h,48+i,500+i,1.5,2.0,Color.white);
    ball[i+30]=new CollideBall(w,h,890+i,200+i,1.5,2.0,Color.red);
    public void start(){
    if (runner == null) {
    runner = new Thread (this);
    runner.start();
    /* public void stop(){
    if (runner != null) {
    runner.stop();
    runner = null;
    public void run(){
    while(true) {
    Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
    try {runner.sleep(15);}
    catch (Exception e) { }
    //move our balls around
    for(int i=0;i<MAX;i++){
    ball[i].move();
    handleCollision();
    repaint();
    boolean collide(CollideBall b1, CollideBall b2){
    double wx=b1.getCenterX()-b2.getCenterX();
    double wy=b1.getCenterY()-b2.getCenterY();
    //we calculate the distance between the centers two
    //colliding balls (theorem of Pythagoras)
    double distance=Math.sqrt(wx*wx+wy*wy);
    if(distance<b1.diameter)
    return true;
    return false;
    private void handleCollision(){
    //we iterate through all the balls, checking for collision
    for(int i=0;i<MAX;i++)
    for(int j=0;j<MAX;j++){
    if(i!=j){         
    if(collide(ball[i], ball[j])){  
    ball[i].hit(ball[j]);
    ball[j].hit(ball[i]);
    public void update(Graphics g){
    paint(g);
    public void paint(Graphics g) { 
    gBuffer.setColor(Color.lightGray);
    gBuffer.fillRect(0,0,getSize().width,getSize().height);
    gBuffer.draw3DRect(5,5,getSize().width-10,getSize().height-10,false);
    //paint our balls
    for(int i=0;i<MAX;i++)
    ball[i].paint(gBuffer);
    g.drawImage (Buffer,0,0, this);
    Thanks again

    this.user wrote:
    JakeG27 post your code within the code tab it will be more clear.
    You can do this by clicking on CODE when you do this will appear { code} { code} post your code inbetween those to tags.
    ie
    { code} code... { code}
    and it will look like this
    code
    This must be the first sensible post you've ever made. At least you're able to copy someone else's response and pretend you know something.

  • Trying to connect the scale parameter with a bouncing ball

    hi, to all
    and thanks for reading this is my first post
    I'm looking for a way to link the scale parameter of a ball to achieve a bounce effect.
    Im trying to use the new link behavior -I used the replicator to replicate a ball then I add the edge collision to it -so far so good the balls are acting ok but now i want to add the scale effect to it when the ball is jumping/ touching the ground
    any idea ????
    thanks
    Gil

    I think it's going to be tough to make that happen - I think it would be easier to simply keyframe it - you can then save the keyframes in a variety of ways:
    http://provideocoalition.com/index.php/smartin/story/reapplyingkeyframes_inmotion/

  • Swing timer, setDealy issue in bouncing balls

    Hi!
    I have a problem with an assignment with bouncing footballs. There are three classes; footBall which picks a football (soccer)from referencelibrary and here I have a swing timer. The next class is footballfield(fotBollsPlan) that also has a timer in it and an arraylist for the footballs. Here I also have a mouseListener, so every time I click on the footballfield I create a new football. And finally a main-class. So, I click on the panel and create footballs that starts to bounc around inside the frame. Here is the code:
    Football class:
    code
    package uppgift2;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.lang.Thread;
    import java.net.URL;
    import javax.swing.*;
    public class FotBoll implements ActionListener{
         private final int storlek;
         private int x;
         private int xfart;
         private int y;
         private int yfart;
         private FotBollsPlan plan;
         public FotBoll (int x, int y, int xfart, int yfart, int storlek){
              this.storlek = storlek;
              this.x = x;
              this.y = y;
              this.xfart = xfart;
              this.yfart = yfart;
              plan = new FotBollsPlan();
              Timer t = new Timer(100, this);
              t.start();
         public void actionPerformed(ActionEvent ae){
                   if (x < 0 || x > 700)
                        xfart = - xfart;
                   if (y < 0 || y > 500)
                        yfart = - yfart;
                   x = xfart + x;
                   y = yfart + y;
         public void rita(Graphics g){
              ClassLoader cl = this.getClass().getClassLoader();
              URL url = cl.getResource("fotboll" + storlek + ".png");
              Image im = (new javax.swing.ImageIcon(url)).getImage();
              g.drawImage(im, x, y, null );
    Footballfield class:code
    package uppgift2;
    import java.awt.*;
    import java.lang.Thread;
    import java.awt.event.*;
    import static javax.swing.JLabel.*;
    import javax.swing.*;
    public class FotBollsPlan extends JPanel implements MouseListener, ActionListener{
         private java.util.List<FotBoll>fotbollsObjekt;
         private int nrOfBalls;
         private int delay;
         private int loopslot;
         private Timer t;
         private JLabel label = new JLabel();
         public FotBollsPlan(){
         fotbollsObjekt = new java.util.ArrayList<FotBoll>();
         delay = 50;
         t = new Timer(delay, this);
         t.start();
         addMouseListener(this);
    public void paintComponent(Graphics g){
              super.paintComponent(g);
              for (FotBoll fb : fotbollsObjekt){
                   fb.rita(g);
              System.out.println("rita : " + fotbollsObjekt.size());
         public void actionPerformed(ActionEvent ae){
              // An ActionEvent from the timer so we let the timer repaint
              loopslot++;
              System.out.println("loopslot: " + loopslot);
              if(loopslot == 50){
                   //t.stop();
                   delay = 3000;
                   t.setDelay(delay);
                   t.restart();
                   System.out.println("DELAY: " + t.getDelay());
                   repaint();
                   loopslot = 0;
                   System.out.println("XXXX - if sats: " + loopslot);
                   //t.stop();
                   if(delay == 3000){
                        delay = 50;
                   t.setDelay(delay);
                   t.restart();
                   System.out.println("DELAY: " + t.getDelay());
                   //System.out.println("InitialDELAY: " + t.getInitialDelay());
                   repaint();
         public void mouseClicked(MouseEvent me){
              int xfart = (int)(Math.random()*50) - 2;
              int yfart = (int)(Math.random()*50) - 2;
              int storlek = (int)(Math.random()*10) + 1;
              if (me.getButton()== MouseEvent.BUTTON1){
                   FotBoll fb = new FotBoll(me.getX(), me.getY(),xfart, yfart, storlek);
                   fotbollsObjekt.add(fb);
         public void mouseEntered(MouseEvent me) {}
         public void mouseExited(MouseEvent me) {}
         public void mousePressed(MouseEvent me) {}
         public void mouseReleased(MouseEvent me) {}
    code
    code
    Main:
    package uppgift2;
    import java.awt.*;
    import java.awt.event.*;
    import java.net.URL;
    import javax.swing.*;
    public class FotBollMain extends JFrame {
         private FotBoll fb;
         private FotBollsPlan plan1;
    public FotBollMain(){
              setTitle("Test av FotBollsPlan");
              setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              ClassLoader cl = this.getClass().getClassLoader();
              URL url = cl.getResource("fotbollsplan.png");
                        JLabel label = new JLabel(new ImageIcon(url));
              label.setLayout(new GridLayout(1,1));
                        setSize(800, 600);
              setLocation(25, 25);
                        plan1 = new FotBollsPlan();
              plan1.add(label);
                        add(plan1, BorderLayout.CENTER);
                        setVisible(true);
         public static void main(String[] args)
                        FotBollMain test = new FotBollMain();
    code
    Everything works fine when clicking on the panel and the balls starts to bounce around. But in evenly intervalls the panel should "freeze" for a couple of seconds - showing(painting ) all the balls and then go back again bouncing around. I try to setDelay to 3000 ms which means that for this period of time the panel is "frozen" and then setDelay 50 ms, ie the balls should start bouncing around again. But this doesn't work out. This is the actionPerformed method in the class FotBollsPlan. As you understand I've tried different scenarios but I just can't figure out how to get this to work. The way the code works right now is that if I create four balls, they will all be representing an event and I seem to setDelay for every event not the whole Timer. Does anyone understand this?
    By the way, I don't understand the codetags here.
    Anders

    Hi!
    I have a problem with an assignment with bouncing footballs. There are three classes; footBall which picks a football (soccer)from referencelibrary and here I have a swing timer. The next class is footballfield(fotBollsPlan) that also has a timer in it and an arraylist for the footballs. Here I also have a mouseListener, so every time I click on the footballfield I create a new football. And finally a main-class. So, I click on the panel and create footballs that starts to bounc around inside the frame. Here is the code:
    Football class:
    code
    package uppgift2;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.lang.Thread;
    import java.net.URL;
    import javax.swing.*;
    public class FotBoll implements ActionListener{
         private final int storlek;
         private int x;
         private int xfart;
         private int y;
         private int yfart;
         private FotBollsPlan plan;
         public FotBoll (int x, int y, int xfart, int yfart, int storlek){
              this.storlek = storlek;
              this.x = x;
              this.y = y;
              this.xfart = xfart;
              this.yfart = yfart;
              plan = new FotBollsPlan();
              Timer t = new Timer(100, this);
              t.start();
         public void actionPerformed(ActionEvent ae){
                   if (x < 0 || x > 700)
                        xfart = - xfart;
                   if (y < 0 || y > 500)
                        yfart = - yfart;
                   x = xfart + x;
                   y = yfart + y;
         public void rita(Graphics g){
              ClassLoader cl = this.getClass().getClassLoader();
              URL url = cl.getResource("fotboll" + storlek + ".png");
              Image im = (new javax.swing.ImageIcon(url)).getImage();
              g.drawImage(im, x, y, null );
    Footballfield class:code
    package uppgift2;
    import java.awt.*;
    import java.lang.Thread;
    import java.awt.event.*;
    import static javax.swing.JLabel.*;
    import javax.swing.*;
    public class FotBollsPlan extends JPanel implements MouseListener, ActionListener{
         private java.util.List<FotBoll>fotbollsObjekt;
         private int nrOfBalls;
         private int delay;
         private int loopslot;
         private Timer t;
         private JLabel label = new JLabel();
         public FotBollsPlan(){
         fotbollsObjekt = new java.util.ArrayList<FotBoll>();
         delay = 50;
         t = new Timer(delay, this);
         t.start();
         addMouseListener(this);
    public void paintComponent(Graphics g){
              super.paintComponent(g);
              for (FotBoll fb : fotbollsObjekt){
                   fb.rita(g);
              System.out.println("rita : " + fotbollsObjekt.size());
         public void actionPerformed(ActionEvent ae){
              // An ActionEvent from the timer so we let the timer repaint
              loopslot++;
              System.out.println("loopslot: " + loopslot);
              if(loopslot == 50){
                   //t.stop();
                   delay = 3000;
                   t.setDelay(delay);
                   t.restart();
                   System.out.println("DELAY: " + t.getDelay());
                   repaint();
                   loopslot = 0;
                   System.out.println("XXXX - if sats: " + loopslot);
                   //t.stop();
                   if(delay == 3000){
                        delay = 50;
                   t.setDelay(delay);
                   t.restart();
                   System.out.println("DELAY: " + t.getDelay());
                   //System.out.println("InitialDELAY: " + t.getInitialDelay());
                   repaint();
         public void mouseClicked(MouseEvent me){
              int xfart = (int)(Math.random()*50) - 2;
              int yfart = (int)(Math.random()*50) - 2;
              int storlek = (int)(Math.random()*10) + 1;
              if (me.getButton()== MouseEvent.BUTTON1){
                   FotBoll fb = new FotBoll(me.getX(), me.getY(),xfart, yfart, storlek);
                   fotbollsObjekt.add(fb);
         public void mouseEntered(MouseEvent me) {}
         public void mouseExited(MouseEvent me) {}
         public void mousePressed(MouseEvent me) {}
         public void mouseReleased(MouseEvent me) {}
    code
    code
    Main:
    package uppgift2;
    import java.awt.*;
    import java.awt.event.*;
    import java.net.URL;
    import javax.swing.*;
    public class FotBollMain extends JFrame {
         private FotBoll fb;
         private FotBollsPlan plan1;
    public FotBollMain(){
              setTitle("Test av FotBollsPlan");
              setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              ClassLoader cl = this.getClass().getClassLoader();
              URL url = cl.getResource("fotbollsplan.png");
                        JLabel label = new JLabel(new ImageIcon(url));
              label.setLayout(new GridLayout(1,1));
                        setSize(800, 600);
              setLocation(25, 25);
                        plan1 = new FotBollsPlan();
              plan1.add(label);
                        add(plan1, BorderLayout.CENTER);
                        setVisible(true);
         public static void main(String[] args)
                        FotBollMain test = new FotBollMain();
    code
    Everything works fine when clicking on the panel and the balls starts to bounce around. But in evenly intervalls the panel should "freeze" for a couple of seconds - showing(painting ) all the balls and then go back again bouncing around. I try to setDelay to 3000 ms which means that for this period of time the panel is "frozen" and then setDelay 50 ms, ie the balls should start bouncing around again. But this doesn't work out. This is the actionPerformed method in the class FotBollsPlan. As you understand I've tried different scenarios but I just can't figure out how to get this to work. The way the code works right now is that if I create four balls, they will all be representing an event and I seem to setDelay for every event not the whole Timer. Does anyone understand this?
    By the way, I don't understand the codetags here.
    Anders

  • Some problem with bouncing balls animation

    can some body tell how would i move the balls and also detect when a ball is bouncing with other ball or wall in my applet or stand alone application.my program is supposed to generate atleast 2 balls and start moving around .they should reverse their direction,when they get bounced with other balls or walls.

    Hmmm....
    It's really as easy as you've made it - except that when you have intensive graphics calls you should Thread it and try to use a timer to smooth the animation.
    Basically you should :
    paint the balls
    then move them.
    if they're touching/outside the bounds or touching each other reverse their direction but make sure they're within the limits before you repaint
    You should checkout http://www.javagaming.org
    There's alot of code samples and questions related to this kind of thing.
    If you're still in trouble mail me at [email protected] and I'll send you code for a single ball simply bouncing around

  • Bouncing ball not updating fast enough

    I�m trying to make a simple ball that bounces around. The program works okey (but that is not enough ^^). I�m not sure if the problem lies in the timer or the drawing operations. For optimize drawing preformance i�m using a BufferedImage to draw to. Here is the code
    import java.util.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.geom.*;
    import javax.swing.*;
    import javax.swing.Timer;
    import java.awt.geom.*;
    import java.awt.image.*;
    public class TestBall
        public static void main(String[] args)
            BallFrame frame = new BallFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.show();
    class BallFrame extends JFrame
        public BallFrame()
            setTitle("Timer Frame: ");
            //setSize(WIDTH, HEIGHT);
            Container contentPane = getContentPane();
            BallPanel panel = new BallPanel();
            contentPane.add(panel);
        public static final int WIDTH = 400;
        public static final int HEIGHT = 400;
    class BallPanel extends JPanel
        public BallPanel()
            setPreferredSize(new Dimension(panelWidth, panelHeight));
            buffImage = new BufferedImage(panelWidth, panelHeight, BufferedImage.TYPE_INT_RGB);
            cirle = new Ellipse2D.Double(ballPosX, ballPosY, ballWidth, ballHeight);
            middleX = ballPosX + (ballWidth/2);
            middleY = ballPosY + (ballHeight/2);
            gradiantX1 = ballPosX;
            gradiantY1 = ballPosY + (ballHeight/2);
            gradiantX2 = ballPosX + ballWidth;
            gradiantY2 = ballPosY + (ballHeight/2);
            inputKeyHandler listener = new inputKeyHandler();
            addKeyListener(listener);
            timer1 = new Timer(updateTimer, new Timer1());
            timer1.start();
        public boolean isFocusTraversable()
            return true;
        public void paintComponent(Graphics g)
           super.paintComponent(g);
           paintBackGround(g);
           paintBall(g);
           Graphics2D g2 = (Graphics2D)g;
           g2.drawImage(buffImage, 0, 0, this);
       private void paintBackGround(Graphics g)
           Graphics2D g2 = buffImage.createGraphics();
           g2.setColor(Color.black);
           g2.fill(new Rectangle2D.Double(0,0,panelWidth, panelHeight));
       private void paintBall(Graphics g)
           Graphics2D g2 = buffImage.createGraphics();
           g2.setPaint(new GradientPaint(gradiantX1, gradiantY1, Color.blue, gradiantX2, gradiantY2, Color.red));
           g2.fill(cirle);
       private class Timer1 implements ActionListener
           public void actionPerformed(ActionEvent event)
               //System.out.println("Invoked");
               //If hit right wall
               if ((ballPosX + ballWidth) >= panelWidth)
                   ballDx = -ballDx;
               //If hit left wall
               if ((ballPosX <= 0))
                   ballDx = -ballDx;
               //if hit bottom
               if ((ballPosY + ballHeight) >= panelHeight)
                   ballDy = - ballDy;
               //if hit top
               if (ballPosY <= 0)
                   ballDy = -ballDy;
                   ballPosX += ballDx;
                   ballPosY += ballDy;
                   gradiantX1 += ballDx;
                   gradiantY1 += ballDy;
                   gradiantX2 += ballDx;
                   gradiantY2 += ballDy;
                   cirle = new Ellipse2D.Double(ballPosX, ballPosY, ballWidth,
                                                ballHeight);
               repaint();
       private class inputKeyHandler implements KeyListener
            public inputKeyHandler()
            public void keyPressed(KeyEvent key)
                int keyCode = key.getKeyCode();
            public void keyReleased(KeyEvent event){}
            public void keyTyped(KeyEvent event){}
       private javax.swing.Timer timer1;
       private final int panelHeight = 400;
       private final int panelWidth = 400;
       private int ballPosX = 100;
       private int ballPosY = 10;
       private int ballDx = 4;
       private int ballDy = 4;
       private int updateTimer = 50;
       private int ballWidth = 100;
       private int ballHeight = 100;
       private Ellipse2D cirle;
       private Color gradiantColor1;
       private int gradiantX1;
       private int gradiantY1;
       private Color gradiantColor2;
       private int gradiantX2;
       private int gradiantY2;
       private int middleX;
       private int middleY;
       private BufferedImage buffImage;
    }I know its a lot of code, but this is the only way i can think of posting it.
    The id� i simple. After a time has elapsed the bufferedImage need to be redrawn. But when i change the variable updateTimer to= 1 (in code updateTimer=50), the timer doesn�t for sure update it 50 times faster as it should? Therefore i think that the problem has to be somewhere in the drawing operations, but i can�t find how. Does anybody know why?

    Since you have a history of not acknowledging the help you have received on this forum, and not conveying whether the advice given was useful or not, I have absolutely no inclination to offer any ideas on your present problem.
    db

  • Bouncing Ball Just Suddenly Stops Mid Bounce

    I have a application where each time you click the add ball button a new randomly colored ball is added to the jpanel. It works fine except that the balls suddenly stop at the same spot. I want them to continue to bounce for a longer period of time instead of like 8 bounces. It was going around withoutstopping prior to my getting the add new ball part working. I cannot seem to figure out what I did wrong. Also curious if anyone new of a tip as to how to get the balls to disappear once a button is clicked or their cycle runs out. Below is my code:
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.geom.*;
    import java.util.*;
    import javax.swing.*;
    public class BounceBall{
        public static void main(String[] args) {
            JFrame frame = new BounceFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOS  E);
            frame.setVisible(true);
    class BounceFrame extends JFrame {
        private BallCanvas canvas;
        public static final int WIDTH = 450;
        public static final int HEIGHT = 350;
        public BounceFrame() {
            setSize(WIDTH, HEIGHT);
            setTitle("BounceThread");
            Container contentPane = getContentPane();
            canvas = new BallCanvas();
            contentPane.add(canvas, BorderLayout.CENTER);
            JPanel buttonPanel = new JPanel();
            addButton(buttonPanel, "Add Ball",
                    new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    addBall();
            addButton(buttonPanel, "Exit",
                    new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    System.exit(0);
    class BallThread extends Thread {
        private BouncingBall b;
        public BallThread(BouncingBall aBall) { b = aBall; }
        public void run() {
            try {
                for (int i = 1; i <= 1000; i++) {
                    b.move();
                    sleep(5);
            } catch (InterruptedException exception) {
    class BallCanvas extends JPanel {
        private ArrayList balls = new ArrayList();
        public void add(BouncingBall b) {
            balls.add(b);
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D)g;
            for (int i = 0; i < balls.size(); i++) {
                BouncingBall b = (BouncingBall)balls.get(i);
                b.draw(g2);
    class BouncingBall {
        private Component canvas;
        private static final int XSIZE = 15;
        private static final int YSIZE = 15;
        private int x = 0;
        private int y = 0;
        private int dx = 2;
        private int dy = 2;
        public BouncingBall(Component c) { canvas = c; }
        Color color = getColor();
        public void draw(Graphics2D g2) {
            g2.setColor(color);
            g2.fillOval(x,y,30,30);   // adds color to circle
            g2.drawOval(x,y,30,30);   // draws circle
        public void move() {
            x += dx;
            y += dy;
            if (x < 0) {
                x = 0;
                dx = -dx;
            if (x + XSIZE >= canvas.getWidth()) {
                x = canvas.getWidth() - XSIZE;
                dx = -dx;
            if (y < 0) {
                y = 0;
                dy = -dy;
            if (y + YSIZE >= canvas.getHeight()) {
                y = canvas.getHeight() - YSIZE;
                dy = -dy;
            canvas.repaint();
        private Color getColor() {
            int rval = (int)Math.floor(Math.random() * 256);
            int gval = (int)Math.floor(Math.random() * 256);
            int bval = (int)Math.floor(Math.random() * 256);
            return new Color(rval, gval, bval);
        }Edited by: wnymetsfan on Dec 2, 2007 2:01 PM

    wnymetsfan wrote:
    Actually it is comiliable as I ran it numerous times today asI tried to fix it. No, it does not compile. Besides the obvious error:
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOS  E);, a large part of the BounceFrame class seems to be missing: I don't see a addButton(...) anywhere.
    I posted here since it says new to java which I am. I also have posted here before with questions relatedto swing and 2D elements like graphs and no one else had an issue. It's not prohibited to post it here, but in the 2d forums, there are more people who know what they're talking about when it comes to 2D animations.
    Thanks for the links to the other forums I will post there. Sorry to bother you guys as I was not aware that New to Java meant only if it doesn't involves things like swing and 2DIt's not a bother: I merely said it for you to get help sooner.

Maybe you are looking for

  • No Acrobat in my CS5 Design Premium

    Last week I successfully installed (I thought) my newly downloaded Acrobat CS5 Design Premium. Today I went to create a PDF - and found no Acrobat installed. I went to my "Programs and Features" and selected the CS5 installation.  While this gives me

  • Queue to Journal mailbox filling up

    Started yesterday morning but is getting progressively worse. The queue which sends mail to the journal mailbox seems to be processing email, just not fast enough, so the queue continues to get bigger and bigger. No changes were made yesterday. Five

  • Gauges & Instruments Life report

    Dear PM Gurus, In One My scenario, user wants to get the life of gauges & instruments (when its start date and scrap or inactive date)? i am trying in standard report but i am not find any thing. then i went for Query (Quickviewer report) in that one

  • How do I open old mail files held locally within my Thunderbird profile

    I have several old mail files that are in the imap subfolder of my default Thunderbird profile held in Appdata/roaming/thunderbird. The mail accounts are no longer active on the net but I now need to see an old email from several years ago and I can'

  • Dump replacing default configuration

    Dear all, I have following problem with database restore and performance. 1. I have created dump file two days ago. That time, our application was working fast. 2. I just restored dump file today. But it is too slow. I can't find where is the problem