Comment obtenir la longueur du contenu d'un JTextField lorsque l'utilisateur le tape?
-
03-07-2019 - |
Question
JTextField a un événement keyTyped mais il semble qu’au moment de son déclenchement, le contenu de la cellule n’ait pas encore changé.
A cause de cela, la longueur () est toujours fausse si elle est lue ici.
Il doit exister un moyen simple d'obtenir la longueur telle qu'elle apparaît à l'utilisateur après un appui sur une touche?
La solution
Ce n'est probablement pas la méthode optimale (et cela fait longtemps), mais j’avais ajouté un DocumentListener à JTextField et à n’importe lequel des événements (insertion, mise à jour, suppression) I:
evt.getDocument().getLength()
Qui retourne la longueur totale du contenu du champ de texte.
Autres conseils
Cela peut être lié à ce & bug; bug " (ou plutôt "fonctionnalité")
Les écouteurs sont informés des événements clés avant de les traiter. permettre aux auditeurs de "voler" les événements en les consommant. Cela donne compatibilité avec l’ancienne notion awt d’événements consommateurs.
Le " typé " événement ne signifie pas que du texte a été saisi dans le composant . Ceci n'est pas un bug, il est destiné comportement.
Une solution possible consiste à écouter un document associé
// Listen for changes in the text
myTextField.getDocument().addDocumentListener(new DocumentListener() {
public void changedUpdate(DocumentEvent e) {
// text was changed
}
public void removeUpdate(DocumentEvent e) {
// text was deleted
}
public void insertUpdate(DocumentEvent e) {
// text was inserted
}
});
Notez que cela fonctionne quelle que soit la manière dont le texte est modifié. via un presse-papiers couper / coller, progamatique "setText ()" sur le TextField, ou l'utilisateur qui tape dans le champ de l'interface utilisateur.
Comment le système JTextField
sait-il qu'un caractère a été saisi? Par le biais d’un événement à clavier (IIRC, réalisé par le biais de PL & F). L'événement est-il envoyé à l'écouteur du système avant votre écouteur? Cela pourrait ou ne pourrait pas être fait.
Dans ce cas, vous souhaiterez probablement accéder au Document
et ajouter un écouteur de niveau supérieur. Avec Swing, il est judicieux d’opter pour le modèle à un stade précoce: les interfaces de la classe «J» sont incohérentes. Si vous interceptez des données d'entrée, vous souhaitez probablement un modèle personnalisé (ou dans le cas de Document
un DocumentFilter
).
Utilisez ce code:
public void jTextField6KeyReleased(java.awt.event.KeyEvent evt)
{
System.out.println(jTextField6.getText().length());
}