eine nullpointerexception, wo sie nicht sein sollte

Stormblade

Mitglied
Hallo, aus mir unerfindlichen Gründen bekomme ich in meinem neuen projekt eine NullPointerException. Hierzu mein code:

Java:
public class Spieloberfläche extends JPanel{

  Painter painter;

  public Spieloberfläche(){
    super();
    painter = new Painter(this);
    painter.start();
    this.setFocusable(true);
  }
	
  public void paint(Graphics g){
    super.paint(g);
  }
}

public class Painter extends Thread{

  Graphics g = null;
  JPanel parent = null;

  public Painter(JPanel parent)	{
    this.parent = parent;
  }

  public void paint(){
    g = parent.getGraphics();
    g.setColor(Color.blue);
  }			

  public void run(){
    this.paint();
  }
}
Schon bei der setColor-Methode bekommt mein programm probleme... g ist zu dem Zeitpunkt noch mit "null" belegt, doch ich kann mir das beim besten Willen nicht erklären, denn in einem anderen Programm habe ich dies genau gleich gemacht, mit erfolg.
Ich hoffe nur, dass mich jemand auf einen Fehler aufmerksam machen kann :) :)
 
T

Tomate_Salat

Gast
Ich kann dich leider auf 2 Fehler aufmerksam machen ;-). Beim Zeichnen mit von Swing tut man folgendes nicht:

1) man überschreibt bei swing nicht die paint-Methode (du hast effektiv zwar nix geändert, aber der Ansatz ist ja da)
2) man arbeitet nicht mit getGraphics.

Richtig wäre es, wenn du die paintComponent()-Methode überschreibst und dort auch das Zeichnen durchführst.

Dann noch so am Rande:
Umlaute sind ein hässliche Geschichte, die ich vermeiden würde. Also lieber: Spieloberflaeche. Dann hast du auch ein English-Deutsch-Gemisch. Letzendlich würde ichs einfach GamePanel nennen.
 

Stormblade

Mitglied
Hm ok danke, ich werd mich um einen besseren programmierstil bemühen :D
Kann mir dennoch jemand vielleicht ein klitzekleines programm schreiben, in dem es wie oben 2 klassen (ohne die mainmethode) gibt? In der ersten klasse soll das JPanel sein und in der zweiten Klasse (die einen Thread extended) wird in das JPanel ein viereck hineingezeichnet. Kann mir da jemand ein beispiel machen? Damit wär mir glaub ich am besten geholfen :)
 

Melfis

Aktives Mitglied
Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.Calendar;
import java.util.GregorianCalendar;

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

public class JPaintPanel extends JPanel {

	BufferedImage bi;
	final Painter p;

	public JPaintPanel() {
		this.setPreferredSize(new Dimension(400, 400));
		bi = new BufferedImage(400, 400, BufferedImage.TYPE_INT_RGB);
		p = new Painter(this);
		p.start();
	}

	public BufferedImage getBufferedImage() {
		return bi;
	}

	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		synchronized (bi) {
			g.drawImage(bi, 0, 0, bi.getWidth(), bi.getHeight(), Color.WHITE,
					null);
		}

	}

	public static void main(String[] args) {
		JFrame jfr = new JFrame("Test");
		jfr.getContentPane().add(new JPaintPanel());
		jfr.pack();
		jfr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jfr.setVisible(true);
	}

}

class Painter extends Thread {
	JPaintPanel jpp;
	Calendar calendar = new GregorianCalendar();
	int second=0;

	public Painter(JPaintPanel jpp) {
		this.jpp = jpp;
	}

