Wie kann ich die Länge eines JTextField-Inhalts ermitteln, wenn der Benutzer tippt?

8

JTextField hat ein keyTyped-Ereignis, aber es scheint, dass der Inhalt der Zelle zu diesem Zeitpunkt noch nicht geändert wurde.

Aus diesem Grund ist .length () immer falsch, wenn Sie hier lesen.

Es muss einen einfachen Weg geben, um die Länge zu erhalten, wie sie dem Benutzer nach einem Schlüsselstrich erscheint?

    
Allain Lalonde 30.12.2008, 21:41
quelle

4 Antworten

8

Dies ist wahrscheinlich nicht der optimale Weg (und es ist eine Weile her), aber in der Vergangenheit habe ich einen DocumentListener zum JTextField und zu jedem der Ereignisse hinzugefügt (einfügen, aktualisieren, entfernen) I:

%Vor%

Gibt die Gesamtlänge des Inhalts des Textfelds zurück.

    
Sean Bright 30.12.2008, 21:48
quelle
3

Dies könnte mit diesem "Bug" (oder besser "Feature") zusammenhängen / p>

  

Die Listener werden vor der Verarbeitung der Schlüsselereignisse benachrichtigt   erlauben Sie den Zuhörern, die Ereignisse zu "stehlen", indem Sie sie konsumieren. Das gibt   Kompatibilität mit dem älteren Konzept des Konsumierens von Ereignissen.
Das "typisierte"   Ereignis bedeutet nicht, dass Text in die Komponente eingegeben wurde . Das ist kein   Fehler, es ist beabsichtigtes Verhalten.

Eine mögliche Lösung ist ein zu hören Dokument

%Vor%
  

Beachten Sie, dass dies funktioniert, egal wie der Text geändert wird; über eine Zwischenablage ausschneiden / einfügen, progamatic "setText ()" auf der TextField, oder der Benutzer in das Feld auf der Benutzeroberfläche eingeben.

    
VonC 30.12.2008 21:50
quelle
3

KeyEvent s sind Low-Level-Ereignisse, die hier nicht angebracht sind [das klingt vertraut].

Wie weiß das JTextField System, dass ein Charakter eingegeben wurde? Durch ein Key-Typ-Event (IIRC, erfolgt durch die PL & amp; F). Wird das Ereignis vor dem Listener an den Systemlistener gesendet? Es könnte oder könnte nicht tun.

In diesem Fall möchten Sie wahrscheinlich zu Document gehen und einen höheren Listener hinzufügen. Mit Swing ist es eine gute Idee, früh auf das Modell zu setzen - die Interfaces der 'J' Klasse sind inkohärent. Wenn Sie Eingabedaten abfangen, möchten Sie wahrscheinlich ein benutzerdefiniertes Modell (oder im Fall von Document a DocumentFilter ).

    
Tom Hawtin - tackline 30.12.2008 22:10
quelle
2

Verwenden Sie diesen Code:

%Vor%     
quelle

Tags und Links