Slyh: Thread fängt immer "von vorne" an?

Beitrag lesen

Hallo,

Minimiere, maximiere, oder verschiebe ich das Fenster, fängt der Thread wieder von vorne an, d.H. alle bisher gezeichneten Punkte sind verschwunden.

Bist du sicher, daß das eine mit dem anderen zu tun hat? Ich glaube
nicht, daß der Thread neu gestartet wird. Der Code läßt mich das
zumindest nicht annehmen, soweit ich ihn mir angesehen habe.

Vielmehr liegt das Problem der verschwundenen Punkte wohl vielmehr
darin, daß du in "flüchtigen" Grafikspeicher zeichnest. Wenn du direkt
in Panel zeichnest, indem du dir das Graphics-Objekt davon holst,
zeichnest du nur in den der Komponente zugeordneten Grafikspeicher.
Sobald die Komponente bewegt oder verdeckt wird, geht auch dieser
Inhalt verloren. Er muß neu gezeichnet werden.

Stattdessen könntest du einen Backbuffer verwenden, indem du z.B. ein
BufferedImage erzeugt und nur in diese zeichnest. Sobald du mit dem
Zeichen fertig bist, gibst du das BufferedImage über g.drawImage(...)
auf den Panel aus.

Wenn nun Teile oder das gesamte Panel neu gezeichnet werden muß, weil
es verdeckt wurde, kann direkt dieses BufferedImage nochmal ausgegeben
werden, ohne daß erst wieder x Punkte neu gezeichnet werden müssen.
Dies kannst du in der zu überschreibenden Methode "paint(Graphics)"
tun.

Das Backbuffer-Konzept dürfte auch in den meisten Java-Büchern zumindest
grob erklärt sein.

Ach, und noch etwas: Ich versuche beim Schließen des Fensters den Thread ordnungsgemäß zu beenden, indem ich die Schleifenvariable "running" einfach auf false setze. Dabei will ich mir zur Überprüfung einen Text ausgeben lassen (unter der run()-Methode), aber der Text wird nie ausgegeben. Kann ich trotzdem sicher sein, dass der Thread ordnungsgemäß beendet wurde?

Naja, wenn du die Default Close Operation auf "Exit" setzt, dann
schafft es der Thread nicht mehr rechtzeitig überhaupt noch etwas
zu tun, bevor die Anwendung "hart" beendet wird.

Lass mal diese Zeile weg:
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Stattdessen rufst du dann z.B. "System.exit(0)" in PaintPanel.run()
als letzte Anweisung auf. Dann dürfte noch alles, was nach der
while-Schleife kommt, ausgeführt werden.

Liegt es vielleicht daran, dass im Moment des Schließens das Fensterobjekt bereits vernichtet wird, und der Text deswegen nicht ausgegeben werden kann?

Nicht das Fenster-Objekt, sondern die gesamte Anwendung.

Übrigens, der Aufruf "Thread.yield()" dürfte an dieser Stelle reichlich
sinnlos sein, weil du den Thread ohnehin schlafen legst und somit
andere Threads ausgeführt werden können.

Gruß
Slyh