2016-07-06 8 views
-2

Ich bin eine Nullpointer-Ausnahme bei der folgenden Zeile bekommen ...Nullpointer auf Graphics setColor()

p1.setColor(Color.green); 

Code:

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.color.ColorSpace; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Main extends JPanel implements KeyListener { 


    public int FRAME_WIDTH = 800, FRAME_HEIGHT = 650; 
    public Image screen; 

    //Player 1 
    public int x = 100; 
    public int y = 100; 
    public int px = 117; 
    public int py = 115; 
    public boolean up, down, right, left; 
    public Graphics p1; 

    //Player 2 
    public int x2 = 600; 
    public int y2 = 100; 
    public int px2 = 617; 
    public int py2 = 115; 
    public boolean up2, down2, right2, left2; 
    public Graphics p2; 

    public static void main(String[] args) { 
     JFrame frame = new JFrame("Game"); 
     Main main = new Main(); 
     frame.add(main); 
     frame.setSize(main.FRAME_WIDTH, main.FRAME_HEIGHT); 
     frame.setBackground(Color.BLACK); 
     frame.setVisible(true); 
     frame.setResizable(false); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     main.screen = frame.createImage(main.FRAME_WIDTH, main.FRAME_HEIGHT); 
     main.p1 = main.screen.getGraphics(); 
     main.p2 = main.screen.getGraphics(); 

     while(true) { 
      //Player 1 
      if(main.up = true) { 
       main.y+=2; 
      } 
      if(main.down = true) { 
       main.y-=2; 
      } 
      if(main.right = true) { 
       main.x+=2; 
      } 
      if(main.left = true) { 
       main.x-=2; 
      } 

      //Player 2 
      if(main.up2 = true) { 
       main.y2+=2; 
      } 
      if(main.down2 = true) { 
       main.y2-=2; 
      } 
      if(main.right2 = true) { 
       main.x2+=2; 
      } 
      if(main.left2 = true) { 
       main.x2-=2; 
      } 

      frame.repaint(); 
      try { 
       Thread.sleep(20); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 

    } 

    @Override 
    public void paintComponent(Graphics g) { 
     String player1 = "Player 1"; 
     String player2 = "Player 2"; 
     p1.setColor(Color.green); 
     p2.setColor(Color.green); 
     p1.drawString(player1, x, y); 
     p2.drawString(player2, x2, y2); 
     p1.setColor(Color.red); 
     p2.setColor(Color.red); 
     p1.fillOval(px, py, 5, 5); 
     p2.fillOval(px2, py2, 5, 5); 
     g.drawImage(screen, 0, 0, this); 
    } 

    @Override 
    public void keyPressed(KeyEvent e) { 

     //Player 1 
     if(e.getKeyCode() == KeyEvent.VK_W) { 
      up = true; 
     } 
     if(e.getKeyCode() == KeyEvent.VK_S) { 
      down = true; 
     } 
     if(e.getKeyCode() == KeyEvent.VK_D) { 
      right = true; 
     } 
     if(e.getKeyCode() == KeyEvent.VK_A) { 
      left = true; 
     } 


     //Player 2 
     if(e.getKeyCode() == KeyEvent.VK_UP) { 
      up2 = true; 
     } 
     if(e.getKeyCode() == KeyEvent.VK_DOWN) { 
      down2 = true; 
     } 
     if(e.getKeyCode() == KeyEvent.VK_RIGHT) { 
      right2 = true; 
     } 
     if(e.getKeyCode() == KeyEvent.VK_LEFT) { 
      left2 = true; 
     } 
    } 

    @Override 
    public void keyReleased(KeyEvent e) { 

     //Player 1 - Release 
     if(e.getKeyCode() == KeyEvent.VK_W) { 
      up = false; 
     } 
     if(e.getKeyCode() == KeyEvent.VK_S) { 
      down = false; 
     } 
     if(e.getKeyCode() == KeyEvent.VK_D) { 
      right = false; 
     } 
     if(e.getKeyCode() == KeyEvent.VK_A) { 
      left = false; 
     } 

     //Player 2 - Release 
     if(e.getKeyCode() == KeyEvent.VK_UP) { 
      up2 = false; 
     } 
     if(e.getKeyCode() == KeyEvent.VK_DOWN) { 
      down2 = false; 
     } 
     if(e.getKeyCode() == KeyEvent.VK_RIGHT) { 
      right2 = false; 
     } 
     if(e.getKeyCode() == KeyEvent.VK_LEFT) { 
      left2 = false; 
     } 


    } 

    @Override 
    public void keyTyped(KeyEvent e) { 

    } 

} 
+0

@azu refrog Ich nehme an, er beabsichtigt 'main.p1 = main.screen.getGraphics();', um 'p1' einen Wert zu geben. Ich glaube nicht, dass das Duplikat-Flag hier angebracht ist - diese Frage bezieht sich speziell darauf, warum die Methode, die er versucht hat, einen Wert für "p1" zuzuweisen, nicht funktioniert, um ihm einen Wert zuzuweisen. – nhouser9

+1

Ihrem Bildschirmobjekt wurde niemals ein Wert zugewiesen. Es ist null. Ich nehme an, dass paintcomponent tatsächlich aufgerufen wird, lange bevor Sie versuchen, ein Grafikobjekt von main.screen zu erstellen (da Sie den Rahmen sichtbar gemacht haben), so dass Sie NPE an diesem Punkt erhalten. – arynaq

+0

es funktioniert für mich, ohne Ausnahme! –

Antwort

1

Wie arynaq gesagt, das Graphics-Objekt nie einen Wert gegeben , also müssen Sie das initialisieren, aber für Ihr Problem mit dem Schlüssel-Listener müssen Sie dem Rahmen einen Schlüssel-Listener hinzufügen, um dieses Problem zu lösen:

frame.addKeyListener(this);