Activate graphics in new threads in java 6

I am fairly new to java and having some trouble with graphics in threads.
I am making an application that solves a maze by using a ball.  When the ball comes into contact with a wall at a steep angle, it will divide into two separate balls.  This is done using threads.  When a collision is triggered, the current thread will stop and two new threads will carry on with the end coordinates of the previous thread.

I have been unable to finish this part of the code as I cannot get new threads to display graphics.  For some reason, only threads declared in the superclass are able to display graphics.  Once the graphics have been sorted, I will be able to finish the ball-splitting part of the program.  I have attached snippets of the code as well as full code in txt files.  

On another note, I want to pass several variables to the new threads, such as x, y and angle. Is it possible to do this when it is creating a new version of itself?
public void run () {
		boolean alive = true;
		int x_speed = 0;
		int y_speed = 0;
		int angle = 60;
		int wall_angle = 0;
		boolean collision = false;
		int collision_angle =0;
		// lower ThreadPriority 
		// run a long while (true) this means in our case "always" 
		while (alive = true)
			System.out.println("maze(x,y)=" + maze[x_pos][y_pos]);
			x_speed = get_x(x_pos, x_speed, angle);		
			y_speed = get_y(y_pos, y_speed, angle);
			collision = detect_collision(x_pos, y_pos, collision);
			wall_angle = get_wall_angle(x_pos, y_pos, wall_angle);
			if (collision==true){
			collision_angle = get_collision_angle(angle, wall_angle, collision_angle);
				if ((collision_angle <55) || (collision_angle >125)) {
					angle = wall_angle;
					angle = solve_collision_angle(angle, wall_angle, collision_angle);
				else{ //make new thread
				new Thread(this).start();
				alive = false;
			x_pos += x_speed;
			//System.out.println("x = " + x_pos + " ");
			y_pos += y_speed;
			//System.out.println("y = " + y_pos + " ");
		// repaint the applet 
		// Stop thread for 20 milliseconds 
		Thread.sleep (20); 
		catch (InterruptedException ex) 
		// do nothing 
		// set ThreadPriority to maximum value 
// paint function
	public void paint (Graphics draw_tip) {
		int i=0;
		int j=0;
		int scale = 20;
		Graphics2D comp2D = (Graphics2D)draw_tip;
		int x = 0;
		int y = 0;
		//draw the maze
		for (i=0; i<=19; i++){
			for (j=0; j<=19; j++){
				//System.out.println("maze[i][j] = " + maze[i][j]);
			if (big_maze[i][j] == 1){
			comp2D.fillRect(j*scale, i*scale, 20, 20);}
		// paint a filled colored circle 
		Graphics2D tip = (Graphics2D)draw_tip;
		tip.setPaint (; 
		tip.fillOval (x_pos - real_radius, y_pos - real_radius, 2 * real_radius, 2 * real_radius); 

Open in new window

Who is Participating?
objectsConnect With a Mentor Commented:
> Would this be a sub-class of the ball  class or of the ball's superclass?

no, it would contain a list of balls

A better approach would actually be to only use a single thread to manage all the balls, a separate thread for every ball is not really necessary and won't scale that well.

Only components can display graphics so your threads will have to access the paint or paintComponent (depending on what kind of component it is) method of one of those
CPColinSenior Java ArchitectCommented:
Also, your line 13 is eternally setting "alive" to "true," as opposed to checking to see if it is true. It should instead read:
while (alive)

Open in new window

Never miss a deadline with

The revolutionary project management tool is here!   Plan visually with a single glance and make sure your projects get done.

dgossageAuthor Commented:
Thanks, I thought the while loop was acting a bit funny.  Do you have any examples of threads accessing paintComponents?  Is this easy to do?
>  Do you have any examples of threads accessing paintComponents?

threads should never call paintComponent(), thats the job of the paint system.

you should separate your thread class from your component class.
your thread class is effectively a ball class and would handle updating position for that ball.
your component class would contain a list of balls which it would display
when you add a new ball, create a new ball/thread and add it to the list
dgossageAuthor Commented:
Ok, I think I understand it a bit now, although I am still a novice so it doesnt sound all that straightforward. so the paint component needs to be in a separate class.  Would this be a sub-class of the ball  class or of the ball's superclass?

Could you reccomend a good tutorial for this?  Ever one Ive tried tries to put them in the same class, but are usually only dealing with drawing one object.
> Would this be a sub-class of the ball  class or of the ball's superclass?

no, it would contain a list of balls

dgossageAuthor Commented:
Thanks, that sounds like a better idea.  However, each ball will eventually be travelling at different dynamic velocities.  This will be done with the sleep() command.  Will this be possible, as I think the sleep() applies to the whole thread?
you wouldn't use sleep() like that  instead you should be thinking of frames per second for the entire animation and moving your balls appropriately

dgossageAuthor Commented:
By that, do you mean moving each ball a certain number of pixels per frame?  And presumably writing in some code to prevent appearing in walls as well.
basically yes

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.