-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) {
}
}
@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
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
es funktioniert für mich, ohne Ausnahme! –