0

I am trying to draw a grid of rectangles on a JPanel that already has a few JButtons on it. I get a big list of errors when I try to run it.

Here's my code:

package GameOfLife;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.*;
import java.awt.geom.*;

import javax.swing.JButton;
import javax.swing.JPanel;

public class GamePanel extends JPanel implements ActionListener, Runnable {

public static final int WIDTH = 640;
public static final int HEIGHT = 480;
public static final int RECT = 50;

private boolean running;

private JButton startButton;
private JButton stopButton;
private JButton clear;

private Game game;

public GamePanel() {
    super();
    setPreferredSize(new Dimension(WIDTH, HEIGHT));
    running = false;
    Game game = new Game();
    game.setSize(30);
    startButton = new JButton("Start");
    add(startButton);
    stopButton = new JButton("Stop");
    add(stopButton);
    clear = new JButton("Clear");
    add(clear);
}

public void actionPerformed(ActionEvent e) {
    if(e.getSource()== startButton) {
        running = true;
    }
    if(e.getSource()== stopButton) {
        running = false;
    }
}

public void paintComponent(Graphics g) {

    Graphics2D g2 = (Graphics2D) g;
    super.paintComponent(g2);
    Rectangle2D rect = new Rectangle2D.Double(RECT,RECT,10,10);
    int BOX_DIM = 1;
    g2.setColor(Color.WHITE);
    for(int i = 0; i<game.getSize(); i++) {
        for(int j = 0; j<game.getSize(); j++) {
            g2.drawRect(RECT+i*BOX_DIM, RECT+j*BOX_DIM, BOX_DIM, BOX_DIM);
            g2.fillRect(RECT+i*BOX_DIM, RECT+j*BOX_DIM, BOX_DIM, BOX_DIM);
        }
    }
    g2.fill(rect);
    g2.draw(rect);
}

@Override
public void run() {

}
}

and then here are all the errors I'm getting:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at GameOfLife.GamePanel.paintComponent(GamePanel.java:58)
at javax.swing.JComponent.paint(JComponent.java:1056)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paint(JComponent.java:1065)
at javax.swing.JLayeredPane.paint(JLayeredPane.java:586)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5226)
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.paint(JComponent.java:1042)
at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:39)
at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:79)
at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:116)
at java.awt.Container.paint(Container.java:1973)
at java.awt.Window.paint(Window.java:3912)
at javax.swing.RepaintManager$4.run(RepaintManager.java:835)
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)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at GameOfLife.GamePanel.paintComponent(GamePanel.java:58)
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)

Any help is much appreciated!

Jared
  • 578
  • 7
  • 21
  • Does `game` have data in it? That is what is the error. – Uma Kanth Jun 15 '15 at 15:54
  • Could you please point out line # **58** in your `GamePanel.java` file? – PM 77-1 Jun 15 '15 at 15:54
  • See [What is a Null Pointer Exception, and how do I fix it?](http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and-how-do-i-fix-it). – PM 77-1 Jun 15 '15 at 15:56
  • for(int i = 0; i – Jared Jun 15 '15 at 15:57
  • As a side note, a call to fillRect() and drawRect() is not necessary if you are keeping the same color. Just use fillRect for the rectangles instead of both. –  Jun 15 '15 at 16:00

1 Answers1

2

I think the game variable is null because you define it and don't initialize it.

private Game game;

public GamePanel() {
    ...
    Game game = new Game();
    ...
}

you should initialize the class variable game instead of creating a new one, try:

public GamePanel() {
    ...
    game = new Game();
    ...
}
Titus
  • 22,031
  • 1
  • 23
  • 33
  • 1
    Yep, OP's `local` variable `game` is [shadowing](http://stackoverflow.com/questions/1092099/what-is-variable-shadowing-used-for-in-a-java-class) its class namesake. – PM 77-1 Jun 15 '15 at 16:04