Problem bei JTextArea und Thread.sleep()

  • Themenstarter Themenstarter Xaver5
  • Beginndatum Beginndatum
X

Xaver5

Gast
Hallo.

Ich würde gerne in einer JTextArea folgendes ausgeben lassen:
"Du schläfst"
dann 2 Sekunden später:
"... "
und noch ein paar Mal je 2 Sekunden später
"... "

Ich habe das ganze folgendermaßen versucht:

Java:
jTextArea1.append("Du schläfst");
for (int i=0; i<3; i++){
   jTextArea1.append("... ");
   Thread.sleep(2000);
}

Das Problem ist nun, dass erst, nachdem die gesamte Wartezeit vorbei ist, der Text auf der JTextArea ausgegeben wird.
Wie kann ich das so programmieren, dass es Stück für Stück wie oben beschrieben angezeigt wird?
 
du musst das ein einen Thread auslagern und die GUI über den Event Dispatching Thread (EDT) aktualisieren:
Java:
		new Thread(new Runnable() {
			public void run() {
				SwingUtilities.invokeLater(new Runnable() {
					public void run() {
						jTextArea1.append("Du schläfst");
					}
				});
				for (int i = 0; i < 3; i++) {
					SwingUtilities.invokeLater(new Runnable() {
						public void run() {
							jTextArea1.append("... ");
						}
					});
					Thread.sleep(2000);
				}
			}
		}).start();
 
Danke, so geht es, nur muss man dann noch eine Fehlermeldung:

GUI.java:324:33: unreported exception java.lang.InterruptedException; must be caught or declared to be thrown
Thread.sleep(2000);

Das lässt sich aber beheben, wenn man es so macht:
Java:
try {
    Thread.sleep(2000);
}
catch (InterruptedException ie) {
}
 
man kann das ja in eine Methode auslagern, dann bleibts schlank. Bei manchen Sachen ist es notwendig mit invokeLater zu arbeiten, bei manchen nicht. Verwendet mans, ist man immer auf der sicheren Seite. Ist aber schon ein paar Jahre her dass ich viel mit Swing gearbeitet hab, vielleicht ists jetzt nicht mehr notwendig

//EDIT: ja für das Abfangen der Exception war ich zu faul
 
Was auch geht:
Java:
new javax.swing.Timer(new ActionListener() {
  final int numExecution = 0;

  @Override
  public void actionPerformed(ActionEvent e) {
    textArea.append(WHATEVER);
    if (++numExecution == 42) {
      ((javax.swing.Timer) e.getSource()).stop();
    }
  }
}, 2000).start();
Ebenius
 

Neue Themen


Zurück
Oben