Slyh: Darstellungsproblem mit Grafik

Beitrag lesen

Hallo Daniel und vor allem Christoph S.

pain(Graphics g) wird jedesmal aufgerufen, wenn irgend ein Teil des Applets neu geziechnet werden muss.
Also jedesmal wenn Du scrollst oder das Fenster wieder in den Vordergrund holst.

Theoretisch wird also alleine durch das Scrollen von 5 Pixeln die paint()-
Methode 5-mal aufgerufen, 5-mal das Graphics-Objekt kopiert (wieso eigentlich?)
und 5-mal ein neuer Thread erzeugt und gestartet. Alle diese Threads versuchen
nun gleichzeitig und parallel das Fraktal zu berechnen und darzustellen.
Bei meinem Scrollversuch waren es letztendlich über 100 Threads, die gleich-
zeitig am werkeln waren. Dabei kam es dann zu zahlreichen NullPointerExceptions,
weil in der run()-Methode irgendwie "map" auf null gesetzt wird usw.

Du solltest das berechnen der Fraktale also schon in init() erledigen und in paint nur noch das fertige Bild ausgeben.

Naja, er kann auch in init() bzw. besser in start() einen Thread anstoßen,
der das Fraktal berechnet und zeichnet. Allerdings sollte nicht direkt in
die Zeichenfläche des Applets gezeichnet werden, sondern besser in ein Image.
Dieses Image wird dann in paint() immer über auf die Applet-Zeichenfläche
gemalt. Direktes Zeichnen in die Applet-Zeichenfläche ist flüchtig. Daher
ja auch die paint()-Methode.

So wie Du das implementierst wird die Berechnung dauernd neu angestoßen.

So wie es momentan implementiert ist, wird das Applet auch nur durch den
Aufruf der Methode paint() überhaupt angestoßen. Genau das was jetzt in
paint() steht, sollte aber eigentlich in start() stehen. Diese Methode wird
nämlich beim Start des Applets aufgerufen. Paint wird - wie du ja schon gesagt
hast - bei jedem Neuzeichnen aufgerufen. Das Applet "funktioniert" auch nur
deshalb, weil beim ersten Anzeigen des Applets eben paint() aufgerufen wird.
Korrekt müßten alle Operationen, die zum (evtl. auch erneuten) Starten des
Applets notwendig sind, in start() stehen.

Gruß
Slyh