flicker : Java Glossary
©1996-2017 Roedy Green of Canadian Mind Products
Here are some things to try to avoid flicker:
This is a complicated topic. Tricks for AWT
and Swing differ.
- In a Canvas.paint
(), there is no need to call super. paint() since update() will have
already cleared the screen.
- In your update routine, don’t erase anything,
just call paint. paint then
must paint the entire Canvas. You override update() to just directly call paint()
without the g. clearRect(0, 0, width, height);.
- In your update routine, just erase the parts of the
image that will become background, perhaps even only the parts that are not already
- Use Swing which has double buffering built-in. You must override paintComponent rather than paint to get
the automatic double buffering. Oddly, sometimes turning double buffering off with
JComponent. setDoubleBuffered( false ) might
- Use manual double buffering in AWT (Advanced Windowing Toolkit).
Prepare all your images ahead of time with createImage and blast them to the screen (without erasing first)
with drawImage in your paint routine. Because Images are
platform dependent, you can’t simply instantiate them with a constructor.
You have to create them through calls like Applet.getImage(), Component. createImage(), or
Toolkit. getDefaultToolkit(). getImage().
- In Windows, in Swing, you will see the entire screen repaint from time to time
for no apparent reason, causing an annoying flicker. This is due to the fact that
Swing uses DirectDraw for rendering which periodically redraws just to be safe. You
can turn off DirectDraw and use standard Windows GDI (Graphics Device Interface)
rendering by starting
Java.exe -Dsun.java2d.noddraw=true MyClass
This will slightly slow down painting, however.
- In Swing, use setOpaque( true ) to arrange for the system to draw the background in for
you. This seems to work better than drawing it yourself with clearRect.
- If you tie up the Swing thread, it can never get around to processing events
and updating the screen. If you have entensive computation, start up a background
thread and do your GUI (Graphic User Interface) work via