I have made a java code which displays a blue sphere and lets you control with the mouse where its illumination comes from. (its actually a circle and some parts are painted white/blue/black depending on the mouse position to make it look 3D)

here is the code

it works ok. the only problem is that when you move the mouse it takes too long to update the screen with the next picture.(so the 'light source' seems to be jumping from one place to another if you move the mouse too fast)Code:`import javax.swing.*;`

import java.io.*;

import java.awt.*;

import java.awt.event.*;

import java.awt.image.*;

import javax.imageio.*;

public class esfera extends JFrame{

double azimuth=3*Math.PI/4, inclination=Math.PI/4; //angle coordinates for the 'light source'

private BufferedImage image = new BufferedImage(800,800,BufferedImage.TYPE_INT_RGB); //the image storing the sphere drawing

public esfera(){ //initializer adding a listener to mouse motion

addMouseMotionListener(new MouseMotionAdapter(){

public void mouseDragged(MouseEvent e){

azimuth=((800-e.getX())/800.00)*Math.PI;

inclination=(e.getY()/800.00)*Math.PI;

repaint();

}

});}

public void paint(Graphics g){ //does the whole painting

g.drawImage(image,0,0,null); //paint the current image to the frame

for(int i=0;i<800;i++){ //make next image, pixel by pixel

for(int j=0;j<800;j++){

image.setRGB(i,j,color((i-400)/200.00,(400-j)/200.00));

}

}

}

public int color(double x, double y){ //this is what color each pixel should be painted in order to make the picture look like a sphere

double clr;

double z = Math.sqrt(1-(x*x+y*y));

double angle = Math.acos(Math.cos(inclination)*y+Math.sin(inclina tion)*(Math.sin(azimuth)*z+Math.cos(azimuth)*x));

if(x*x+y*y>1) clr=0;

else if (angle>Math.PI/2) clr=0;

else if (angle>Math.PI/4)clr=255*(2-angle/(Math.PI/4));

else{ int white =((int)(255*(1-angle/(Math.PI/4)))<<8)+((int)(255*(1-angle/(Math.PI/4)))<<16);

clr=white+255;}

return (int)clr;

}

public static void main(String[] args){ //the main method of course

esfera frame = new esfera();

frame.setSize(800,800);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOS E);

frame.setLocationRelativeTo(null);

frame.setVisible(true);

}

}

the question is: how can I fix this problem?

i have been reading about VolatileImage but it seems that you can't write a VolatileImage pixel by pixel, so it's not what i need.

i have also read about BufferStrategy, but i'm not sure if it could help me or not, (didn't completely understand how to use it neither)

could you help me please??? i've been trying to solve it all day...