# JTextField KeyListener



## Cedist (25. Jul 2012)

Hallo Community

Ich habe ein Text Feld. Und ich möchte das der User da eine Zeit angeben kann(Sekunden). Nur übernimmt es mir die neu eingegebene Zahl nicht, und das ganze auch ohne Enter drücken. Ich habe ein "Execute" Button und um beim drücken von diesem soll dies übernommen werden...aber er nimmt nur immer das was schon am Anfang gesetzt ist.
Verwende ich den falschen Listener, oder hab ichs nur falsch gecodet?
Falls ja, welchen verwenden, und wie? 


```
String time_diff = compProps.getProperty(TIME_DIFF);
    	
        //Textfield
        final JTextField timediff_field = new JTextField();
        timediff_field.setBounds(10, 10, 55, 20);
        timediff_field.setEditable(true);
        timediff_field.setText(time_diff);
        
        //panel_timediff.add(timedifflabel);
        panel_timediff.add(timediff_field);
        
        //Action
        timediff_field.addKeyListener(new KeyListener(){
        	public void keyTyped(KeyEvent evt) {}
			
			public void keyReleased(KeyEvent evt) {}
        	
        	public void keyPressed(KeyEvent evt) {
            		String timediff = timediff_field.getText();
            		compProps.setProperty(TIME_DIFF, timediff);
        	}
        	
        	
        });
```


----------



## xehpuk (25. Jul 2012)

Hey,



Cedist hat gesagt.:


> Ich habe ein "Execute" Button und um beim drücken von diesem soll dies übernommen werden...aber er nimmt nur immer das was schon am Anfang gesetzt ist.


Dazu lässt sich nichts sagen, weil kein Code vorhanden.

Auf Änderungen in einer Textkomponente reagiert man mit einem [JAPI]javax.swing.event.DocumentListener[/JAPI]. Diesen fügt man dem [JAPI]javax.swing.text.Document[/JAPI] der [JAPI]javax.swing.text.JTextComponent[/JAPI] über [JAPI]javax.swing.text.JTextComponent#getDocument()[/JAPI] hinzu.


----------



## Cedist (25. Jul 2012)

Also am anfang hatte ich ein ActionListener auf dem Textfield, aber da muss man ja Enter drücken damit es übernommen wird, und ich will jetzt nicht so programmierfaul sein, und schreiben: "Enter drücken für validierung" oder so... Sondern einfach das es übernommen wird nachdem ma es geschrieben hat.

Hier noch der Code von der Action des exe Button.

```
exeButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
            	
            	SmartsReplayTestsuite ts  = 
        			new SmartsReplayTestsuite("Run class for SmartsReplayTestcase", "C:/Daten/TAT/logs");
            	compProps.list(System.out);
            	ts.execute(csvPath, xlsDir, xlsFile, securityRadio.isSelected(), compProps);
            }
        });
```


----------



## xehpuk (25. Jul 2012)

Cedist hat gesagt.:


> Sondern einfach das es übernommen wird nachdem ma es geschrieben hat.


Dass man seine Eingabe bestätigt, ist aber der normale Weg. Woher weißt du, wann der Benutzer fertig mit der Eingabe ist? Diese besteht wohl nicht nur aus einem Zeichen? Was passiert, wenn er sich vertippt?

Dein ActionListener sieht wohl den alten Wert, weil er auf den alten Wert in _compProps_ zugreift, welcher durch die falsche Nutzung des KeyListener verursacht wird.


----------



## Cedist (25. Jul 2012)

Ich habs jetzt selber gelöst, habe einfach alle Key Methoden auspropiert, und mit keyReleased hats funktioniert  Ohne Eingabetaste!

```
public void keyReleased(KeyEvent evt) {
				String timediff = timediff_field.getText();
        		compProps.setProperty(TIME_DIFF, timediff);
            	compProps.list(System.out);
			}
```


----------



## xehpuk (25. Jul 2012)

Das ist weiterhin falsch. Das Event wird auch ausgelöst, wenn nur eine Pfeiltaste oder dergleichen gedrückt wurde.

Gibt es einen bestimmten Grund, dass du einen KeyListener verwenden willst? Ich behaupte mal, dass man ihn so gut wie nie braucht und er stattdessen oft für falsche Zwecke eingesetzt wird.

[JAPI]javax.swing.JFormattedTextField[/JAPI] könnte für dich auch interessant sein.


----------



## Cedist (26. Jul 2012)

Der KeyListener ist die einfachste Lösung, und es funktioniert auch. Und die User die das GUI benützen, wissen das sie da nur Zahlen eingeben dürfen. Ich muss dieses GUI nicht DAU sicher machen, da es nur User verwenden, die das eigentlich schon kennen, sprich das GUI dient nur der faulheit der User 
Pfeiltasten etc. werden nicht registriert und der Testcase der mit dem GUI ausgeführt wird läuft auch ohne Probleme und mit den richtigen properties. 

Ich danke dir dennoch für die Hilfe und dein Engagement :toll:


----------

