*Markus: Thread fängt immer "von vorne" an?

Beitrag lesen

Hallo,

zum besseren Verständnis habe ich aus einer Game-Engine ein Testprogramm abgeleitet, welches fette Punkte auf dem Ausgabefenster zeichnen soll.
Dabei passiert aber folgendes:
Minimiere, maximiere, oder verschiebe ich das Fenster, fängt der Thread wieder von vorne an, d.H. alle bisher gezeichneten Punkte sind verschwunden. Zuerst dachte ich, es läge daran, dass ich den Thread stoppte und wieder startete, was auch logisch erscheint. Danach verknüpfte ich die WindowListener-Methoden mit Klassen-Methoden, und zwar führte ich z.B. eine "isPaused"-Variable ein, die den Thread weiterlaufen lässt, aber nur das Punktsetzen aussetzt, solange das Fenster nicht den Fokus hat.
Kommt das Fenster wieder in den Fokus, läuft der Thread zwar immer noch, und die Punktsetzung fängt wieder an, aber die alten Punkte sind trotzdem weg. Woran liegt das?
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?
Liegt es vielleicht daran, dass im Moment des Schließens das Fensterobjekt bereits vernichtet wird, und der Text deswegen nicht ausgegeben werden kann?

Hier die verwendeten Klassen:

-------PaintGUI

  
import java.awt.Dimension;  
import java.awt.FlowLayout;  
import java.awt.Toolkit;  
import java.awt.event.WindowEvent;  
import java.awt.event.WindowListener;  
  
import javax.swing.JFrame;  
  
public class PaintGUI extends JFrame implements WindowListener {  
  
 private PaintPanel paintpanel;  
  
    public void drawGUI()   {  
      paintpanel = new PaintPanel();  
      paintpanel.setLayout(new FlowLayout());  
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
      setTitle("PaintGUI");  
      setSize(new Dimension(Toolkit.getDefaultToolkit().getScreenSize()));  
      add(paintpanel);  
      addWindowListener(this);  
      setVisible(true);  
    }  
  
 public void windowActivated(WindowEvent e) {  
  // TODO Auto-generated method stub  
  paintpanel.unpauseAnimator();  
 }  
  
 public void windowClosed(WindowEvent e) {  
  // TODO Auto-generated method stub  
  paintpanel.stopAnimator();  
 }  
  
 public void windowClosing(WindowEvent e) {  
  paintpanel.stopAnimator();  
 }  
  
 public void windowDeactivated(WindowEvent e) {  
  // TODO Auto-generated method stub  
  paintpanel.pauseAnimator();  
 }  
  
 public void windowDeiconified(WindowEvent e) {  
  // TODO Auto-generated method stub  
  
 }  
  
 public void windowIconified(WindowEvent e) {  
  // TODO Auto-generated method stub  
  
 }  
  
 public void windowOpened(WindowEvent e) {  
  // TODO Auto-generated method stub  
  
 }  
  
}  

_____PaintPanel____________

  
import java.awt.Color;  
import java.awt.Graphics;  
import java.awt.Image;  
import java.awt.Toolkit;  
import javax.swing.JPanel;  
  
public class PaintPanel extends JPanel implements Runnable {  
 private final int DOTSIZE = 10;  
 private Image image = null;  
 private Graphics g;  
 private boolean running = false;  
 private Thread animator;  
 private boolean isPaused = false;  
  
 public void run() {  
  running = true;  
  while(running)   {  
   if (!isPaused)  
      drawPoint();  
   try {  
    Thread.yield();   // give another thread a chance to run  
    Thread.sleep(1000);  
   } catch (InterruptedException e) {  
      e.printStackTrace();  
   }  
  }  
  System.out.println("Animation successfully stopped");  
 }  
  
 public void addNotify()   {  
//   only start the animation once the JPanel has been added to the JFrame  
  super.addNotify();  
  startAnimator();  
 }  
  
 public void startAnimator()   {  
  if (animator == null || !running)  {  
      animator = new Thread(this);  
   animator.start();  
  }  
 }  
  
 public void stopAnimator()   {  
  running = false;  
 }  
  
 public void pauseAnimator()   {  
  isPaused = true;  
 }  
  
 public void unpauseAnimator()   {  
  isPaused = false;  
 }  
  
    public void drawPoint()   {  
        int screenWidth = Toolkit.getDefaultToolkit().getScreenSize().width;  
        int screenHeight = Toolkit.getDefaultToolkit().getScreenSize().height;  
        int xPosition = (int)(Math.random() * screenWidth);  
        int yPosition = (int)(Math.random() * screenHeight);  
  
        if (image == null)   {  
         image = createImage(screenWidth, screenHeight);  
         if (image == null)  
          return;  
         else  
          g = getGraphics();  
        }  
  
        g.setColor(Color.BLACK);  
        g.drawOval(xPosition, yPosition, DOTSIZE, DOTSIZE);  
        g.fillOval(xPosition, yPosition, DOTSIZE, DOTSIZE);  
    }  
  
}  

___________MAIN___________

  
  
public class PaintMain {  
  
 /**  
  * @param args  
  */  
 public static void main(String[] args) {  
  PaintGUI gui = new PaintGUI();  
  gui.drawGUI();  
 }  
  
}  
  

Markus