Methode soll andere Methode der selben Klasse aufrufen

Diskutiere Methode soll andere Methode der selben Klasse aufrufen im Java Basics - Anfänger-Themen Bereich.
E

Erazo

Hallo, Ich habe folgendes Problem:
Im Zuge der Animation eines Schafes soll es bei einem Schritt über eine Hilfsfunktion, die nur innerhalb der Klasse sichtbar sein soll(private) die Farben des Kopfes ändern. Dies soll aber durch eine andere Methode aufgerufen werden im Zuge derer das Schaf den Kopf senkt,den Bauch aufbläht und wieder hebt.

Ich habe das jetzt so versucht aber, es kommt die Fehlermeldung dass getSick() dafür static sein soll.
Java:
   public void eat() {
       head.lower(90);
       HelperClass.wait(1000);
       body.erase();
       body.setVerticalLength(160);
       rightFrontLeg.draw();
       rightRearLeg.draw();
       body.draw();
       leftRearLeg.draw();
       leftFrontLeg.draw();
       HelperClass.wait(1000);
       Sheep.getSick();
   
   
   }
   private void getSick() {
       head.setColour(Colour.GREEN);
       HelperClass.wait(1000);
   }
Ich vermute mal das Problem ist, dass ich wohl ein Objekt "sheep" erstellen muss über das ich die Methode dann aufrufe? Oder geht das auch ohne diese Zwischenlösung?
 
E

Erazo

Was wäre denn die beste Variante? Ich könnte natürlich eine Ellipse erstellen die ich dann nie zeichne, aber es gibt doch sicher eine Art "Hilfobjekt" ohne Konstruktor?
 
T

temi

In welcher Klasse befindet sich denn die Methode eat()?

Wenn sowohl eat() als auch getSick() in der selben Klasse sind, dann kannst du getSick() direkt aufrufen (Sheep.getSick()).
 
E

Erazo

Der Kopf soll jetzt grün verfärbt werden. Dies klappt beim Gesicht wunderbar und auch der Rest der Methode funktioniert.
Nur die Augen bleiben warum auch immer rot.

Java:
   private void getSick() {
       head.setColour(Colour.GREEN);
       HelperClass.wait(1000);
   }

Java:
   void setColour(Colour newColour) {
       face.erase();
       face.colour = newColour;
       face.draw();
       leftEar.setColour(newColour);
       rightEar.setColour(newColour);
       leftEye.draw();
       rightEye.draw();
       leftNostril.draw();
       rightNostril.draw();
      
   }
Java:
   void setColour(Colour newColour) {
        ear.erase();
        colour = newColour;
        ear.draw();
    }
 
J

JustNobody

Wo meinst Du denn, dass Du die Farbe der Augen änderst?

Wenn Du etwas erwartest, dann musst Du schauen, wo Du denn den entsprechenden Code hast und ob er wirklich aufgerufen wird oder was da vorab passiert. Daher meine Frage; Wo / an welcher Stelle änderst Du die Farbe der Augen?
 
E

Erazo

Wo meinst Du denn, dass Du die Farbe der Augen änderst?

Wenn Du etwas erwartest, dann musst Du schauen, wo Du denn den entsprechenden Code hast und ob er wirklich aufgerufen wird oder was da vorab passiert. Daher meine Frage; Wo / an welcher Stelle änderst Du die Farbe der Augen?
Sorry, meinte die Ohren
Java:
       leftEar.setColour(newColour);
       rightEar.setColour(newColour);
 
J

JustNobody

Ok, das ändert die Farbe. Damit Du die Änderung siehst, musst Du die neu malen. Wo machst du das?
 
E

Erazo

Java:
   void setColour(Colour newColour) {
        ear.erase();
        colour = newColour;
        ear.draw();
    }
 
J

JustNobody

Bist Du das einmal durchgegangen? Was genau passiert da?

(So Du nicht ganz dubiose Konstrukte hast, ändert das setzen der Instanzvariable colour nichts an der Instanzvariable ear!)
 
E

Erazo

Java:
   private void getSick() {
       head.setColour(Colour.GREEN);
       HelperClass.wait(1000);
   }
hier rufe ich setcolour auf und übergebe die Farbe grün

Java:
   void setColour(Colour newColour) {
       face.erase();
       face.colour = newColour;
       face.draw();
       leftEar.setColour(newColour);
       rightEar.setColour(newColour);
       leftEye.draw();
       rightEye.draw();
       leftNostril.draw();
       rightNostril.draw();
     
   }
hier wird die Farbe grün an face und die Ohren übergeben

