Ongree Geschrieben 3. September 2010 Geschrieben 3. September 2010 (bearbeitet) 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 3. September 2010 von Ongree Zitieren
Klotzkopp Geschrieben 3. September 2010 Geschrieben 3. September 2010 Wir arbeiten mit BlueJ falls es nen Unterschied machtEs macht insofern einen Unterschied, als du damit hier im falschen Forum bist. Verschoben -> Java Zitieren
Ongree Geschrieben 3. September 2010 Autor Geschrieben 3. September 2010 Es macht insofern einen Unterschied, als du damit hier im falschen Forum bist. Verschoben -> Java okay danke und tschuldige;) Zitieren
Ongree Geschrieben 3. September 2010 Autor Geschrieben 3. September 2010 Ü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 Zitieren
MartinSt Geschrieben 3. September 2010 Geschrieben 3. September 2010 Ich kenne mich zwar in BlueJ kaum aus, aber ich denke auch dort sollte man seine Variablen typisieren und geöffnete Klammer schließen. Ehe du loscodest: überleg dir anhand der Aufgabe, welche Methoden deine Kreis-Klasse implementieren muß. Gruß Martin Zitieren
lupo49 Geschrieben 3. September 2010 Geschrieben 3. September 2010 Hast du dir schon Gedanken dazu gemacht, wie du das ganze logisch umsetzen möchtest? (Nicht bezogen auf das eigentliche Programmieren) Wenn ja, dann die Gedanken mal posten. Zitieren
Ongree Geschrieben 3. September 2010 Autor Geschrieben 3. September 2010 (bearbeitet) wie meinst du das lupo!? wie ich es kodieren wollte?! und @ martin ja ich weiß war auch nur die textstelle rauskopiert Bearbeitet 3. September 2010 von Ongree Zitieren
lupo49 Geschrieben 4. September 2010 Geschrieben 4. September 2010 Ich meine die einzelnen logischen Schritte, die nötig sind um das aufzubauen. Notfalls mit Stift und Papier formell beschreiben. Die Zeilen, die du weiter oben gepostet hast, sind ja kein richtiger Ansatz um das Problem anzugehen. Zitieren
Ongree Geschrieben 4. September 2010 Autor Geschrieben 4. September 2010 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?! Zitieren
Crush Geschrieben 4. September 2010 Geschrieben 4. September 2010 (bearbeitet) 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 4. September 2010 von Crush Zitieren
The-First-Tiger Geschrieben 4. September 2010 Geschrieben 4. September 2010 Hey =) Also ich versuche dann mal einen Denkanstoß zu geben 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 ^^ Zitieren
Ongree Geschrieben 4. September 2010 Autor Geschrieben 4. September 2010 @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!? Zitieren
flashpixx Geschrieben 4. September 2010 Geschrieben 4. September 2010 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. Zitieren
The-First-Tiger Geschrieben 5. September 2010 Geschrieben 5. September 2010 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. Zitieren
flashpixx Geschrieben 6. September 2010 Geschrieben 6. September 2010 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... Zitieren
Ongree Geschrieben 6. September 2010 Autor Geschrieben 6. September 2010 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?! Zitieren
MartinSt Geschrieben 6. September 2010 Geschrieben 6. September 2010 @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 Zitieren
Ongree Geschrieben 6. September 2010 Autor Geschrieben 6. September 2010 @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: Zitieren
MartinSt Geschrieben 6. September 2010 Geschrieben 6. September 2010 Ja klar sollst/mußt du die Methoden selbst implementieren, also erstellen. Hast du denn bereits eine Methode, die dir einen Kreis mit gegebenem Mittelpunkt und Radius zeichnet? Zitieren
The-First-Tiger Geschrieben 6. September 2010 Geschrieben 6. September 2010 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 ) 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 Zitieren
flashpixx Geschrieben 6. September 2010 Geschrieben 6. September 2010 @The-First-Tiger: Benutze bitte die Uploadfunktion des Forums, da solche Sharehoster oft gesperrt sind bzw. zeitweise ist auch kein Download möglich Zitieren
Ongree Geschrieben 17. September 2010 Autor Geschrieben 17. September 2010 Moin danke für das angebot mit dem runterladen allerdings funktioniert es weder bei den beiden pcs bei mir zuhause noch inner schule! das ist mein problem ich hoffe auch das wir das endlich mal in der Schule klären^^ Und danke an die ganzen Leute die mir geholfen haben Zitieren
Empfohlene Beiträge
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.