If you're creating (and disposing) a new image on each frame, you're likely to run into garbage collection thrashing.
Also, for the type of the application you're writing, using repaint() might not be a best choice, as the rendering happens asynchronously on another thread (so you can't really guarantee the same intervals between the frames)
I'd suggest to use active rendering.
The idea is to take the rendering into your own hands.
Say, you'd have a method called
render(Graphics g);
which would render the world to the passed graphics object.
Then in your run() method, inside the loop, you'd have something like:
changeTheWorld();
render(backBufferGraphics);
copyBackBufferToTheScreen();
SleepUntilTheNextFrame();
the copyBackBufferToTheScreen() just copies the
backbuffer to the screen, something like this:
Graphics g = renderingPanel.getGrahics();
g.drawImage(backBuffer, 0, 0, null);
Ideally, you'd use BufferStrategy/FullScreen apis to do this.
Check out the tutorials on the Java2D and AWT home pages for more info on active rendering:
http://java.sun.com/products/java-media/2D/http://java.sun.com/docs/books/tutorial/extra/fullscreen/I'm sure you can find lots of exampleson this board as well.