Java:
   void setColour(Colour newColour) {
        ear.erase();
        colour = newColour;
        ear.draw();
    }
hier werden die Ohren gelöscht und neue grüne Ohren gezeichnet

Das ganze funktioniert ja beim Gesicht aber eben nicht bei dein Ohren. Liegt aber wahrscheinlich daran, dass das Geischt direkt den Typ Ellipse hat?

edit: ich hab den Fehler entdeckt: Es muss natürlich ear.colour heißen damit er die Farbe der Ohren ändert....
 
J

JustNobody

edit: ich hab den Fehler entdeckt: Es muss natürlich ear.colour heißen damit er die Farbe der Ohren ändert....
Wobei ich da durchaus anmerken würde, dass das Design etwas seltsam anmutet.

Wenn Du eh alles in der Ellipse ear hast, dann brauchst Du auch die Instanzvariable colour nicht, oder?
Was ist aber dann noch in der Klasse Ear enthalten? Wenn das alles jetzt reduziert wird auf eine Instanzvariable ear, dann ist tatsächlich die Frage, in wie weit da die Klasse so noch Sinn macht und ob man das nicht etwas anders aufbaut.

Aber erst einmal gut, dass Du das Problem erkannt hast. Evtl. würde ich Dir aber raten, dich einmal mit einem Debugger vertraut zu machen, damit Du Schritt für Schritt durchgehen kannst um zu sehen, was er wann ändert (oder eben auch nicht). Dann hätte man z.B. sehen können, dass Du die Instanzvariablen colour und ear hast und dass das setzen von colour natürlich ear nicht verändert ....
 
E

Erazo

der Aufgabe ist vorgegeben und ich hab keinen Einfluss darauf. In ear hab ich aber noch viele andere Methoden für andere Schritte der Animation
 
E

Erazo

Es soll bei der Aufgabe ansetzen aber nun Animationen eingebaut werden. Aber der Aufbau ist der selbe, ja
Was genau ist denn damit gemeint, dass der Aufbau seltsam ist?
 
mihe7

mihe7

Der Code:
Java:
   void setColour(Colour newColour) {
        ear.erase();
        colour = newColour;
        ear.draw();
    }
mutet etwas seltsam an, wenn sich dieser in einer Klasse Ear befindet und dort eine Variable "ear" verwendet wird: man geht intuitiv davon aus, dass ear eine Instanz von Ear referenziert, vermutlich handelt es sich aber um eine Ellipse.
 
E

Erazo

