Tutorials : Java by Example : Section 6 :
Section Six Contents
Using Mousemove and Mousedrag
Keyboard Commands and Playing Sound
Detecting Collisions and Intersections
A Bouncing Balls Applet

Input Devices

A Bouncing Balls Applet

The following applet is a little more advanced. We use a separate class to represent the balls and create 5 objects of it. To make it more interesting, we not only assign different colors, but also different initial movement direction (clockwise / counterclockwise), speed and angle. The coordinates of the balls (x, y) must be stored in floating point values here, to provide a smooth and exact movement. To avoid casting, we use the double type. The variables xinc and yinc are added to x and y in every new frame, in order to move the balls around. The value of these variables and their sign (+ / -) is responsible for speed and direction.

//Sourcecode

import java.awt.*;
import java.applet.*;

class Ball
{
        //the boundaries of the window and the diameter of our ball
        //we tell our balls the window size by constructor, so we can
        //change the applet's size easily
        int width, height;
        static final int diameter=30;
        //coordinates and value of increment
        double x, y, xinc, yinc;
        Color color;
        Graphics g;

        //the constructor
        public Ball(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;
        }

        public void move()
        {
            x+=xinc;
            y+=yinc;

            //when the ball bumps against a boundary, it bounces off
            if(x<0 || x>width-diameter)
            {
                    xinc=-xinc;
                    x+=xinc;
            }

           if(y<0 || y>height-diameter)
            {
                   yinc=-yinc;
                   y+=yinc;
            }
        }

        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);
        }
}

public class Project32 extends Applet implements Runnable
{
        Thread runner;
        Image Buffer;
        Graphics gBuffer;
        Ball ball[];
        //how many balls?
        static final int MAX=5;

        public void init()
        {
                Buffer=createImage(size().width,size().height);
                gBuffer=Buffer.getGraphics();

                ball=new Ball[MAX];

                int w=size().width;
                int h=size().height;

                //our balls have different start coordinates, increment values
                //(speed, direction) and colors
                ball[0]=new Ball(w,h,50,20,1.5,2.0,Color.blue);
                ball[1]=new Ball(w,h,60,100,2.0,-3.0,Color.red);
                ball[2]=new Ball(w,h,15,70,-2.0,-2.5,Color.green);
                ball[3]=new Ball(w,h,150,60,-2.7,-2.0,Color.cyan);
                ball[4]=new Ball(w,h,210,30,2.2,-3.5,Color.magenta);
        }

        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 sleeps for 15 milliseconds here
                        try {runner.sleep(15);}
                        catch (Exception e) { }

                        //move our balls around
                        for(int i=0;i<MAX;i++)
                                ball[i].move();

                        repaint();
                }
        }

        public void update(Graphics g)
        {
                paint(g);
        }

        public void paint(Graphics g)
        {
                //draw a gray background and a grid of lines
                gBuffer.setColor(Color.gray);
                gBuffer.fillRect(0,0,size().width,size().height);

                gBuffer.setColor(Color.lightGray);

                for(int x=0;x<size().width;x+=50)
                        gBuffer.drawLine(x,0,x,size().height);

                for(int y=0;y<size().height;y+=50)
                        gBuffer.drawLine(0,y,size().width,y);

                //paint our balls
                for(int i=0;i<MAX;i++)
                        ball[i].paint(gBuffer);

                g.drawImage (Buffer,0,0, this);
          }
}

How to Add Java Applets to Your Site

New on the Java Boutique:

New Review:

Time Management Made Easy with the Quartz Enterprise Job Scheduler
Why not just use the Java timer API? This open source scheduling API boasts simplicity, ease-of-integration, a well-rounded feature set, and it's free!

New Applet:

Reverse Complement
Reverse Complement is a simple applet that converts DNA or RNA sequences into three useful formats.

Elsewhere on internet.com:

WebDeveloper Java
Lots of Java information on webdeveloper.com

WDVL Java
Thorough Java resource at the Web Developer's Virtual Library.

ScriptSearch Java
Hundreds of free Java code files to download.

jGuru: Your View of the Java Universe
Customizable portal with online training, FAQs, regular news updates, and tutorials.