# JTextfield für ein paar Sekunden füllen und dann wieder leeren



## Lautsprecher (19. Oktober 2005)

Hallo,
mein Benutzer löst per Knopfdruck einen INSERT-SQL Befehl aus. Solange dieser Prozess läuft soll in einem Textfield neben dem Button eine Anzeige erscheinen (Wie: "Daten werden gebucht!") Die soll so 1,2 Sekunden drin stehen bleiben. Danach muss das Feld wieder leer sein.
Ich hab jetzt schon x-beliege Dinge ausprobiert aber entweder ist erscheint überhaupt keine Anzeige. Oder die Anzeige im Textfeld wird nicht mehr gelöscht!



```
jTKODatum.setText(datumeinfügen);
jTKOZeit.setText(zeiteinfügen);
 String insertString = "INSERT ........ BEFEHL................
 st.executeUpdate(insertString);

try 
{
    Thread.sleep( 1000 );
} 
catch ( InterruptedException e ) 
{}
							
jTMitarbeitername.setText("");
jTPersonalnr.setText("");
jTKODatum.setText("");
jTKOZeit.setText("");
```


----------



## TommyMo (19. Oktober 2005)

Hi!

Ich hab zwar jetzt leider keinen Code parat, aber warum läßt du nicht einfach einen Timer mitlaufen? Löst vielleicht das Problem. Wobei ich gestehn muss, dass ich jetzt keine Ahnung habe wie du das mit dem Datenbankzugriff koordinieren kannst (wenn das überhaupt wichtig ist). Wenn der Timer die Zeit, die du ihm einstellen kannst, abgelaufen hat, dann löst er einfach ein Event aus, und dann löscht du einfach die Anzeige im Textfeld. 

Ich hoffe ich habe deine Frage richtig verstanden   

Gruß
TOM


----------



## sj41 (19. Oktober 2005)

ich würde einfach vor der SQL-Abfrage einen Thread starten, der in das Textfeld schreibt, sich dann 2 sekunden schlafen legt und danach den Inhalt wieder löscht. Ob das jedoch eine besonders elegante Lösung ist kann ich dir nicht sagen


----------



## Lautsprecher (20. Oktober 2005)

Hi Tom
das mit dem Timer ist auch Interessant, denn mit try and sleep funktioniert es nicht richtig:
Habe es jetzt mal so probiert:
try
{
     textfeld.setText("Datum")
    Thread.sleep( 1000 );
}
Funktioniert aber nicht


----------



## sj41 (20. Oktober 2005)

hi, probier mal nach dem setText(), repaint() aufzurufen. vielleicht klappts ja dann.


----------



## Thomas Darimont (20. Oktober 2005)

Hallo!


```
/**
   * 
   */
  package de.tutorials;
  
  import java.awt.event.ActionEvent;
  import java.awt.event.ActionListener;
  
  import javax.swing.JFrame;
  import javax.swing.JTextField;
  import javax.swing.Timer;
  
  /**
   * @author daritho
   * 
   */
  public class FillAndEmptyTextFieldOnIntervalExample extends JFrame {
  
  	JTextField textField;
  
  	boolean isFieldSet = false;
  
  	Timer timer = new Timer(2000, new ActionListener() {
  		public void actionPerformed(ActionEvent e) {
  			if (isFieldSet) {
  				textField.setText("");
  			} else {
  		        textField.setText(String.valueOf(System.currentTimeMillis()));
  			}
  			isFieldSet = !isFieldSet;
  		}
  	});
  
  	public FillAndEmptyTextFieldOnIntervalExample() {
  		super("FillAndEmptyTextFieldOnIntervalExample");
  		setDefaultCloseOperation(EXIT_ON_CLOSE);
  
  		textField = new JTextField(20);
  		add(textField);
  
  		timer.start();
  
  		pack();
  		setVisible(true);
  	}
  
  	/**
  	 * @param args
  	 */
  	public static void main(String[] args) {
  		new FillAndEmptyTextFieldOnIntervalExample();
  	}
  
  }
```
  Der SwingTimer fuehrt die Action im EventDispatchThread aus ... der java.util.Timer nicht...

  Gruss Tom


----------



## Lautsprecher (20. Oktober 2005)

sj41 hat gesagt.:
			
		

> hi, probier mal nach dem setText(), repaint() aufzurufen. vielleicht klappts ja dann.



Hi, habs versucht, aber ich erhalte immer noch ein leeres Textfeld.

Mein Code war jetzt


```
try
{
    textfeld.setText("blablaba");
    repaint();
   sleep(1000);
}
catch(Exception...)
{
}

textfeld.setText("");
```


----------



## Lautsprecher (20. Oktober 2005)

Hi Thomas,
soweit ich dein Pgm verstanden habe, läuft es mit timer.start(); dann ewig ab! Wie erreicht man es, dass der Text genau einmal ausgegeben wird, und dann die weiteren Schritte im Pgm abgearbeitet werden?


----------



## sj41 (20. Oktober 2005)

ok, am repaint() liegts nicht aber woran dann, seltsam? Dein Code hat bei mir funktioniert!


----------



## Lautsprecher (21. Oktober 2005)

Hi nochmal,
ich habe jetzt ein wenig rumgespielt, dabei ist mir etwas aufgefallen. Und zwar das zur Laufzeit immer erst der sleep ausgeführt wird und dann die anderen Anweisungen! Kann das sein
Also dass egal wo der sleep-Befehl in der Methode steht, dieser immer ERST vor den anderen 
Anweisungen ausgeführt wird

Grüße


----------



## schnuffie (21. Oktober 2005)

Mit sleep() schickst Du Deinen arbeitenden Thread "ins Bett". Dort verbringt er dann die halbe Nacht und arbeitet erst dann weiter.  

Toms Beispiel ist schon eine gute Möglichkeit.
Kenne mich mit Timers noch nicht aus, jedoch kannst Du auch einen herkömmlichen thread benutzen:


```
public class TextView implements Runnable {
 
private TextField textField;
private String text;
 
public TextView(TextField textField, String text) {
this.textField = textField;
this.text = text;
}
 
public void run() {
textField.setText(text);
try {
Thread.sleep(2000); //2s
}
catch (InterruptedException ie) {}
textField.setText("");
}
}
```
 

```
public void setTextMessage(TextField textField, String text) {
(new Thread(new TextView(textField, text))).start();
}
```
 
Das ist alles.


----------



## Thomas Darimont (21. Oktober 2005)

Hallo!

 Man sollte UI Komponenten innerhalb von Swing NIE von einem anderen Thread als dem Event Dispatch Thread manipulieren! Wenn man in einem anderen Thread ist
  (Kann man beispielsweise ueber: EventQueue.isDispatchThread() herausfinden).
  sollte man EventQueue / SwingUtilities .invokeLater/invokeAndWait(...) verwenden.
 Das ist Quasi das 1x1 der Swing-Programmierung...

  Gruss Tom


----------



## schnuffie (21. Oktober 2005)

Aha, wieder was dazugelernt --- und Tom, wie sähe jetzt mein Beispiel speziell für den Swing-Fall aus?


----------