	public void run() {
		while (true) {
			if (second != Calendar.getInstance().get(Calendar.SECOND)) {
				second = Calendar.getInstance().get(Calendar.SECOND);
				synchronized (jpp.getBufferedImage()) {
					Graphics2D g2 = jpp.getBufferedImage().createGraphics();
					g2.clearRect(0, 0, 400, 400);
					g2.translate(200, 200);
					g2.rotate(second / 30.0 * Math.PI);
					g2.drawLine(0, 0, 0, -100);
				}
				jpp.paintImmediately(100, 100, 200, 200);
			} else {
				try {
					Thread.sleep(10);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}

}

Quelltext ohne Gewähr! Ich bin nicht so der Swing/Thread experte ;)

MFG Melfis
 
S

Spacerat

Gast
2) man arbeitet nicht mit getGraphics.
@TO: Das hat weniger mit besserem Programmierstil zu tun, als mit Fehlerträchtigkeit. Besagtes "getGraphics()" sorgt nämlich unterumständen für deine NPE.
Ein klitzekleines Programm ist auch nicht nötig. Wenn du deine "Verrenkungen" (inkl. "getGraphics()") eine "paint()"-Methode zu implementieren lassen würdest und statt dessen die bereits vorhandene "repaint()"-Methode verwenden würdest, ist scheinbar alles okay mit deinem. ;)
[EDIT]Melfis Code wäre auch 'ne Möglichkeit. Aber @Melfi: Kann es sein, dass du da etwas zu viel synchronisierst?[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:
V

vanny

Gast
Java:
import java.awt.Color;
import java.awt.Graphics;

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

public class ZeichenPanel extends JPanel{
	

	private static final long serialVersionUID = 1L;
	private int pX, pY;

	
	public void paintComponent(Graphics g){
		super.paintComponent(g);
		g.setColor(Color.RED);
		g.fillRect(pX, pY, 30, 10);
		System.out.println("Neu gezeichnet an Position: " + pX + ", " + pY);
	}
	
	public void drawOnNewPosition(int pX, int pY){
		this.pX = pX;
		this.pY = pY;
		repaint();
	}
	
	public static void main(String[] args) {
		JFrame fr = new JFrame();
		fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		fr.setSize(600, 400);
		
		ZeichenPanel zPnl = new ZeichenPanel();
		fr.add(zPnl);
		
		ZeichenThread zTh = new ZeichenThread(zPnl);
		fr.setVisible(true);
		zTh.start();
		
	}

}

Java:
public class ZeichenThread extends Thread{
	
	private ZeichenPanel zPnl;
	
	public ZeichenThread(ZeichenPanel zPnl){
		this.zPnl = zPnl;
	}
	
	public void run(){
		if(zPnl!=null){
			while(true){
				int pX = (int)(Math.random()*600);
				int pY = (int)(Math.random()*400);
				 zPnl.drawOnNewPosition(pX, pY);
				 System.out.println("Neuzeichnen angestoßen an " + pX + ", " + pY);
				try {
					Thread.sleep(2000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}

}

edit: eben ma hinproggen dauert hier echt zu lange :p
 

Melfis

Aktives Mitglied
@Spacerat: Dann bekomm ich eklige Artefakte, bzw. es werden unfertige Zeichnungen ausgegeben. Deswegen die Syncro-Blöcke, ich bin aber für Verbesserungsvorschläge offen!

MFG Melfis
 
S

Spacerat

Gast
[OT]@Melfis: War ehrlich gesagt nur 'ne Frage. Ich hatte mal ähnliches programmiert, bis sich die beiderseitige Synchronisation gravierend auf die FPS niederschlug. Habe dann nur eine Seite (jene, in der das Image gezeichnet werden sollte) synchronisiert und es hatte keinen negativen Effekt aber die FPS waren wieder da. Das kann Zufall sein oder aber auch daran liegen, dass synchronized den Zugriff auf das komplette Objekt inkl. Methodenaufrufe für andere Threads sperrt. So Fit bin ich auch nicht in Sachen Threads.[/OT]
 

Stormblade

Mitglied
Ok, ich danke euch sehr für eure bemühungen mir zu helfen :) :) . Wenn ich das richtig verstanden habe, versucht ihr mir alle zu zeigen, dass ich in der JPanel-Klasse etwas zeichnen soll, und dieses gezeichnete "objekt" dann in einer Thread-Klasse verändern kann :) oder?
In meinem Fall ist es jetzt so, dass ich ungefähr an die 70 aufwärts bilder in mein JPanel zeichnen will. Da ich meine JPanel-klasse nicht so aufblähen will, müsste ich doch auch den zeichenvorgang erst in der Thread-klasse starten können oder? So dass ich in der Thread-Klasse befehle: Zeichne jetzt in das JPanel der Über-Klasse ein rechteck hinein, das dort noch nicht definiert wurde :D Vielleicht habe ich eure codes auch nicht richtig verstanden, könnt ihr mir bitte auf dieses anliegen nochmal antworten? :) :)
 
