Kreis macht Probleme

Status
Nicht offen für weitere Antworten.

kulturfenster

Bekanntes Mitglied
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:
Code:
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:
Code:
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

Top Contributor
Deine Kreiskomponente wird nicht gezeichnet, weil dein Panel darüber hinzugefügt wurde.
So muss es heißen:
Code:
   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:
Code:
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

Top Contributor
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

Bekanntes Mitglied
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

Top Contributor
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!
 
Status
Nicht offen für weitere Antworten.

Oben