Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsWhite Papers
Discussion GroupsFirst AidDatabasesJavaBeansGUIJava 3DVirtual MachineCORBASecurityToolsGeneral
Java DirectoryOpen Source ProjectsSample Book ChaptersUser GroupsWeb Resources
Related Topics
Databases.NETMore Topics ...

Java Forum / First Aid / August 2006

Tip: Looking for answers? Try searching our database.

Help needed to make this stop().

Thread view: 
bH - 25 Aug 2006 03:14 GMT
Hi All,
I have spent a lot of time looking at possibilites at making this stop,
nothing seems to make it happen. I have looked at the deprecated list
for stop. Still nothing makes it stop short of recompiling or getting
the
task manger to stop it.   Your help is appreciated.

import java.awt.*;

public class FramedBouncingBalls
   extends Frame
   implements Runnable {

   Thread runner;
   Image buffer;
   Graphics gBuffer;
   Ball ball[];
   //how many balls?
   static final int MAX = 3;
   static final int WIDTH = 500;
   static final int HEIGHT = 400;
   private int offScreenBufferWidth;
   private int offScreenBufferHeight;

   public FramedBouncingBalls() {
       super("Bouncing Balls");
       setSize(WIDTH, HEIGHT);

       ball = new Ball[MAX];

       int w = WIDTH;
       int h = 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);

       start();
       setVisible(true);
   }

   public void start() {
       if (runner == null) {
           runner = new Thread(this);
           runner.start();
       }
   }

   public void stop() {
       if (runner != null) {
          // runner.stop();    // the stop method of Thread has been
deprecated as it was unsafe
           setVisible(false);
       }
   }

   public void run() {

       while (true)
           //Thread sleeps for 15 milliseconds here
           try {
               Thread.sleep(15);
           }
           catch (InterruptedException ie) {
           }

           //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) {
       if (getWidth() != offScreenBufferWidth ||
           getHeight() != offScreenBufferHeight) {
           buffer = null;
           gBuffer = null;
           offScreenBufferWidth = getWidth();
           offScreenBufferHeight = getHeight();
       }
       if (buffer == null) {
           buffer = createImage(offScreenBufferWidth,
offScreenBufferHeight);
           gBuffer = buffer.getGraphics();
       }

       //draw a gray background and a grid of lines
       gBuffer.setColor(Color.gray);
       gBuffer.fillRect(0, 0, getWidth(), getHeight());

       gBuffer.setColor(Color.lightGray);

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

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

   public static void main(String[] args) {
       new FramedBouncingBalls();
   }
}

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);
   }
}
Knute Johnson - 25 Aug 2006 04:58 GMT
> Hi All,
> I have spent a lot of time looking at possibilites at making this stop,
[quoted text clipped - 52 lines]
>            // runner.stop();    // the stop method of Thread has been
> deprecated as it was unsafe

                runner.interrupt();

>             setVisible(false);
>         }
[quoted text clipped - 3 lines]
>
>         while (true)

           while (!Thread.interrupted()) {
    or
           while (!runner.isInterrupted()) {

>             //Thread sleeps for 15 milliseconds here
>             try {
[quoted text clipped - 96 lines]
>     }
> }

Signature

Knute Johnson
email s/nospam/knute/

bH - 25 Aug 2006 07:04 GMT
Hi Knute,

Thanks for responding.

I hope that I have made the corrections as you recommended  and those
are
shown below.
As I see now, I am able to stop this by using "STOP"/"Resetting
Interactions" with the IDE. Yet I cannot stop it by a click on the
caption bar using the " X"  that is there while it is running.  I was
wanting this to also stop it.

I now have this :

   public void stop() {
       if (runner != null) {
         runner.interrupt();
           setVisible(false);
       }
   }

   public void run() {
           //Thread sleeps for 15 milliseconds here
       while (!Thread.interrupted()) {
           try {
           Thread.sleep(15);
           }
           catch (InterruptedException ie) {
           }

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

           }
           repaint();
       }
   }
Babu Kalakrishnan - 25 Aug 2006 13:35 GMT
> As I see now, I am able to stop this by using "STOP"/"Resetting
> Interactions" with the IDE. Yet I cannot stop it by a click on the
> caption bar using the " X"  that is there while it is running.  I was
> wanting this to also stop it.

Add the following to your Frame constructor :

addWindowListener(new WindowAdapter())
{
   public void windowClosing(WindowEvent e)
   {
       System.exit(0);
   }
};

BK
bH - 25 Aug 2006 18:09 GMT
Hi

With  help from you both, with
the prior addtions/corrections completed,
and this snip of  the program, both the stop()
and closes with the "X" on the
caption bar are updated/fixed.-

Thanks very much.

bH

import java.awt.*;
import java.awt.event.*;

public class FramedBouncingBalls
 extends Frame
 implements Runnable {

 Thread runner;
 Image buffer;
 Graphics gBuffer;
 Ball ball[];
 //how many balls?
 static final int MAX = 3;
 static final int WIDTH = 500;
 static final int HEIGHT = 400;
 private int offScreenBufferWidth;
 private int offScreenBufferHeight;

 public FramedBouncingBalls() {
   super("Bouncing Balls");
   setSize(WIDTH, HEIGHT);
   addWindowListener(
                     new WindowAdapter() {
     public void windowClosing(
                               WindowEvent e) {
     System.exit(0);
   }
   });
   
................ end of snip


Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.