Java graphics are flashing

game-development, java, java-2d, windows

Solution

I see why it is flickering ----

`BufferStrategy` is doing a separate painting job from the Component's `paint()` method and they seem to use different `Graphics` objects and they are refreshing at a different rate --

when `paint()` is invoked before `show()`, it's fine. But

when `paint()` is invoked after `show()`, it will repaint the component to its initial blank look -- so flashing happens.

It's very easy to eliminate the flickering: override `paint()` method of your `JFrame` (`GameMain`) as you don't need it to do anything (`BufferStrategy` can give you more precise control on painting stuffs):

@Override
public void paint (Graphics g) {}

That's all. (I have tested it and it works fine, hope this may help :))

===== Update =====

Instead of overriding `paint()` method, a better way is to call `setIgnoreRepaint(true)` for your `JFrame` (`GameMain`) -- this method is just designed for such purposes! USE IT!

private GameMain(String ... args)
{
    setIgnoreRepaint(true);
    .....
}

Problem

Okay, I understand your need for an SSCCE, so I created (my first) one. I managed to replicate the problem with under 200 lines of code. On my system this demo compiled and ran perfectly (only the flickering was still there of course). I stripped everything that had nothing to do with it. So basically we have two source files now: the screen manager and the game manager. The screen manager: http://pastebin.com/WeKpxEXW The game manager: http://pastebin.com/p3C5m8UN You can compile this code with this make file (I use a ported version of Linux' make for Windows): CC = javac BASE = nl/jorikoolstra/jLevel CLASS_FILES = classes/$(BASE)/Game/GameMain.class classes/$(BASE)/Graphics/ScreenManager.class ``` jLevel: $(CLASS_FILES) @echo Done. classes/%.class : src/%.java @echo Compiling src/$*.java to $@ [command: $(CC) src/$*.java ] ... @$(CC) -Xlint:unchecked -d classes -classpath src src/$*.java ``` Where the source files are placed in the `/src` directory and the classes in the `/classes` directory. After compilation to byte-code the game can be started using the following .bat file: ``` @set STARUP_CLASS=nl.jorikoolstra.jLevel.Game.GameMain @set ARGUMENTS=1280 1024 32 @java -cp classes;resources %STARUP_CLASS% %ARGUMENTS% ``` Note that the `ARGUMENT` variable depends on your own screen settings and that you have to change it so that the game is displayed in the right resolution for your screen.

Original source