nein ear hat eine eigene Klasse und wird dort so aufgebaut:
Java:
Ear(int x, int y, Colour initialColour) {
xPos = x;
yPos = y;
ear = new Ellipse(50, 20, xPos, yPos, Colour.RED);
 
E

Erazo

Ich will zwei Methoden implementieren:
die eine soll 2 Augenlider zeichnen(Schaaf schläft)
die andere soll diese wieder löschen(Schaf wacht auf)

ich hab das jetzt so gemacht aber dann tauchen in der animation zwar beide Augenlider gleichzeitig auf aber das eine verschwindet eine Sekunde früher als das andere. Es liegt daran, dass es in meiner Vraiante 2 mal gezeichnet wird und dann durch die wait Methode das andere 1 sekunde später verschwindet. Wenn ich aber in Head einfach nur Auf openEyeLid() zugreifen will funktioniert es nicht mit der Fehlermeldung (cannot make a static reference to a non static field)

Java:
    void sleep() {
        leftEye.closeEyeLid();
        rightEye.closeEyeLid();
   }
    
    void wakeUp() {
        leftEye.openEyeLid();
        rightEye.openEyeLid();

        
    }


Java:
    void closeEyeLid() {
       leftEyeLid.draw();
       rightEyeLid.draw();
    }
    
    void openEyeLid() {
        HelperClass.wait(1000);
        leftEyeLid.erase();
        rightEyeLid.erase();
        
    }
 
mihe7

mihe7

cannot make a static reference to a non static field
Und die Lösung ist die selbe, wie bei den vergangenen 500-mal: Du brauchst ein Objekt. Bei dem Code, den Du eben gezeigt hast, sollte der Fehler aber nicht auftreten, wenn Du keine Schweinereien (Schafereien) bei den Klassennamen gemacht hast.

Prinzipiell musst Du die wait()-Methode natürlich in Head implementieren, wenn beide Augen "gleichzeitig" geschlossen werden sollen.

Viel mehr würde mich interessieren, warum bei Dir ein Auge ein linkes und ein rechtes Augenlid besitzt... Malst Du zwei Striche, das Auge also so: /o\ ?
 
E

Erazo

nein es ist ein Augenlid für jedes Auge.
Du brauchst ein Objekt
Die Objekte sind doch leftEyeLid und rightEyeLid?

Ich könnte das ganze natürlich auch lösen indem ich die wartezeit weglasse und sie zwischen sleep und wakeup in der main methode setze aber das wäre eine sehr unelegante lösung
 
mihe7

mihe7

Die Objekte sind doch leftEyeLid und rightEyeLid?
Ich habe doch geschrieben, dass der Fehler bei diesem Code nicht auftreten dürfte. Wenn leftEye und rightEye sowie leftEyeLid und rightEyeLid Instanz-Variablen und keine Klassen sind, dann gibt es dort auch keine statische Referenz.

nein es ist ein Augenlid für jedes Auge.
Dein Code sagt etwas anderes. In der Klasse Eye hast Du
Java:
    void closeEyeLid() {
       leftEyeLid.draw();
       rightEyeLid.draw();
    }
Da ein Obekt der Klasse Eye aber ein einziges Auge darstellt, hätte dieses eine Auge zwei Augenlider.
 
E

Erazo

leftEye und rightEye werden hier erzeugt:
Java:
       leftEye = new Eye(10+xPos, 31+yPos, Colour.BLACK);
       rightEye = new Eye(50+xPos, 31+yPos, Colour.BLACK);
anhand des Konstruktors:
Java:
    Eye(int x, int y,Colour initialColour) {
        xPos = x;
        yPos = y;
        colour = initialColour;
        
        iris = new Ellipse(20, 20, xPos, yPos, Colour.BLACK);
        pupil = new Ellipse(8, 8,6 + xPos,7 + yPos, Colour.WHITE);
        rightEyeLid = new Ellipse(20, 20, xPos, yPos-3, Colour.GREEN);
        leftEyeLid = new Ellipse(20, 20 , xPos, yPos-3, Colour.GREEN);
}
 
E

Erazo

Ok, ich glaub ich sehe es jetzt. Ich erzeuge mit jedem Auge beide Augenliedider! Man könnte jetzt beide Augen in einem Objekt erzeugen aber dann kann ich nicht ein Auge zwinkern lassen.
 
J

JustNobody

Java:
        rightEyeLid = new Ellipse(20, 20, xPos, yPos-3, Colour.GREEN);
        leftEyeLid = new Ellipse(20, 20 , xPos, yPos-3, Colour.GREEN);
Schau Dir doch die beiden Ellipsen an. Was unterscheidet die beiden Ellipsen?

Ok, ich glaub ich sehe es jetzt. Ich erzeuge mit jedem Auge beide Augenliedider! Man könnte jetzt beide Augen in einem Objekt erzeugen aber dann kann ich nicht ein Auge zwinkern lassen.
Nein. Du erzeugst nicht mit jedem Auge beide Augenlider. Wie sollte das auch gehen? Die Augenlider sind doch relativ zu der Position des Auges. Das eine Auge kennt doch die Position nicht vom zweiten Auge - also wie sollte es da das Augenlid der anderen Auges malen?

Aber spiel doch etwas damit rum. Mal mal nur ein Auge von beiden. Wäre es so, dass jedes Auge beide Augenlider malen würde, dann würdest Du das ja gut erkennen können ...
 
E

Erazo

andersrum, jedes Auge erzeugt 2 mal das selbe Augenlid innerhalb 2 unterschiedlicher variablen
 
E

Erazo

Java:
       leftEye = new Eye(10+xPos, 31+yPos, Colour.BLACK);
       rightEye = new Eye(50+xPos, 31+yPos, Colour.BLACK);
Java:
    Eye(int x, int y,Colour initialColour) {
        xPos = x;
        yPos = y;
        colour = initialColour;
        
        iris = new Ellipse(20, 20, xPos, yPos, Colour.BLACK);
        pupil = new Ellipse(8, 8,6 + xPos,7 + yPos, Colour.WHITE);
        eyeLid = new Ellipse(20, 20, xPos, yPos-3, Colour.GREEN);
Java:
    void closeEyeLid() {
        eyeLid.draw();
    }
so zeichne ich jetzt beide Augen. gibt es eine Möglichkeit bei der Erzeugung des Auges jedem eyeLid eine neue variable zuzuordnen damit ich die auch getrennt voneinander zeichnen kann? Oder muss ich für jedes Auge einen eigenen Konstruktor anlegen?
 
Thema: 

Methode soll andere Methode der selben Klasse aufrufen

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben