Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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?
Java:
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
}}
});
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"
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.
ä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.
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...
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.
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
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.
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.
Java:
String input = null;
final JTextField tf = new JTextField();
tf.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
input = tf.getText();
}
});