# Kreis macht Probleme



## kulturfenster (20. Mai 2007)

Hallo allerseits,
Ich habe folgende Aufgabe zu lösen: Der User gibt einen x-, y- und einen Radius-Wert ein. Dann soll ein entsprechender Kreis gezeichnet werden.

Mein Problem ist, dass das Program den Kreis nicht zeichnet.

Hier die Kreis-Klasse:

```
package P12_12;

import java.awt.geom.Ellipse2D;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JComponent;

public class Kreis extends JComponent{

	private Ellipse2D.Double ell;
	
		
	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		Graphics2D g2 = (Graphics2D) g;
		
		g2.draw(ell);
	}
	
	public void getPosition(int x, int y, int r)
	{
		ell = new Ellipse2D.Double(x,y,r,r);
		
		repaint();
	}
}
```
und hier die Klasse, wo die Eingaben getätigt werden können:

```
package P12_12;

import javax.swing.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class UserInterface {

	private static final int breite = 600;
	private static final int laenge = 400;
	
	public static void main(String[] args)
	{
		JFrame frame = new JFrame("KreisMacher");
		JButton button = new JButton("Draw!");
		final JTextField fieldX = new JTextField(10);
		final JTextField fieldY = new JTextField(10);
		final JTextField fieldR = new JTextField(10);
		JPanel panel = new JPanel();
		JLabel labelX = new JLabel("X-Wert");
		JLabel labelY = new JLabel("Y-Wert");
		JLabel labelR = new JLabel("Radius");
		
		final Kreis kreis = new Kreis();
			
		class KreisMacher implements ActionListener
		{
			public void actionPerformed(ActionEvent event)
			{
				int x = Integer.parseInt(fieldX.getText());
				int y = Integer.parseInt(fieldY.getText());
				int r = Integer.parseInt(fieldR.getText());
				
				kreis.getPosition(x, y, r);
			}
		}
		
		ActionListener listener = new KreisMacher();
		button.addActionListener(listener);
		
		panel.add(labelX);
		panel.add(fieldX);
		panel.add(labelY);
		panel.add(fieldY);
		panel.add(labelR);
		panel.add(fieldR);
		panel.add(button);
		
		frame.add(kreis);
		
		frame.add(panel);
		
		
		
		frame.setSize(breite, laenge);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}
```

sieht jemand den Fehler?

VIelen Dank für alle Tipps!


----------



## merlin2 (20. Mai 2007)

Deine Kreiskomponente wird nicht gezeichnet, weil dein Panel darüber hinzugefügt wurde.
So muss es heißen:

```
public static void main(String[] args)
   {
      JFrame frame = new JFrame("KreisMacher");
      JButton button = new JButton("Draw!");
      final JTextField fieldX = new JTextField(10);
      final JTextField fieldY = new JTextField(10);
      final JTextField fieldR = new JTextField(10);
      JPanel panel = new JPanel();
      JLabel labelX = new JLabel("X-Wert");
      JLabel labelY = new JLabel("Y-Wert");
      JLabel labelR = new JLabel("Radius");

      final Kreis kreis = new Kreis();

      class KreisMacher implements ActionListener
      {
         public void actionPerformed(ActionEvent event)
         {
            int x = Integer.parseInt(fieldX.getText());
            int y = Integer.parseInt(fieldY.getText());
            int r = Integer.parseInt(fieldR.getText());

            kreis.getPosition(x, y, r);
         }
      }

      ActionListener listener = new KreisMacher();
      button.addActionListener(listener);
      frame.setLayout(new BorderLayout());
      panel.add(labelX);
      panel.add(fieldX);
      panel.add(labelY);
      panel.add(fieldY);
      panel.add(labelR);
      panel.add(fieldR);
      panel.add(button);

      frame.add(kreis, BorderLayout.CENTER);

      frame.add(panel, BorderLayout.NORTH);



      frame.setSize(breite, laenge);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setVisible(true);
   }
```
Das Zeichnen von Kreis wirft dann eine Exception:

```
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
 at sun.awt.windows.Win32Renderer.doShape(Win32Renderer.java:217)
 at sun.awt.windows.Win32Renderer.fill(Win32Renderer.java:260)
 at sun.java2d.pipe.ValidatePipe.fill(ValidatePipe.java:142)
 at sun.java2d.SunGraphics2D.fill(SunGraphics2D.java:2258)
 at Kreis.paintComponent(Kreis.java:16)
 at javax.swing.JComponent.paint(JComponent.java:1005)
 at javax.swing.JComponent.paintChildren(JComponent.java:842)
 at javax.swing.JComponent.paint(JComponent.java:1014)
 at javax.swing.JComponent.paintChildren(JComponent.java:842)
 at javax.swing.JComponent.paint(JComponent.java:1014)
 at javax.swing.JLayeredPane.paint(JLayeredPane.java:559)
 at javax.swing.JComponent.paintChildren(JComponent.java:842)
 at javax.swing.JComponent.paintWithOffscreenBuffer(JComponent.java:4970)
 at javax.swing.JComponent.paintDoubleBuffered(JComponent.java:4916)
 at javax.swing.JComponent.paint(JComponent.java:995)
 at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:21)
 at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:60)
 at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97)
 at java.awt.Container.paint(Container.java:1709)
 at sun.awt.RepaintArea.paintComponent(RepaintArea.java:248)
 at sun.awt.RepaintArea.paint(RepaintArea.java:224)
 at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:254)
 at java.awt.Component.dispatchEventImpl(Component.java:4031)
 at java.awt.Container.dispatchEventImpl(Container.java:2024)
 at java.awt.Window.dispatchEventImpl(Window.java:1774)
 at java.awt.Component.dispatchEvent(Component.java:3803)
 at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
 at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
 at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
 at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
 at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
 at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
```
Ich werde mich auch noch mit der beschäftigen.


----------



## merlin2 (20. Mai 2007)

Ich habs gefunden: Du musst deine Elipse gleich am Anfang mit new Ellipse2D.Double initialisieren, weil paintComponent() schon vor getPosition() aufgerufen wird.
Jetzt sollte es funktionieren.


----------



## kulturfenster (20. Mai 2007)

super, alles klappt! Vielen Dank für die rasche Hilfe!

2 Dinge: Wie konntest du dieser Horror-Fehlermeldung entnehmen, dass es sich um ein Initialisierungsproblem handelt? Wieso ist das eigentlich ein Problem; ich dachte, die Ellipse würde einfach mit 0 initialisiert!?

Und wäre es möglich, das Problem auch ohne Container zu lösen? In meinem Buch wurden Container nämlich noch nicht eingeführt und leider habe ich zu dieser Aufgabe keine Lösungen.


----------



## merlin2 (24. Mai 2007)

1. Eine NulllPointerException bedeutet immer, dass eine Variable, auf die man zugreift, keinen Wert zugewiesen bekommen hat.
2. Das mit ohne Container versteh ich nicht; ein Panel ist doch auch ein Container!


----------

