Zum Inhalt springen

Probleme beim Objektorientierten Programmieren :S


Ongree

Empfohlene Beiträge

Hallo Leute

Wir haben in der Schule eine Aufgabenstellung welche lautet so:

Erweitern sie die Klasse "Circle" um eine Methode die

-einen großen gelben Kreis in der Mitte der Leinwand zeichnet

-den Kreis langsam um 20 Pixel wachsen lässt

-den Kreis pulsieren lässt

Irgendwelche Ideen?! Ich nämlich nicht...

Danke im Vorraus

Ongree

P.S.

Wir arbeiten mit BlueJ falls es nen Unterschied macht

Bearbeitet von Ongree
Link zu diesem Kommentar
Auf anderen Seiten teilen

Übrigens habe ich schon angefangen zu arbeiten doch ich komme einfach nich weiter! ich fühle mich wie dieser smiley :old

/**

* Build circle at mid of "window", Size increases with 20 pixels, let the circle pulse

*/

public void changeCircle(int newSize, int delta)

{

yPosition = 150;

xPosition = 150;

color = "yellow";

newSize = diameter + 20;

greetz

Link zu diesem Kommentar
Auf anderen Seiten teilen

das problem is das ich nur bis dahin gekommen bin die aufgabenstelung habe ich ja oben hingeschrieben halt das es gelb sein soll...

auf welcher position sein soll und das es um 20 pixels erweitert werden soll...

die frage is jetz eher wie kriege ich das ding zum pulsieren ?!

vielleicht mit ner for und/oder while schleife?!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich denke, über Methoden, die per Timer aufgerufen werden. Schleifen würden den Task aufhalten und weitere Verarbeitungen im Programmfluß blockieren.

Eine Klasse selbst wird nicht aus sich heraus aktiv. Es werden üblicherweise Instanzen von den sie verwendenden Steuerumgebungen, in denen sie irgendwie eingebettet sind aufgerufen. Diese Umgebungen können eine Hauptprogrammschleife oder eher ein Nachrichtensystem sein, wie Timer-, Fenster- oder sonstige Systemnachrichten. Das Pulsieren sollte in der Klasse selbst über regelmäßige Änderungen innerer Parameter ablaufen.

Also wenn es schon eine Schleife sein muß, dann muß diese in der main() stehen, eine Klasseninstanz vorher erzeugt und initialisiert haben und diese dann durch regelmäßige Aufrufe pulsieren lassen. Die "Leinwand" muß ja vorher auch noch gelöscht werden, damit man wieder drüber malen kann, das kann auf keinen Fall Inhalt der Klasse selbst sein, wenn man sauber arbeiten will. Es gibt also einen umgebenden Update()-Aufruf. Dieser übernimmt alle Aufrufe, Übergabe notwendiger Parameter wie den Zeichenkontext mit Positionen und wie die Instanz sich verhalten soll.

Bearbeitet von Crush
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hey =)

Also ich versuche dann mal einen Denkanstoß zu geben :D

Wie wäre es ganz objektorientiert mit einem Objekt "Kreis" ?

Der Kreis hat eine Position und eine Größe.

Nun kannst du dich entscheiden, ob du entweder in einem Timer oder mit einer Schleife nach und nach die Größe des "Kreis"-Objekts erhöhst.

Ab einer bestimmten Größe fängt das "Pulsieren" an, was ja nur eine Vergrößerung/Verkleinerung im Wechsel ist, sprich "Kreis" vergrößert sich von y bis x. Bei x angekommen verkleinert "Kreis" sich wieder bis y. Bei y angekommen vergrößert sich "Kreis" wieder bis x. Etc. pp.

Beim Visualisieren liest du dann einfach die aktuelle Größe des Kreises aus und zeichnest ihn an seine Position.

So, das wäre dann doch schon mal ein grober Plan =)

PS: Ich muss dazu sagen, dass ich jetzt nicht genau weiß was BlueJ ist und ich auch neu bei Java bin, aber mit Eclipse SE hat's auf jeden Fall bei mir geklappt das zu realisieren ^^

Link zu diesem Kommentar
Auf anderen Seiten teilen

@crush

mein lehrer meinte wir sollen das direkt in der klasse machen deswegen habsch das da auch reingeschrieben wegn methode... die sind doch immer in der klasse definiert oda?!

@tiger

bei eclipse isses was anderes ;) das heißt ich soll einen timer reinsetzen!? wie funktioniert denn das?! wir hatten des nämlich noch nich^^ und dann brauche ich also mehrere timer weil immer nach einer bestimmten zeit das wachsen muss oda!?

Link zu diesem Kommentar
Auf anderen Seiten teilen

bei eclipse isses was anderes ;) das heißt ich soll einen timer reinsetzen!? wie funktioniert denn das?! wir hatten des nämlich noch nich^^ und dann brauche ich also mehrere timer weil immer nach einer bestimmten zeit das wachsen muss oda!?

Du brauchst eigentlich nur einen "Timer", wobei ich davon ganz schnell abrate, denn was Du dort machen willst, ist so nicht direkt machbar. Du willst einen "pulsierenden Kreis", d.h. er wird in einem Bereich größer und kleiner.

