# JTextField auslesen, wenn Enter gedrückt..



## KlapptNich (9. Dez 2009)

hi!

Ich bin dabei mich mit Keylistener-Events auseinander zu setzen und möchte ein JTextField dazu bringen, seinen Inhalt jedes Mal auszugeben, wenn die Enter-Taste gedrückt wurde.

Allerdings funktioniert die Sache bei mir nicht, es hakt bei mir wie immer daran, dass ich nicht weiss von wo nach wo ich denken muss 

So sieht der Teilcode aus, ich kann vom Inneren der keyPressed Methode nicht auf das Objekt zugreifen.. Was ist mein Denkfehler?


```
text.addKeyListener(new KeyListener()	{ //text ist ein JTextField
	        public void keyTyped(KeyEvent e) {}
	        public void keyReleased(KeyEvent e) {}
	        public void keyPressed(KeyEvent e) {
                     int key = e.getKeyCode();

                     if (key == KeyEvent.VK_ENTER) {         
                     String inhalt = text.getText();                    //hier kann ich nicht auf text zugreifen
}}
  		});
```


----------



## javimka (9. Dez 2009)

mach text mal final: [c]final JTextField text = new JTextField(...[/c]


----------



## KlapptNich (9. Dez 2009)

Danke, das hat mich schon weitergebracht!

Leider bringt mich das auf das neue Problem: wenn ich den String inhalt lokal erstelle kann ich auf anderer Stelle nicht auf ihn zugreifen, wenn ich ihn global mache, dann meckert Eclipse,

        "The final local variable inhalt cannot be assigned, since it is defined in an enclosing type"


----------



## eRaaaa (9. Dez 2009)

```
wenn ich ihn global mache, dann meckert Eclipse,
```

diesen solltest du dann nicht final machen !


----------



## javimka (9. Dez 2009)

Er müsste den String final machen, um ihn im Listener verwenden zu können. Aber wenn er final ist, dann kann man ihm nichts mehr zuweisen. Eine Möglichkeit wäre, den String als Attribut in die Klasse aufzunehmen, dann wäre beides möglich.

Aber das Bedürfnis den String innerhalb der Methode und innerhalb des Listeners zu verwenden, deutet waage auf einen konzeptionellen Fehler hin.


----------



## KlapptNich (9. Dez 2009)

Das möchte Eclipse aber, weil wenn er nich final is, sagt es mir es kann nich auf eine nicht-final variable zugreifen...


----------



## eRaaaa (9. Dez 2009)

javimka hat gesagt.:


> Eine Möglichkeit wäre, den String als Attribut in die Klasse aufzunehmen, dann wäre beides möglich.



äh, ist das dann nicht global? deswegen sagte ich ja, wenn es eine klassenvariable ist, muss er das final weglassen! sonst kann er ihr sie da nicht zuweisen!



			
				javimka hat gesagt.:
			
		

> Er müsste den String final machen, um ihn im Listener verwenden zu können.


? der string input ist doch im listener deklariert...er will ihn jetzt aber auch ausserhalb *irgendwo* nutzen. ?!?!


----------



## javimka (9. Dez 2009)

dann habe ich dich falsch verstanden, sorry


----------



## KlapptNich (9. Dez 2009)

das mit dem konzeptionellen Fehler kann sehr gut möglich sein, ich habe bei dem gesamten Programm Probleme zu verstehen was an welcher Stelle stehen soll...

Wie sollte man dieses Problem denn sonst lösen?


----------



## javimka (9. Dez 2009)

Wieso muss denn dein String überhaupt ausserhalb des Listeners sichtbar sein? Für eine bestimmte Methode in der Klasse? Dann übergibst du den String besser als Argument.


----------



## KlapptNich (9. Dez 2009)

Also im Endeffekt soll der String an einen Socket übergeben werden (Also im Netzwerk übertragen)
Das kann ich mit einer while-Schleife machen, aber dann habe ich dummerweise 100%CPU Nutzung 

darum wollte ich die Übertragungen etwas intelligenter machen und nur dann etwas übertragen wenn eben Enter gedrückt wurde


----------



## javimka (9. Dez 2009)

Das ist natürlich schon richtig, aber mach doch eine Methode sendString(String text), die dann den String text durchs Netzwerk sendet. Dann kannst du im Listener sendString(inhalt) aufrufen und der String wird gesendet.


----------



## KlapptNich (9. Dez 2009)

Danke, ich werd mich dann mal morgen dransetzen..


----------



## L-ectron-X (1. Feb 2010)

Ganz unkompliziert geht es, in dem man einfach einen ActionListener ans Textfeld hängt.
Durch Drücken auf die ENTER-Taste wird das ActionEvent dann ausgelöst, wenn das Textfeld den Fokus hat.


```
String input = null;
final JTextField tf = new JTextField();
tf.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent e) {
    input = tf.getText();
  }
});
```


----------

