Klassen Fehler mit Parameter des Konstruktors bei einer Objekterzeugung

jibblejava

Mitglied
Hallo Forenmitglieder,

Um einen Kreis abbilden zu lassen, habe ich eine öffentliche Klasse erstellt und zwei Instanzen dieser Klasse in einer neuen Klasse erzeugt.
Für die Initialisierung der Kreisobjekte habe ich einen parametrisierten Konstuktor eingesetzt. Bei der Erkennung seiner Parameter tritt jedoch ein Fehler auf.

Hier die Klasse, die den Kreis erzeugt und die Kreisfläche berechnet:

Java:
class MyCircleClass
{
	public int positionX;
	public int positionY;
	public double radius;


public MyCircleClass(){};
public MyCircleClass(int x, int y, double radius)
{
	positionX = x;
	positionY = y;
	this.radius = radius;
}

public double getArea()
{
	return Math.PI*radius*radius;
}

}

Die Klasse, die die Kreisobjekte erzeugt, ist die folgende:

Java:
import Prog1Tools.GraphicScreen;

public class TestClass

{
	


static GraphicScreen screen = GraphicScreen.getInstance();

    static void printCircleToScreen(MyCircleClass circleToDraw)
	 	{
	 		screen.drawCircle(circleToDraw.x, circleToDraw.y, circleToDraw.radius, false);
	 		
	 	}
	
	
	
	public static void main (String [] args)
	{

	 	MyCircleClass circle1 = new MyCircleClass (100, 100, 80);
	 	MyCircleClass circle2 = new MyCircleClass (50, 50, 30);

	 	printCircleToScreen(circle1);
	 	printCircleToScreen(circle2);

	 	System.out.println(circle1.getArea());

	}
}

Als Fehler erhalte ich:
TestClass.java: error: cannot find Symbol Variable 'x' in Variable 'CircleToDraw'

Das Gleiche gilt für y.

Ich bin euch dankbar für jede Hilfe oder jeden Hinweis, der den Fehler aufdeckt.
 
Du hast die Eigenschaften x und y deines Kreisobjektes ja auch positionX und positionY genannt.
Java:
screen.drawCircle(circleToDraw.positionX, circleToDraw.positionY, circleToDraw.radius, false);
sollte das korrigieren, oder ?

Ich weiß, dass das am Anfang leichter gesagt ist als getan, aber eine Fehlermeldung ist meistens zielführend, wenn man sie genau liest. (vor allem in Java)

Sollte jetzt klar sein, oder ?
 
@ bug Fisher:
vielen Dank für deinen Vorschlag.
Mit der Zeit entwickelt sich sicherlich ein besseres Gefühl für die Fehlermeldungen und die Fehler selbst im Code.

Leider ist das Problem nicht zu lösen mit deinem Vorschlag.

Zumindest bei mir erscheint damit die Fehlermeldung:

method drawCircle in class graphicScreen cannot be applied to given types;
reason: actual argument double cannot be converted to int by method invocation conversion.

deklariere ich nun das Attribut radius als Int Typ, wird kein Kreis angezeigt und der Flächeninhalt ist 0.

Der geänderte Code sieht folgendermaßen aus:
Java:
class MyCircleClass
{
	public int positionX;
	public int positionY;
	public int radius;


public MyCircleClass(){};
public MyCircleClass(int x, int y, int radius)
{
	positionX = x;
	positionY = y;
	radius = radius;
}

public double getArea()
{
	return Math.PI*radius*radius;
}

}
 
ich hab mal versuch dir ein kurzes beispiel zu schreiben , hier übergibst du einfach den Grafikkontext an dein Kreisobjekt,

damit ich mir nicht so einen aufwand machen muss hab ich es einfach mal kurz gehalten, vielleicht hilft dir das ja weiter :

Java:
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class Circle{

	private double radius;
	
	public Circle(double radius){
		this.radius = radius;
	}
	
	public double getScale(){
		return 2 * radius * Math.PI;
	}
	
	public double getArea(){
		return Math.pow(radius, 2) * Math.PI;
	}
	
	public double getDiameter(){
		return 2 * radius;
	}
	
	public void drawCircle(Graphics g, int x, int y){
		if(g != null) {
			g.fillOval(x, y,(int) getDiameter(),(int) getDiameter());
		}
	}
	
	public static void main(String[] args){
		@SuppressWarnings("serial")
		JPanel panel = new JPanel(){
			
			Circle c = new Circle(40);
			
			@Override
			public void paintComponent(Graphics g){
				super.paintComponent(g);
				
				g.setColor(Color.RED);
				c.drawCircle(g, 50, 50);
			}
		};
		
		JFrame f = new JFrame();
		f.setContentPane(panel);
		f.setDefaultCloseOperation(2);
		f.setSize(500,500);
		f.setLocationRelativeTo(null);
		f.setVisible(true);
		
	}
}
 
@kaoZ : Vielen Dank für deinen Vorschlag und deine Codevorlage 😉

Auch habe ich herausgefunden, wie man die Fehler in meinem Code beheben kann:

Es ist nötig, die x- und y- Position als auch den radius als Int-Typ zu deklarieren.
Des Weiteren muss der Radius im Konstruktor mit einer this.-Referenz versehen werden. dann klappt es!
 
Wenn deine Eingabeparameter die gleichen Variablennamen verwenden wie Die Attribute ist this. nötig, falls nicht kannst du dir das this schenken, da du damit nur auf das aktuelle Objekt zeigst, bzw. das gewünschte Attribut des aktuellen Objektes.

wenn du die Datenfelder als double deklariert hast , und diese in einer Methode verwenden willst die als Eingabeparamerter Werte vom Datentype int erwartet , kannst du einen Cast durchführen, allerdings musst du hier aufpassen da ein double 64 bit zur Datenhaltung allokiert und ein int nur 32 bit, die überschüssigen 32 bit werden einfach abgeschnitten, dies ist allerdings solange irrelevant, wie dein Wert deines doubles den Wertbereich eines ints nicht übersteigt, ! allerdings kannst du so eben den geforderten Datentyp liefern.
 
Zuletzt bearbeitet:

Zurück
Oben