Umstieg von Pascal auf Java -Paint-Methode von AWT

Hallo Experten,

als absoluter Java-Neuling (kommend von Pascal) ist fuer mich das groesste Raetzel, wie man eine „komplexere“ Ausgabe in java macht.

An vielen von mir gelesenen Stellen wird zwar schoen erklaert, wie man mit Java (AWT) ein Fenster oeffnet und dann mit

pubilc void paint(Graphics g) (oder so aehnlich)

auch in dieses Fenster alles moegliche malen/ausgeben kann.

Auch den repaint-Befehl habe ich mir durchgelesen.

Doch irgendwie geht dieses Konzept doch davon aus, dass das was ich malen/ausgeben moechte nicht besonders komplex ist. Ein paar Knoepfe und Schaltelemente hier und vielleicht ein Gif-Bild dort.
Also nichts, was sich grundlegend aendern koennte.
Zwar kann ich in dieser Pain-Methode auch Bedingungen setzen, ob nun das Schaltelement ausgegeben werden soll oder nicht.

Aber irgendwie vermisse ich doch von Pascal her die Moeglichkeit jeder Zeit etwas auf dem Bildschirm ausgeben zu koennen.

Ich hoffe mir ist da bei Java noch ein ganz wichtiges Kapittel in diese Richtung einfach unbemerkt geblieben.

Aber bis jetzt wuerde ich um eine Linie-zu malen wie folgt vorgehen:
Ich wuerde eine Variable auf true setzen, repaint aufrufen und in der Paint-Methode diese Variable abfragen und bei dem Wert true diese Linie zeichnen lassen.

Dies hat zur Folge, das die Paint-Methode unglaublich voll wird, da ich ja fuer alle spaeteren Linien etc. schon von Anfang an „Vorsogen“ muss.

Bitte sag mir jemand, dass das auch anders funktioniert.

Beste Gruesse

Martin

Hallo Experten,

Bitte sag mir jemand, dass das auch anders funktioniert.

Suchst du die Methode getGraphics() , die in java.awt.Component definert wird und in allen Subclassen (frame, dialog, applet, etc.) verfügbar ist ?

Das paint wird wie in Delphi auch immer dann aufgerufen, wenn z.B. das Fenster wieder sichtbar geworden ist, etc…

Alexander

Und… ? (erneut meine Frage)
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 ?

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.

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).

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 ?

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 ?

Also wenn Das wirklich nur so bescheuert zu machen ist, dann werde ich Java direkt wieder deinstallieren !!!

Beste Gruesse

Martin

Du mußt ja nicht alles in der paint - Methode haben,
dort brauchst Du nur den Aufruf an das Objekt, das dargestellt werden soll.

In dem Objekt oder einer Objektliste ist dann der Zustand des Objekts gespeichert, beispielsweise die Position des Planeten, dem wird dann das Graphics Objekt übergeben und er gibt sich selbst an der Position aus, an der er sich gerade befindet.

Die Paint Methode ist eigentlich nur dazu da den aktuellen Zustand auszugeben, neu berechnen und die aufforderung zum neu zeichnen sollte eigentlich außerhalb stattfinden.

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