I am relatively new in Java and I got stuck with "AWT-EventQueue-0" error. I tried to search a lot but I still can't fix my code.
I am trying to make a Hangman game with numbers, the program creates a random number between 1 and 100. Then the program will create a button grid of 100 buttons. You have 10 guesses after what, the program will show a popup box and ask if you want to play another game. If you win, the program will beep and the popup box will show up.
Here is my GameFrame class, where I create my root panel and buttons grid:
...
public int wrongGuess = 5;
public GameFrame() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(1000, 500);
rootPanel.setLayout(new BoxLayout(rootPanel, BoxLayout.X_AXIS));
rootPanel.add(getButtonGrid(), BorderLayout.CENTER);
rootPanel.add(gp, BorderLayout.CENTER);
add(rootPanel);
setFocusable(true);
setCentered(true);
setVisible(true);
}
private Container getButtonGrid() {
JPanel buttonsGrid = new JPanel(new GridLayout(10,10,0,0));
Dimension d = new Dimension(0,20);
for (int i = 1; i < buttons.length; i++) {
buttons[i] = new JButton(String.valueOf(i));
buttons[i].setPreferredSize(d);
buttons[i].addActionListener(this);
buttonsGrid.add(buttons[i]);
}
return buttonsGrid;
}
@Override public void actionPerformed(ActionEvent ae) {
boolean win = false;
wrongGuess = wrongGuess + 1;
setWrongGuess(wrongGuess);
int buttonNumber = Integer.valueOf(((JButton) ae.getSource()).getActionCommand());
if (buttonNumber == ge.getGuessingNumber()) {
win = true;
buttons[buttonNumber].setBackground(new Color(60,179,113));
buttons[buttonNumber].setOpaque(true);
Toolkit.getDefaultToolkit().beep();
ge.start();
} else {
if (buttonNumber > ge.getGuessingNumber()) {
buttons[buttonNumber].setBackground(new Color(220,20,60));
buttons[buttonNumber].setOpaque(true);
}
if (buttonNumber < ge.getGuessingNumber()) {
buttons[buttonNumber].setBackground(new Color(255,255,102));
buttons[buttonNumber].setOpaque(true);
}
}
if (wrongGuess == 10) {
win = true;
ge.start();
setWrongGuess(0);
}
if (win == true) {
for (int i = 1; i < buttons.length; i++) {
buttons[i].setBackground(null);
}
}
}
...
Every time when the user has a wrong guess, I want to display a "Hangman part" (ex. arm, leg...etc).
Here is my GamePanel class:
GameFrame gf;
public GamePanel() {
this.setSize(500, 500);
this.setVisible(true);
this.setFocusable(true);
}
public void paint(Graphics comp) {
super.paintComponent(comp);
int wrongGuess = gf.wrongGuess;
if (wrongGuess == 5) {
comp.drawOval(162, 150, 50, 50);
comp.drawLine(188, 200, 188, 275);
comp.drawLine(148, 235, 188, 215);
comp.drawLine(188, 215, 228, 235);
comp.drawLine(188, 275, 228, 335);
comp.drawLine(148, 335, 188, 275);
}
repaint();
}
I assuming that I declared "wrongGuess" incorrectly but I don't know what I did wrong. Can anyone please help me to find the right way of solving this error?
My error:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at micro.project.GamePanel.paint(GamePanel.java:21)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paint(JComponent.java:1065)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paint(JComponent.java:1065)
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:5217)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1579)
at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1502)
at javax.swing.RepaintManager.paint(RepaintManager.java:1272)
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:1975)
at java.awt.Window.paint(Window.java:3904)
at javax.swing.RepaintManager$4.run(RepaintManager.java:842)
at javax.swing.RepaintManager$4.run(RepaintManager.java:814)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:789)
at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:738)
at javax.swing.RepaintManager.access$1200(RepaintManager.java:64)
at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1732)
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$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
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)
PS: Sorry for my broken English