Thread.sleep

  • Themenstarter Themenstarter Loretta
  • Beginndatum Beginndatum
L

Loretta

Gast
Nabend,

auf meinem JPanel wende ich die paintComponent Funktion an. Nun möchte ich alle 4 Sekunden an einer zufälligen Stelle einen neuen Kreis zeichnen.

Java:
public void paintComponent(Graphics g){
		super.paintComponent(g);

		Dimension d = this.getSize();
		 maxX = d.width;
		 maxY = d.height;
	
		// FadenKreuz
		g.setColor(Color.BLACK);
		g.drawLine(0,maxY/2,maxX,maxY/2);
		g.drawLine(maxX/2,0,maxX/2,maxY);
		
		
		for(zaehler =0;100>=zaehler;++zaehler){
			int zx = Zufall.nextInt(maxX);
			int zy = Zufall.nextInt(maxY);
			
			g.drawOval(zx,zy,30,30);			
			
			
			try {
				Thread.sleep(4000);
			} catch (InterruptedException e) {
				
				System.out.println("Fehler");
			}
   }
}

Wenn ich mein Programm ohne die Funktion Thread.sleep() laufen lasse, dann funktioniert das Programm. Mit der Sleep - Funktion bleibt das ganze JPanel leer.
Ich erhalte vom Complier (Eclipse) keine Fehlermeldung. Kann mir bitte jemand einen Tipp geben wo der Fehler liegt, bzw. wie ich eine Schlaf-Funktion innerhalb der paintComponents Funktion realisieren kann.


Vielen Dank für alle Hinweise
Loretta
 
Da benötigst du einen Animations-Thread für, der alle 4 Sekunden "repaint()" des Panels aufruft. Die "paintComponent()" solltest du jedenfalls nicht verzögern, weil sonst das Ergebnis erst 4 Sekunden später sichtbar wird.
 
Hallo Spacerat,

vielen Dank für die Antwort. Das habe ich mir auch schon überlegt. Mein Ziel ist es aber, dass die gezeichneten Kreise erhalten bleiben. (Es soll Kreise auf das JPanel regnen).

Wenn ich repaint() verwende, sind die vorhanden Kreise ja wieder an einem neuen Ort. Gibt es eine Möglichkeit die Funktion anzuhalten, oder muss ich mir was neues überlegen.

Vielen Dank für alle Tipps
Loretta
 
Eine Möglichkeit wäre z.B. eine Liste anzulegen, die Kreise enthält. Die paintComponent()-Methode macht dann nichts anderes, als alle Kreise in dieser Liste zu zeichnen.
Und im Hintergrund läuft ein Thread, der alle x Sekunden einen neuen Kreis erstellt, der Liste hinzufügt und repaint() aufruft.
 
Hallo Mostly_Harmless,

vielen Dank für die Antwort, so werde ich es versuchen.

Liebe Grüsse
Loretta
 
'ne Liste für simple Radien un Positionen, die sich erstens ohnehin nicht mehr ändern sollen und zweitens bei jedem durchlauf des Anim-Threads neu gezeichnet werden müssten? Funktioniert zwar, aber naja...
Also das "repaint()" ist auf jeden Fall Pflicht und möglichst ausserhalb von "paintComponent()". Man könnte sich in "paintComponent()" auf das Zeichnen eines Images beschränken, welches man im Anim-Thread vollkritzelt. Im Image selber würden die Kreise auch ohne Liste erhalten bleiben, wobei ich mich grad' frage, ob das beim Panel nicht genauso wär.
 
'ne Liste für simple Radien un Positionen, die sich erstens ohnehin nicht mehr ändern sollen und zweitens bei jedem durchlauf des Anim-Threads neu gezeichnet werden müssten? Funktioniert zwar, aber naja...

Wie gesagt, es wäre eine Möglichkeit von vielen.
Und auch, wenn es sich erstmal nur um "simple Radien un Positionen" handelt, bliebe man so flexibel Erweiterungen einzubauen. So wäre es zum Beispiel möglich, im Nachhinein doch wieder Kreise zu löschen, vielleicht die Farben der Kreise während der Animation zu ändern, auf die Reihenfolge Einfluss zu nehmen, in welcher die Kreise gezeichnet werden, etc.
 

Zurück
Oben