Je veux que la boîte de message apparaisse immédiatement après que l'utilisateur modifie la valeur dans le champ de texte. Actuellement, je dois appuyer sur la touche Entrée pour faire apparaître la boîte de message. Y a-t-il un problème avec mon code?
textField.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
if (Integer.parseInt(textField.getText())<=0){
JOptionPane.showMessageDialog(null,
"Error: Please enter number bigger than 0", "Error Message",
JOptionPane.ERROR_MESSAGE);
}
}
}
Toute aide serait appréciée!
java
swing
listener
jtextfield
documentlistener
user236501
la source
la source
La réponse habituelle à cela est "utiliser un
DocumentListener
". Cependant, je trouve toujours cette interface encombrante. Vraiment, l'interface est sur-conçue. Il a trois méthodes, pour l'insertion, la suppression et le remplacement de texte, lorsqu'il n'a besoin que d'une seule méthode: le remplacement. (Une insertion peut être considérée comme un remplacement d'aucun texte par du texte et une suppression peut être considérée comme un remplacement d'un texte sans texte.)Habituellement, tout ce que vous voulez, c'est savoir quand le texte dans la boîte a changé , donc une
DocumentListener
implémentation typique a les trois méthodes appelant une méthode.Par conséquent, j'ai créé la méthode utilitaire suivante, qui vous permet d'utiliser une méthode plus simple
ChangeListener
que aDocumentListener
. (Il utilise la syntaxe lambda de Java 8, mais vous pouvez l'adapter pour l'ancien Java si nécessaire.)Contrairement à l'ajout d'un écouteur directement au document, cela gère le cas (inhabituel) où vous installez un nouvel objet de document sur un composant de texte. De plus, il contourne le problème mentionné dans la réponse de Jean-Marc Astesana , où le document déclenche parfois plus d'événements qu'il n'en a besoin.
Quoi qu'il en soit, cette méthode vous permet de remplacer le code ennuyeux qui ressemble à ceci:
Avec:
Code rendu public. S'amuser!
la source
abstract class DocumentChangeListener implements DocumentListener
avec une méthode abstraite supplémentairechange(DocumentEvent e)
que vous appelez à partir des 3 autres méthodes. Cela me semble plus évident car il utilise plus ou moins la même logique que lesabstract *Adapter
auditeurs.changedUpdate
méthode doit être invoqué explicitement via un appel au sein de chacuninsertUpdate
etremoveUpdate
, pour le faire fonctionner ..Créez simplement une interface qui étend DocumentListener et implémente toutes les méthodes DocumentListener:
puis:
ou vous pouvez même utiliser l'expression lambda:
la source
N'oubliez pas que lorsque l'utilisateur modifie le champ, DocumentListener peut parfois recevoir deux événements. Par exemple, si l'utilisateur sélectionne tout le contenu du champ, puis appuyez sur une touche, vous recevrez un removeUpdate (tout le contenu est supprimé) et un insertUpdate. Dans votre cas, je ne pense pas que ce soit un problème mais, d'une manière générale, c'est le cas. Malheureusement, il semble qu'il n'y ait aucun moyen de suivre le contenu de textField sans sous-classer JTextField. Voici le code d'une classe qui fournit une propriété "text":
la source
Je sais que cela se rapporte à un problème très ancien, mais cela m'a aussi causé des problèmes. Comme kleopatra a répondu dans un commentaire ci-dessus, j'ai résolu le problème avec a
JFormattedTextField
. Cependant, la solution nécessite un peu plus de travail, mais est plus nette.Le
JFormattedTextField
ne déclenche pas par défaut un changement de propriété après chaque changement de texte dans le champ. Le constructeur par défaut deJFormattedTextField
ne crée pas de formateur.Cependant, pour faire ce que l'OP a suggéré, vous devez utiliser un formateur qui invoquera la
commitEdit()
méthode après chaque modification valide du champ. LacommitEdit()
méthode est ce qui déclenche le changement de propriété à partir de ce que je peux voir et sans le formateur, cela est déclenché par défaut lors d'un changement de focus ou lorsque la touche Entrée est enfoncée.Voir http://docs.oracle.com/javase/tutorial/uiswing/components/formattedtextfield.html#value pour plus de détails.
Créez un
DefaultFormatter
objet formatter ( ) par défaut à transmettre à l'JFormattedTextField
un via son constructeur ou une méthode de définition. Une méthode du formateur par défaut estsetCommitsOnValidEdit(boolean commit)
, qui définit le formateur pour déclencher lacommitEdit()
méthode chaque fois que le texte est modifié. Cela peut ensuite être récupéré en utilisant aPropertyChangeListener
et lapropertyChange()
méthode.la source
Mais je ne voudrais pas simplement analyser tout ce que l'utilisateur (peut-être par accident) touche sur son clavier en un
Integer
. Vous devez attraper toutException
s jeté et assurez-vous qu'ilJTextField
n'est pas vide.la source
Si nous utilisons la méthode exécutable, SwingUtilities.invokeLater () lors de l'utilisation de l'application d'écoute de document se bloque parfois et prend du temps pour mettre à jour le résultat (selon mon expérience). Au lieu de cela, nous pouvons également utiliser l'événement KeyReleased pour l'écouteur de changement de champ de texte comme mentionné ici .
la source
c'était la version mise à jour de Codemwnci. son code est assez fin et fonctionne très bien sauf le message d'erreur. Pour éviter l'erreur, vous devez modifier l'énoncé de condition.
la source
Vous pouvez même utiliser "MouseExited" pour contrôler. exemple:
la source
Je suis tout nouveau à WindowBuilder et, en fait, je reviens juste à Java après quelques années, mais j'ai implémenté "quelque chose", puis j'ai pensé le chercher et j'ai trouvé ce fil.
Je suis en train de tester cela, donc, étant donné que je suis nouveau dans tout cela, je suis sûr que je dois manquer quelque chose.
Voici ce que j'ai fait, où "runTxt" est une zone de texte et "runName" est un membre de données de la classe:
Cela semble beaucoup plus simple que ce qui est ici jusqu'à présent, et semble fonctionner, mais, étant donné que je suis en train d'écrire ceci, j'apprécierais d'entendre tous les pièges oubliés. Est-ce un problème que l'utilisateur pourrait entrer et quitter la zone de texte sans apporter de modification? Je pense que tout ce que vous avez fait est une mission inutile.
la source
Utilisez un KeyListener (qui se déclenche sur n'importe quelle touche) plutôt que l'ActionListener (qui se déclenche à l'entrée)
la source
field.getText()
renvoie la valeur initiale. et l'événement (arg0.getKeyChar()
) renvoie la touche d'erreur, la vérification des erreurs est nécessaire pour déterminer si vous devez concaténer avec le texte du champ.DocumentFilter ? Il vous donne la possibilité de manipuler.
[ http://www.java2s.com/Tutorial/Java/0240__Swing/FormatJTextFieldstexttouppercase.htm ]
Désolé. J'utilise Jython (Python en Java) - mais facile à comprendre
la source