Schleife verzögern mit Button

J3illabong

Mitglied
Hallo,

ich habe ein Problem bzgl. einer Schleifenverzögerung mit einem Button:

Wenn ich den Button drücke, sollen die einzelnen ArrayList-Inhalte mit einem Textfeld ausgegeben werden.
Dies soll aber mit einer Verzögerung funktionieren, wobei nach jeder Sekunde auf dem Textfeld der nächste Inhalt ausgegeben werden soll.
Vereinfacht gesagt: name1 warten name2 warten name3 etc. alles auf dem selben TF.

Jetzt zu meinem Problem:
Wenn ich den Button drücke, wartet der jede Wartephase zunächst ab und durchläuft die ganze Schleife ohne Warten. Der Button bleibt, wenn er gedrückt wurde, gedrückt.

Mein Code:

Java:
public anzeige(){
for(int i = 0; i < array.size();i++){
		 text.setText(array.get(i).getname());
			
		 try{
	            Thread.sleep(1000);
	        } catch(Exception e) {
	        }
		 
		 
		 
		 }}

Das ist die Methode die vom Button mit normalem ActionListener ausgeführt wird.

Ich hoffe, ich komme jetzt nicht all zu dämlich rüber, aber ich komme einfach nicht drauf ???:L


LG J3illaJ3ong
 
Du rufst
Code:
anzeige
vermutlich innerhalb der
Code:
actionPerformed
-Methode des ActionListeners auf, der am Button dranhängt.

Die
Code:
actionPerformed
-Methode wird beim drücken des Buttons vom EDT-Thread aufgerufen. Der EDT kümmert sich sowohl um die events die in der GUI passieren, als auch um das neuzeichnen der GUI bei Änderungen.

Durch das Thread.sleep legst du also den EDT schlafen. Deswegen kann er sich nicht mehr darum kümmern das die GUI neugezeichnet wird, deswegen siehst du die Änderungen erst sobald
Code:
anzeige
fertig ist.

Lösung:
Du musst
Code:
anzeige
in einem anderen Thread ausführen.
 
Danke für den Gedankenanstoß hab nochmal ein wenig gebastelt:
Ist das so richtig, wie ihr beide euch das vorstellt? Ich habs jetzt, dass der mir wenigstens das neue Fenster öffnet aber nach dem ersten Eintrag haut es mich wieder raus

Hier der Teil der im ActionListener steht:

Java:
 fensteröffnen(); //hier öffnet der halt das neue Fenster mit dem Textfeld....
					
				
					 Thread t = new Thread(new Runnable()
					    {
					        @Override 
					        public void run()
					        {
					            anzeige();
					        }

							
					    });
					    t.start();
							
						} 
			
			}
		});


Und hier die bekannte anzeige-Methode:
Java:
for(int i = 0; i < trinker.size();i++){
	         text.setText(trinker.get(i).getname());
	            
	         try{
	                Thread.sleep(1000);
	            } catch(Exception e) {
	            }
	         
       
	         }


Ich hoffe, das ist von der Idee richtig und ihr könnt mir auch beim nächsten Problem helfen.
 
Raus hauen heißt einfach das nicht funktioniert und abstürzt.
Hierbei muss ich sagen, dass das alles zu einer App gehört ,die ich gerade schreibe.
Ich komme mit dem Handy nicht an eine Exception, die ich nennen könnte.

Ich versuche grad die mal mit dem Debugger durchlaufen zu lassen und die dann reinzustellen. (Dauert ewig)

Aber ich hab auch noch rumprobiert: Wenn ich die Thread.sleep Zeile weglasse, hängt sich das Programm nicht auf und zeigt halt den letzten Eintrag an. (Zeichen, dass der Thread funktioniert). Vielleicht hilft das ja schon.

LG
 
Auf dem Android hat man doch LogCat. Da müsste die Exception drin sein, wenn man sie denn nicht veschluckt.
 
Wenn du mir sagst, wie ich das verwende dann könnte ich das machen. Der Eclipse-Debugger sagt zwar keine Exception, aber auch bei der Thread.sleep zeile ist dann Schluss.
 
Code:
text.setText(array.get(i).getname());
muss wiederum im EDT aufgerufen werden. Das heisst du musst diese Zeile in ein Runnable packen und an SwingUtilities.invokeLater übergeben.
 
Genau das habe ich jetzt soweit implementiert nur jetzt habe ich wieder das Anfangsproblem 😀

Der öffnet mir jetzt die neue Seite, wartet dann alles ab und gibt dann den letzten Eintrag wieder....

Neuen Fehler behoben....Alter ist wieder da....
Ironie des Schicksals
 

Zurück
Oben