I'm making a game engine and got stuck at one point.
g.drawImage(BPaint.g2dToImage(bgo.render()), 100, 100, null);
does NullPointerException, even though I check EVERYTHING that connects to Image parameter. The code is used in paintComponent(Graphics) method, written below.
@Override
public void paintComponent(Graphics g){
g2d = (Graphics2D) g;
g2d.setColor(Color.BLACK);
g2d.fillRect(0, 0, getWidth(), getHeight());
BWindow current = BWindow.getCurrentBWindow();
if (current != null) {
for (BGO bgo : current.getBGOs().getBgos()) {
g.drawImage(BPaint.g2dToImage(bgo.render()), 100, 100, null);
}
}
}
This is pretty forward, but you may be stuck while reading at 2 methods - bgo.render() and BPaint.g2dToImage.
BGO is game object, which has Graphics2d method
public Graphics2D render(){
if (bgsu == null) {
return sprite.getGraphics();
} else {
return bgsu.getRule();
}
}
Ignoring BGSU, because it is null, and not used, sprite is an object containing Graphics2D that I want to get. Now to BPaint.g2dToImage(Graphics2D), a method turning Graphics2D to Image.
public static Image g2dToImage(Graphics2D g){
JLabel j = new JLabel();
j.paintAll(g);
return j.createImage(null);
}
After checking everything that should not be null, I don't really know the cause. I hope you can tell me. Below is full stacktrace of NPE. (line 34 is line of method in beginning)
java.lang.NullPointerException
at sun.awt.image.ImageRepresentation.startProduction(ImageRepresentation.java:732)
at sun.awt.image.ImageRepresentation.drawToBufImage(ImageRepresentation.java:807)
at sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:1021)
at sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:3318)
at sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:3296)
at bdk.bjgl.components.BGraphics.paintComponent(BGraphics.java:34)
at javax.swing.JComponent.paint(JComponent.java:1056)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5219)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1572)
at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1495)
at javax.swing.RepaintManager.paint(RepaintManager.java:1265)
at javax.swing.JComponent._paintImmediately(JComponent.java:5167)
at javax.swing.JComponent.paintImmediately(JComponent.java:4978)
at javax.swing.RepaintManager$4.run(RepaintManager.java:824)
at javax.swing.RepaintManager$4.run(RepaintManager.java:807)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:807)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:782)
at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:731)
at javax.swing.RepaintManager.access$1300(RepaintManager.java:64)
at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1720)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)