Du musst irgendwo diesen Kreis auch darstellen, d.h. Du wirst ein GUI Element haben, das Dir diesen Kreis zeichnet. In Deinem Fall, wenn Du naiv herangehst, musst Du einmal den Kreis in der Hintergrundfarbe zeichnen, um ihn zu löschen oder alternativ die Clear Funktion des GUI Elements aufrufen und danach den Kreis neu zeichnen. Durch diese Art wird ein Ruckeln in der Animation entstehen bzw. je nach Programmierung auch Probleme, wenn das Fenster während der Animation geändert (verschoben, minimiert...) wird.

Weiterhin entsteht bei so einem Vorgehen die Problematik, dass Events, die in der GUI oder anderen Prozessen ausgelöst werden, durch Dein Zeichnen blockiert bzw verzögert werden. Als Bsp startest Du die Animation und es ist die Frage wie Du sie wieder beendest. Machst Du das in einer Do-While-Schleife die z.B. auf einen Buttonclick die Animation beenden soll, kann es passieren, dass die GUI durch das Zeichnen so "beschäftigt" ist, dass der Button-Click nicht ankommt.

Die Lösung von den genannten Problemen erreicht man, in dem man eben Threads verwendet und passend dem System die Möglichkeit gibt auch andere Threads zu verarbeiten. Weiterhin wäre für die Animation ein passendes Framework, das eben die Darstellung von Animationen passend beherrscht, sinnvoll übergehen JOGL ? Wikipedia

Wobei diese Thematik für einen Anfänger zu umfangreich ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wobei diese Thematik für einen Anfänger zu umfangreich ist.

Man muss es ja für die einfache Aufgabe lediglich einen Kreis zu zeichnen nicht gleich ober komplex aufbauen.

Außerdem, ich lasse mich gerne eines besseren belehren, wird ein Timer doch in einem separaten Thread abgelaufen ?

@Ongree

Nein, eine einfache if-Abfrage tuts in deinem Fall auch.

Zu deinem Timer: Du kannst ihn wie folgt aufbauen.


new Timer().schedule(new TimerTask() {

  @Override public void run() {

    // Code der ausgeführt werden soll

  }

},delay,period);

Wobei darauf zu achten ist, dass du im Timer nur auf final variablen außerhalb zugreifen kannst, sodass du den Kreis im Timer erzeugen musst, wenn du seine Größe ändern möchtest.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Außerdem, ich lasse mich gerne eines besseren belehren, wird ein Timer doch in einem separaten Thread abgelaufen ?

siehe dazu Java ist auch eine Insel – 9.13 Die Klassen Timer und TimerTask

Wobei wir dann direkt beim Thema Threads wären, denn nichts anderes ist einer TimerTask, von dem man seine Klasse dann ableiten sollte. Der Timer ruft dann eben nur das run() des Task auf...

Link zu diesem Kommentar
Auf anderen Seiten teilen

das heißt also das ich weder timer noch schleifen nehmen sollte sondern nen run() einfügen soll?! aber wie kann man es machen?! ich mein es muss ja vor und zurückgehen...bzw. es muss größer und kleiner werden...

das is eig das hauptproblem...könnte man das nich so weitersetzen wie ich es oben schon getan habe? mit diameter?!

Hier nochmal mein Anfang

/**

* Build circle at mid of "window", Size increases with 20 pixels, let the circle pulse

*/

public void changeCircle(int newSize, int delta)

{

yPosition = 150;

xPosition = 150;

color = "yellow";

newSize = diameter + 20;

soweit ich weiß geht das auch so...doch ab da hänge ich...wie kann ich es machen das der diameter nach und nach wieder abnimmt dann wieder zunimmt und dann wieder abnimmt...gibts da irwie nen befehl der das zusammenfasst?!

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Ongree

Angesichts deiner Ansätze und dass das Ganze aus dem Schulunterricht stammt, würde ich vorschlagen, dass du erstmal Timer und Threads zurückstellt, sondern zuerst die notwendige(n) Klasse(n) entwirfst, die die notwendigen Methoden bereitstellen.

Dann hierzu einen Testframe bauen, mit dem du z.B. ereignisgesteuert die Vergrößerung/Verkleinerung testen kannst und erst dann wenn alles klar ist, weiter mit Timer & Co.

Gruß Martin

Link zu diesem Kommentar
Auf anderen Seiten teilen

@martin

wir sollen die methode ja gerade erstellen ;)

und es gibt keine methode die sowas ähnliches macht...

diesen ansatz habe ich aus aus 3 verschiedenen methoden zsammngesetzt und bis jetz funktioniert das alles auch noch :)

und ich habe ehct schon überall rumgeghuckt egal bei welcher klasse egal bei welcher methode ich finde nichts...

soll ich vorsichtshalber mal den gesamten quelltesxt reinstellen?!?:confused:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

also ich hab beides (Timer und Schleife) mal ausprobiert und beides funktioniert bei mir. (Inwiefern mein Code nun "Eleganz" ausdrückt, sei mal dahin gestellt :D )

Da dir ja jeglicher Ansatz zu fehlen scheint, habe ich einfach mal beide Projekte hochgeladen. Wenn du möchtest, schau dir einmal an, wie ich es gemacht habe. Vielleicht hilft es dir ja einen eigenen Weg zu finden.

Ich bitte dich nur drum jetzt nicht die Dateien zu nehmen und zu sagen: Gut ist, Aufgabe erledigt.

Das hilft dir nämlich kein Stück weiter das ganze zu verstehen. Auch wenn es verführerisch erscheint ;-)

Wenn du Fragen hast, dann frag einfach.

Ich hoffe es hilft dir weiter.

Circle.zip -> RS

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...