Hallo !
Hallo Alexander, hallo liebe Leser,
erstmal vielen Dank fuer Deine Antwort !
Aber vielleicht koenntest Du Deine Antwort etwas mehr
ausbreiten ?
Ich hatte nach einer Ausgabe-Moeglichkeit gefragt und Du
antwortest nur mit einem GET-Befehl…
Das kann doch noch nicht alles sein, oder ?
Ich dachte, das wäre das, was du suchst. Mit dem getGraphics kannst du dir überall in dem Programm ein Graphics-Objekt geben lassen (von einem Panel, dem Applet, Frame, etc.) und dann auch an jeder Stelle darauf zeichnen. In der Paint-Methode sollte dann trotzdem alles neu gezeichnet werden, die wird z.B. aufgerufen, wenn das Fenster teilweise im Hintergrund war und deswegen neu gezeichnet werden muss.
Aber vielleicht habe ich mich nicht klar genug ausgedrueckt.
Ich moechte einfach nicht immer alle Ausgabebefehle in der
Paint-Methode unterbringen.
Zugegeben, der Computer muss bei einem neuzeichnen wissen, was
er zeichnen soll. Aber ich kann doch nicht alles, was mein
Programm jemals ausgeben soll in der Paint-Methode haben.
Du kanns im Prinzip überall zeichnen, nur die Paint-Methode sollte wissen, was gerade dargestellt wird, damit sie es auf Anforderung komplett neu zeichnen kann.
Es muss nicht alles in der Paint - Methode stehen, du kannst genauso gut auch für die zu zeichnenden Objekte Klasse(n) definieren und in einer Hastable oder was auch immer sammeln, um dann im paint jeweils für alle diese Objekte das „Zeichen“ aufzurufen.
z.B. habe ich ein Programm geschrieben, was die Bahn eines
Planeten als Spur in einem komplizierten Gravitationsfeld
anzeigen soll.
Dazu habe ich in der Paint-Methode den Aufruf zum Zeichnen des
Planeten, den Aufruf zur Berechnung der neuen Position und
erneut den Aufruf der Paint-Methode (repaint, was somit zu
einer Schleife fuehrte) gehabt.
Dies funktionierte zwar gut, jedoch hat die Berechnung etwas
laenger gedauert (bis zu 1 Minute), und wehe ein anderes
Windows-Fenster kam mal davor, dann hat der doch glatt wieder
neu angefangen die Bahn des Planeten zu zeichnen/berechnen
(erneut 1 Minute).
Dann berechne die Bahn einmal beim Start / nach Änderung der Paramtzer und speichere das Ergbnis zwischen. Dann musst du bei Paint nicht ständig neu berechnen.
Um eine Animation zu machen, verwendet man in der Regel einen extra Thread (den kann man gefahrlos mit sleep ne pausieren lassen), welcher sich den aktuellen Animationsschritt merkt und bei jedem Durchlauf den aktuellen Schritt zeichnet. Bei Zugriffen auf Daten der Hauptklasse Syncronisation nicht vergessen.
Und was waere, wenn ich nach 5 Minuten diese Bahn mir die Bahn
eines anderen Problemes ansehen moechte ?
Muss ich diese Aufrufe auch alle in der Paint-Methode haben ?
Mache doch für jede Bahn eine Instanz einer Klasse mit den Methoden berechnen() und zecihnen(). dann kannst du davon etliche in einer Hashtable oder was auch immer verwalten und nur noch die entsprechenden Methoden aufrufen.
Und wenn ich vorher noch ein Menue haben moechte, wo ich die
Parameter des Planeten und des Gravitationsfeldes einstelle,
ist das alles in der Paint-Methode ?
Sofern du das Menu selbst zeichnen willst, theoretisch ja, Praktisch würde würde ich auch dafür eine neue Klasse definieren, welche den aktuellen Zustand speichert.
Wenn du AWT verwendest, tut es evtl. auch eine von Panel abgeleitete Klasse, welche das Menu direkt verwaltet und du dem Applet dynamisch mit add hinzufügst.
Wenn du SELBST auf Benutzereingabe etwas zeichnest, kannst du das immer mit getGraphics() und zeichnen der Änderungen tun (kein reppaint), allerdings muss paint() in der Lage sein, alles, was gerade dargestellt werden soll, zu zeichnen.
Java ist nun einmal streng objektorientiert, das heisst leider auch, das man am besten für vieles extra Klassen anlegt…
Alexander