V

vanny

Gast
Klares Jain:D

Das Zeichnen auf das JPanel gehört in die
Code:
paintComponent();
und nur da hin und auch nur das Zeichnen.
Es ist ja letztendlich nur ein Bild auf dem JPanel zu sehen (die Summe aller dazustellenden Dinge eben).
Dann kannst du natürlich extern ein BufferedImage zusammenmalen und dieses dann von der paintComponent-Methode zeichnen lassen.

Gruß Vanny
 
Zuletzt bearbeitet von einem Moderator:

Melfis

Aktives Mitglied
Ich beziehe mich jetzt mal auf mein Beispiel:

Der seperate Thread erledigt allgemeine Rechnungen und zeichnet die Abbildung in das Buffered Image. Das JPanel zeichnet das Buffered Image nur noch auf seine Oberfläche. So bleibt der EDT frei und die Swing GUI kommt nicht ins Stocken.
 

Stormblade

Mitglied
Ok, gecheckt :D :D Dann werd ich das genauso machen. Ich versuch mal ein BufferedImage zusammenzumalen, wenn ich nicht weiterkomm, dann werd ich wieder fragen ;)
 

Stormblade

Mitglied
Okidoki, vielen dank vanny und melfis für eure unterstützung, ich zeichne jetzt immer in der run()-methode das BufferedImage zusammen, welches dann in der PaintComponent()-methode ausgegeben wird :D Ich hoffe das ist performant genug, um zig positionsberechnungen + zeichnen von ca 70 Elementen, mindestens 24 mal pro sekunde auszuführen :D
Nochmals vielen Dank :toll:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Mausbewegungen wie eine echte Maus in 3 dimensionalen Spielen Spiele- und Multimedia-Programmierung 12
temi OpenGL: Eine Kugel Spiele- und Multimedia-Programmierung 7
Taknax Versuche eine Mod von 1.11.2 in 1.12.2 zu porten. Spiele- und Multimedia-Programmierung 1
J noch eine Runde spielen? Spiele- und Multimedia-Programmierung 6
K Wie bekomme ich eine Transition für alle Objekte zum stoppen? Spiele- und Multimedia-Programmierung 1
P Wie kann ich einem Programm hinter eine GUI verstecken? Spiele- und Multimedia-Programmierung 12
J Wie kann man eine grafische Oberfläche erzeugen um eine Textdatei auswählen zu können ?? Spiele- und Multimedia-Programmierung 1
D Iterieren durch einen Ordner mit Audiodateien und verketten eine andere Audiodatei Spiele- und Multimedia-Programmierung 17
C Eine eigene 3d Engine : Shader - aber wie ? Spiele- und Multimedia-Programmierung 2
MABY Eine mp3 Datei in Java abspielen Spiele- und Multimedia-Programmierung 14
B Mit Swing eine Grafische Oberfläche erstellen Spiele- und Multimedia-Programmierung 1
X Minecraft Wie kann ich eine Karte erstellen wie zb:(Bei Minecraft) Spiele- und Multimedia-Programmierung 1
M Wie kann man die Auflösung eine fertigen Programms ändern? Spiele- und Multimedia-Programmierung 1
Furtano Vektoren für Bewegung für eine 2D-Simulation Spiele- und Multimedia-Programmierung 3
TheSorm Collision an einer bestimmten Seite eine Rectangles abfragen Spiele- und Multimedia-Programmierung 3
T Sinusgenerator für eine Hp Spiele- und Multimedia-Programmierung 8
N Webanwendung als eine Art Spiel Spiele- und Multimedia-Programmierung 8
M Eine Art "Vier Gewinnt" Spiele- und Multimedia-Programmierung 5
B j3d Rotation um mehr als eine Achse Spiele- und Multimedia-Programmierung 9
M Methoden eine Map zu zeichnen Spiele- und Multimedia-Programmierung 5
2 Eine Java App als Midi Device? Spiele- und Multimedia-Programmierung 2
W 3D-APIs für Java - Eine Übersicht Spiele- und Multimedia-Programmierung 8
M Wavefront Object Loader zeigt nur eine Textur an. Spiele- und Multimedia-Programmierung 7
D Problem beim Öffnen einer PHP für eine Highscore Spiele- und Multimedia-Programmierung 5
R JLayer player spielt nur eine mp3 Datei ab Spiele- und Multimedia-Programmierung 1
M Variable die eine Klasse enthält ändern Problem Spiele- und Multimedia-Programmierung 16
G Was genau ist eine Grafikengine? Spiele- und Multimedia-Programmierung 14
radiac Mal eine ganz Doofe Frage... verzeiht :) Spiele- und Multimedia-Programmierung 9
Developer_X Eine Frage zur ViewBesetzung Spiele- und Multimedia-Programmierung 28
G Eine Art Polygon Spiele- und Multimedia-Programmierung 5
H Wie erzeuge ich eine Zufallszahl zwischen 0 und 8 ? Spiele- und Multimedia-Programmierung 7
B vertikal schreiben oder eine Bilddatei drehen? Spiele- und Multimedia-Programmierung 11
E nur eine Konzeptfrage Spiele- und Multimedia-Programmierung 11
G Ein begrenzter Zeitraum, um eine Eingabe zu tätigen! Spiele- und Multimedia-Programmierung 9
M mehrere PNG in eine Datei Spiele- und Multimedia-Programmierung 3
H Eine gestrichelte Linie Spiele- und Multimedia-Programmierung 3
V Wie bewege ich eine eingefügte Grafik (img) ? Spiele- und Multimedia-Programmierung 2
D Eigentlich eine Umfrage (Pausenanimation) Spiele- und Multimedia-Programmierung 4
T NullPointerException bei scheduleAtFixedRate Spiele- und Multimedia-Programmierung 1
D Java Bomberman Probleme java.lang.NullPointerException Spiele- und Multimedia-Programmierung 1
TheSorm Problem mit 2 classen NullPointerException Spiele- und Multimedia-Programmierung 1
antonbracke Multiplayer Shooter mit NullPointerException Spiele- und Multimedia-Programmierung 4
P NullPointerException bei Aufruf von Methode Spiele- und Multimedia-Programmierung 10
D NullPointerException Spiele- und Multimedia-Programmierung 5
D Problem mit MouseMotionListener / NullPointerException Spiele- und Multimedia-Programmierung 10
B Bild wird nicht geladen Spiele- und Multimedia-Programmierung 4
Fabel TicTacToe MiniMax Algorithmus geht nicht Spiele- und Multimedia-Programmierung 4
ThoraxLaneus Minecraft MCP-Client mit Optifine fertig machen in IntelliJ klappt nicht ganz Spiele- und Multimedia-Programmierung 6
K Mein Jump and Run charakter bewegt sich nicht mehr rückwärts... Spiele- und Multimedia-Programmierung 0
P Pokemon Spiel Funktioniert nicht ? Spiele- und Multimedia-Programmierung 3
D MIDIdevice open funktioniert nicht Spiele- und Multimedia-Programmierung 1
Mika_MDF Minecraft Eclipse startet Minecraft nicht? Spiele- und Multimedia-Programmierung 23
H Musik Datei lädt nicht? Spiele- und Multimedia-Programmierung 8
A Kollision funktioniert nicht richtig bei zu schneller Geschwindigkeit des Spielers Spiele- und Multimedia-Programmierung 0
JeremyStarTM Minecraft Minecraft Spigot Server akzeptiert JAR-Version nicht Spiele- und Multimedia-Programmierung 8
K Das Leerzeichen der Tastatur wird nicht gleichgesetzt mit dem Leerzeichen aus der Text Datei Spiele- und Multimedia-Programmierung 5
P Teamspeak interface mit JFrame funktioniert nicht Spiele- und Multimedia-Programmierung 3
coolian slick lwjgl text darstellen mit UnicodeFont funktoniert nicht? Spiele- und Multimedia-Programmierung 11
Z Minecraft Multiplayer geht nicht Spiele- und Multimedia-Programmierung 2
L Minecraft 1.7.10 Server startet nicht Spiele- und Multimedia-Programmierung 1
R Memory - Nicht alle Button lassen sich aktivieren? Spiele- und Multimedia-Programmierung 1
D Kollision funktioniert unten aber nicht oben Spiele- und Multimedia-Programmierung 4
C Java findet FluidSynth nicht Spiele- und Multimedia-Programmierung 2
N der Player bewegt sich nicht Spiele- und Multimedia-Programmierung 14
D Java Bild bewegen funktioniert nicht Spiele- und Multimedia-Programmierung 8
Damtonix Gameloop funktioniert nicht! Spiele- und Multimedia-Programmierung 6
N Warum tut der Gegner nicht das was er soll? Spiele- und Multimedia-Programmierung 13
N Warum ist das Fenster nicht schwarz? Spiele- und Multimedia-Programmierung 26
B Programmieren wie der Befehl /ban in Minecraft geblockt wird aber nicht /ban mit einem Argument Spiele- und Multimedia-Programmierung 1
A Dateifehler - Öffnet nicht Spiele- und Multimedia-Programmierung 7
temi libGDX Box2d ApplyTorque() funktioniert nicht Spiele- und Multimedia-Programmierung 1
R Laufbewegung geht nicht.. Spiele- und Multimedia-Programmierung 1
J OpenGL Bild wird nicht richtig angezeigt Spiele- und Multimedia-Programmierung 2
S GetBufferStrategy-Methode wird nicht angezeigt Spiele- und Multimedia-Programmierung 6
M KeyListener funktioniert nicht während Timer läuft Spiele- und Multimedia-Programmierung 26
F vlcj läuft nicht exportiert, aber in Eclipse Spiele- und Multimedia-Programmierung 2
A MouseListener ändert nicht das Lable Icon. Spiele- und Multimedia-Programmierung 2
G LWJGL Rendert nicht Spiele- und Multimedia-Programmierung 3
A Spielball bewegt sich nicht richtig, prallt falsch ab Spiele- und Multimedia-Programmierung 7
S KeyEvent funktioniert nicht, wenn Buttons dem Frame hinzugefügt werden Spiele- und Multimedia-Programmierung 7
Blender3D VLCJ Video lässt sich nicht mehr abspielen nach mysql Installation Spiele- und Multimedia-Programmierung 1
J Programm kann Audio Datei nicht finden Spiele- und Multimedia-Programmierung 7
Viktim Snake - Schlange wächst nicht Spiele- und Multimedia-Programmierung 3
J Mensch Ärgere Dich nicht - Künstliche Intelligenz Spiele- und Multimedia-Programmierung 2
C Export als .jar funktioniert nicht richtig (JAVA 3D) Spiele- und Multimedia-Programmierung 5
L Mensch ärgere dich nicht Spiele- und Multimedia-Programmierung 9
Polarfuchs Status von Midi Datei(wird gerade abgespielt oder nicht) Spiele- und Multimedia-Programmierung 0
A Bild(sequenz) wird nicht geladen Spiele- und Multimedia-Programmierung 1
4 AudioSystem.write() wirft IllegalArgumentException, obwohl dies eig. nicht passieren dürfte Spiele- und Multimedia-Programmierung 2
V Methoden werden zwar ausgeführt führen aber nicht zum Ergebnis Spiele- und Multimedia-Programmierung 5
M [JOGL] eclipse export Runnable Jar - startet nicht Spiele- und Multimedia-Programmierung 3
B LWJGL / OPENGL Kriege Depth-Test nicht hin :( Spiele- und Multimedia-Programmierung 0
S Slick2D KeyInput reagiert nicht. Spiele- und Multimedia-Programmierung 3
S Quaxli's Heli Spiel läuft nicht nach Plan Spiele- und Multimedia-Programmierung 2
W [libGDX] findet SplashScreen.png nicht Spiele- und Multimedia-Programmierung 4
T LWJGL VBO's funktionieren nicht, geben aber auch keinen Fehler Spiele- und Multimedia-Programmierung 0
Androbin Kollision zwischen Raster und Nicht-Raster Spiele- und Multimedia-Programmierung 2
O Fehler bei Programmierung lässt Figur nicht bewegen Spiele- und Multimedia-Programmierung 5
Androbin Mein Spiel will sich nicht zeichnen lassen !!! Spiele- und Multimedia-Programmierung 7
B Mein Programm reagiert nicht auf den Tasstendruck Spiele- und Multimedia-Programmierung 1

Ähnliche Java Themen

Neue Themen


Oben