This week's book giveaway is in the Other Languages forum.We're giving away four copies of Functional Reactive Programming and have Stephen Blackheath and Anthony Jones on-line!See this thread for details.
Win a copy of Functional Reactive Programming this week in the Other Languages forum!

Need help breaking up this code

Michael Ossino
Greenhorn
Posts: 9
I came across some source code for a tutorial, I'd like to try, but for some reason I can't get the code to run. Could some please tell what I'm doing to wrong to run it, or breaking it up?thanks. here is the code:
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
{
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.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);
}
}

Ernest Friedman-Hill
author and iconoclast
Marshal
Posts: 24212
35
It's an applet; it has to be run by the "appletviewer" program or a Web browser. The following will work if you've got a JDK properly installed on your machine.
Put the code in a file Project32.java .
Type "javac Project32.java" at your command prompt.
Create an HTML file "Project32.html" with this one line in it:
<applet code="Project32.class" height=200 width=200></applet>
Type "appletviewer Project32.html" to run the program.

Michael Ossino
Greenhorn
Posts: 9
Thank you. But what about the first half of clode (ball class)? Di i put that code in the same file as project32 or as a seperate file called ball.java?

Ernest Friedman-Hill
author and iconoclast
Marshal
Posts: 24212
35
It all can go in the same file.

Michael Ossino
Greenhorn
Posts: 9
Thanks. I'm just tooling around with the file, and trying to increase the number of balls to 20, and adding in an even hanlder to add a new ball everytime the mouse is clicked, but it' won't go. I think I have the right idea, but it just won't compile. Here si the code I have so far:
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
{
Image Buffer;
Graphics gBuffer;
Ball ball[];
//how many balls?
static final int MAX=20;
public void mouseClicked()
{
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);
ball[5]=new Ball(w,h,50,20,1.5,2.0,Color.blue);
ball[6]=new Ball(w,h,60,100,2.0,-3.0,Color.red);
ball[7]=new Ball(w,h,15,70,-2.0,-2.5,Color.green);
ball[8]=new Ball(w,h,150,60,-2.7,-2.0,Color.cyan);
ball[9]=new Ball(w,h,210,30,2.2,-3.5,Color.magenta);
ball[10]=new Ball(w,h,50,20,1.5,2.0,Color.blue);
ball[11]=new Ball(w,h,60,100,2.0,-3.0,Color.red);
ball[12]=new Ball(w,h,15,70,-2.0,-2.5,Color.green);
ball[13]=new Ball(w,h,150,60,-2.7,-2.0,Color.cyan);
ball[14]=new Ball(w,h,210,30,2.2,-3.5,Color.magenta);
ball[15]=new Ball(w,h,50,20,1.5,2.0,Color.blue);
ball[16]=new Ball(w,h,60,100,2.0,-3.0,Color.red);
ball[17]=new Ball(w,h,15,70,-2.0,-2.5,Color.green);
ball[18]=new Ball(w,h,150,60,-2.7,-2.0,Color.cyan);
ball[19]=new Ball(w,h,210,30,2.2,-3.5,Color.magenta);

}
public void start()
{
if (runner == null)
{
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);
}
}

Craig Wood
Ranch Hand
Posts: 1535
You tried to change the init method in the Applet to mouseClicked. The compiler won't like this. The Applet uses init to put itself together, much like an application uses its constructor(s). To add a mouseClicked method to the applet you would have it implement the MouseListener interface and then add a new mouseClicked method:

In the code below I put the mouse code in a separate class.

 It is sorta covered in the JavaRanch Style Guide.