# getGraphics() - NullPointerException



## Quax (4. Sep 2012)

Hallo,
mich quält auch die NullPointerException Fehlermeldung. Den heute gebloggten Eintrag über Methodenaufrufe habe ich mir durchgelesen.Ich habe folgenden Code:

```
package xtra1000;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Ampel extends JFrame implements ActionListener{
	
		private Graphics Grafik;
		private JButton Knopf;
		
	public Ampel() {
		super("Ampel 1.0");
		JPanel Platte = new JPanel();
		Platte.setLayout(new FlowLayout());
		Box Oben = Box.createHorizontalBox();
		Knopf = new JButton("Start");
		Platte.add(Oben);
		Platte.add(Knopf);
//		showImage(50,0);
		Knopf.addActionListener(this);
		setContentPane(Platte);
	}
	
	public void actionPerformed(ActionEvent Ereignis) {
		showImage(100, 80);
	}
	
	public void showImage(int x, int y) {
		Grafik = getGraphics();
		Grafik.setColor(Color.red);
		Grafik.fillOval(x, y, 50, 50);
	}
	
	public static void main(String[] args) {
		Ampel Rahmen = new Ampel();
		Rahmen.setSize(250,200);
		Rahmen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Rahmen.setVisible(true);
	}
}
```
Damit möchte ich schon beim Starten der GUI einen Punkt angezeigt bekommen. Beim betätigen des Buttons soll der rote Punkt seine Position ändern. 
Der Code läuft wie abgebildet allerdings wird gleich beim Aufruf der GUI kein Punkt angezeigt. Wenn ich die auskommentierte Zeile:

```
//		showImage(50,30);
```
mit reinnehme kommt die Fehlermeldung:
Exception in thread "main" java.lang.NullPointerException
	at xtra1000.Ampel.showImage(Ampel.java:30)
	at xtra1000.Ampel.<init>(Ampel.java:19)
	at xtra1000.Ampel.main(Ampel.java:35)

Wenn ich an der Stelle der auskommentierten Zeile eine Initialisierung vornehme:

```
Ampel licht = new Ampel();
        licht.showImage(50,30);
```
kommt die Fehlermeldung:
Exception in thread "main" java.lang.StackOverflowError
	at java.awt.Insets.<init>(Unknown Source)
	at sun.awt.windows.WToolkit.getScreenInsets(Native Method)
	at sun.awt.windows.WToolkit.getScreenInsets(Unknown Source)
Kann mir da bitte jemand weiterhelfen?


----------



## Michael... (4. Sep 2012)

Quax hat gesagt.:


> Kann mir da bitte jemand weiterhelfen?


Standard Anfängerfehler beim Zeichnen. Bitte nicht getGraphics() aufrufen.
Wie es richtig geht:
Malen in Swing Teil 1: der grundlegende Mechanismus ? Byte-Welt Wiki


----------



## AS3 (4. Sep 2012)

Ja,
du solltest dir mal angucken,
wie man allgemein in Swing zeichnet.
Das 'Graphicsobject' wird erst erstellt,
wenn das Fenster sichtbar ist,
davor wird eben 'null' zurückgegeben.

lies mal das. 

AS3,
wünscht viel Erfolg.


----------



## Quax (4. Sep 2012)

Ja vielen Dank erstmal, ich werd mir das mal anschauen und bei Bedarf nochmals melden. Aber soviel schonmal vorweg: Wenn ich die Zeichnung richtig erstelle, dann kann ich den Methodenaufruf schon so im Konstruktor stehen lassen?
Achja und was bedeutet eigentlich der Ausdruck @Override? Da bin ich in meiner Literatur noch nicht so fündig geworden?
Quax


----------



## SlaterB (4. Sep 2012)

"Wenn ich die Zeichnung richtig erstelle" ist eine ganz ausagelose Aussage hier, 
was ist eine Zeichung? wie wird sie erstellt?

allgemein kann man sich aber wohl jedes 'wenn' sparen,
solange der Boden aus Sand besteht gibt es keinen richtigen Weg, das Haus aufzustellen


----------



## L-ectron-X (4. Sep 2012)

Quax hat gesagt.:


> Wenn ich die Zeichnung richtig erstelle, dann kann ich den Methodenaufruf schon so im Konstruktor stehen lassen?
> Quax


Nein, sie dürfte überflüssig werden. Das Java-System selbst kümmert sich dann zum Großteil ums Zeichnen.


----------



## AS3 (4. Sep 2012)

Quax hat gesagt.:


> [...]Achja und was bedeutet eigentlich der Ausdruck @Override? Da bin ich in meiner Literatur noch nicht so fündig geworden?
> [...]



Wenn eine classe von einer anderen erbt/ein inteface implementiert,
benutzt man die Override annotation, um das zu kennzeichnen (und noch viel mehr, ich habe jetzt aber keine schöne Definition von Annotationen, allgemein, kann man damit 'metadaten' hinzufügen).
(Um das Wort 'Annotation' brauchst du dich (erst mal) nicht kümmern.)
Wenn du Vererbung usw. noch nicht kannst, solltest du noch nicht mit grafischer Programmierung anfangen. (nicht böse gemeint, nur ein tipp.)

AS3


----------



## Quax (5. Sep 2012)

Ich bin für jeden Tip dankbar denn als Anfänger verrennt man sich schnell in etwas.
Quax


----------



## jgh (5. Sep 2012)

ein prob bei deinem Code ist bspw. das -wenn das Fenster vergrößert/verkleinert wird- dein roter Punkt nicht mehr da ist, deswegen macht man solche Operationen in der paintComponent Methode...hier mal ein rudimentäres Bsp für die Bewegung des roten Kreises.


```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Ampel extends JFrame implements ActionListener {

	private JButton buttonLinks, buttonRechts;
	EinJPanel platte = new EinJPanel();

	public Ampel() {
		super("Ampel 1.0");
		platte.setLayout(new FlowLayout());
		Box Oben = Box.createHorizontalBox();
		buttonLinks = new JButton("links");
		platte.add(Oben);
		// showImage(50, 0);
		buttonLinks.addActionListener(this);
		buttonRechts = new JButton("rechts");
		platte.add(buttonLinks);
		platte.add(buttonRechts);
		buttonRechts.addActionListener(this);
		setContentPane(platte);
	}

	public void actionPerformed(ActionEvent evt) {
		if (evt.getSource() == buttonLinks) {
			platte.x = platte.x - 10;
		} else if (evt.getSource() == buttonRechts) {
			platte.x = platte.x + 10;
		}
		platte.repaint();
	}

	public static void main(String[] args) {
		Ampel Rahmen = new Ampel();
		Rahmen.setSize(250, 200);
		Rahmen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Rahmen.setVisible(true);
	}
}

class EinJPanel extends JPanel {
	int x = 100;
	int y = 80;

	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.setColor(Color.red);
		g.fillOval(x, y, 50, 50);
	}

}
```


----------

