NullPointerException on DoubleBuffering

Started by
1 comment, last by n3oplasm 11 years, 6 months ago
So I am currently working on a Swing-based level editor for my current game. The Editor that holds everything is a JFrame, holding multiple JScrollPanes for each general purpose (tiles, object properties, room being edited, etc.) To display the content on, I placed a Panel inside of each JScrollpane. However, for the room being edited, I felt it would be necessary to include a child of Panel that uses Runnable to continuously update the Grid object as well as all of the communication.

Oddly though, I have been receiving a NullPointerException in my double-buffering approach. According to my stack trace, the problem lies in the [font=courier new,courier,monospace]Graphics.drawImage()[/font] method, but as you can see my code should be preventing my BufferedImage from being null.

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Panel;
import java.awt.image.BufferedImage;
/**
* Class used to hold room design in progress
* Uses Runnable to keep updated
*
* @author Ian_Donovan
* @date
*/
public class RoomPanel extends Panel implements Runnable{
private static final long serialVersionUID = 1L;
private int w=1,h=1;
private Grid grid = new Grid(800,640,32,32);
public RoomPanel(int w, int h){
super();
this.w=w;
this.h=h;
this.setSize(w,h);
start();
}

//runnable stuff below
public void update(){
BufferedImage bfi = new BufferedImage(w,h,BufferedImage.TYPE_INT_ARGB);
Graphics bfg;
boolean buffered = true;
bfg = bfi.getGraphics();
if (bfg==null || bfi == null){
buffered = false;
bfg=this.getGraphics();
}
bfg.setColor(Color.BLACK);
bfg.fillRect(0, 0, w, h);
grid.draw(bfg);
if (buffered){
Graphics finalGraphics = this.getGraphics();
finalGraphics.drawImage(bfi,0,0,null);
finalGraphics.dispose();
}
bfg.dispose();
}
//RUNNABLE THREADING WORKS FINE (Coppied from working code of other projects)
}

For those looking to test it, [font=courier new,courier,monospace]Grid.draw()[/font] only draws a small rectangle for now, so I felt as if it was unnecessary to include.

If someone could explain this error, I would be very grateful :)
Thank you so much in advance.
Advertisement
This block:
if (bfg==null || bfi == null){
buffered = false;
bfg=this.getGraphics();
}

If im correct, when bfi is null, you don't do anything to fix it right? So if it's null, it keeps being null. Then you do:

if (buffered){
Graphics finalGraphics = this.getGraphics();
finalGraphics.drawImage(bfi,0,0,null);
finalGraphics.dispose();
}

And send bfi as parameter in drawImage. If it was null, you'd be sending a null right there.

Moreover, you do this: bfg = bfi.getGraphics(); before checking if bfi is null. If bfi is null from the get go, it'd trow a NullPointer exception right there.

BUT, you actually call a BufferedImage constructor so it shouldn't be null at all (i guess that if the JVM failed to allocate memory for an object you'd have bigger issues than a nullpointer :D ).

Then this line: finalGraphics.drawImage(bfi,0,0,null); That null right there is supposed to work anyways? I also read that you should use createGraphics instead of getGraphics in the documentation.

Aaaand thats all I can point out. I have no experience with Graphics in Java :D (well, I actually have but it was just for drawing some squares and I forgot all of it :P)

"I AM ZE EMPRAH OPENGL 3.3 THE CORE, I DEMAND FROM THEE ZE SHADERZ AND MATRIXEZ"

My journals: dustArtemis ECS framework and Making a Terrain Generator

The call to this.getGraphics() will return null if the component is not visible (i.e. the panel has been added to a JFrame which is not currently set to visible at the time the thread is running). My guess is that finalGraphics is null at the time finalGraphics.drawImage(bfi,0,0,null); is being called. As far as I know, a call to getGraphics (or the preferred createGraphics as TheChubu pointed out) of a BufferedImage object should not return null.

Also, unless there's a reason you aren't currently, I'd consider using the BufferStrategy class that the Java library provides for double-buffering. See the links below for examples of usage in an active-rendering loop. Hope that helps!

http://docs.oracle.com/javase/tutorial/extra/fullscreen/bufferstrategy.html
http://www.gamedev.net/page/resources/_/technical/general-programming/java-games-active-rendering-r2418

This topic is closed to new replies.

Advertisement