JSpinner Événements de changement de Valeur
Comment faire la mise à jour immédiatement lorsque le jSpinner valeur a été modifiée.
ChangeListener listener = new ChangeListener() {
public void stateChanged(ChangeEvent e) {
jLabel.setText(e.getSource());
}
};
spinner1.addChangeListener(listener);
Le code ci-dessus ne marche pas modifier le texte de l'étiquette automatiquement, il est nécessaire de vous de cliquer à nouveau n'importe où pour mettre à jour.
- La prochaine fois, merci de poster un SSCCE (sscce.org), donc on peut voir le contexte de la façon dont vous utilisez le code.
- Même problème, je n'ai pas vu une solution encore. Le ChangeListener méthode n'est pas appelée jusqu'à ce que la cible est perdue à partir de l'JSpinner. J'ai fait une solution de contournement avec keylisteners, mais que c'est moche
Vous devez vous connecter pour publier un commentaire.
La réponse est de configurer le module de formatage utilisé dans le JFormattedTextField qui est un enfant de la fileuse de l'éditeur:
Malheureusement, l'obtention d'une main sur il est aussi long et sale que la phrase d'introduction:
Un peu (mais pas beaucoup) le moyen le plus propre peut-être à la sous-classe NumberEditor et d'exposer une méthode qui permet la config
public JFormattedTextField getTextField(JSpinner spinner) { return ((JSpinner.DefaultEditor)spinner.getEditor()).getTextField(); }
j'ai enlevé la vérification des erreurs, mais c'est une autre possibilité.Le code vous montrer s'affiche correctement. Pour référence, voici un exemple de travail.
Addendum: Alors que le
JSpinner
a le focus, gauche et droite les touches fléchées pour déplacer le curseur. La flèche vers le haut incréments et la flèche vers le bas décrémente le champ contenant le curseur. Le changement est (effectivement) simultanée dans les deux de la toupie et de l'étiquette.Pour accéder à la
JFormattedTextField
de laJSpinner.DateEditor
, utilisez le parentgetTextField()
méthode. Approprié signe auditeur ou de saisie de texte auditeur peut alors être utilisé pour mettre à jour l'étiquette souhaitée.Addendum: mise à Jour pour utiliser
setCommitsOnValidEdit
, comme l'a suggéré ici.it required you to click again anyplace to update
, ce qui signifie que vous devez changer d'orientation à partir de la touche de navigation pour mettre à jour l'étiquette. user236501 cherchais un moyen de mettre à jour l'étiquette chaque fois que vous modifiez quelque chose pour le compteur (par exemple, insérer un caractère).DocumentListener
, qui utilise l'éditeur du formateur, est indiqué ci-dessus.DocumentListener
ne fonctionne pas comment vous voulez, car il est appelé trop souvent. Par exemple, elle sera appelée, même lorsque vous cliquez à l'intérieur de la casserole sans rien changer. Il pourrait être ok pour ce problème, mais pas tous. EtKeyListener
s ouCaretListener
s sont encore pire, parce qu'ils ne travaillent pas pour le texte collé.Problème ici est que lorsque vous modifiez le
JSpinner
valeur manuellement en tapant sur le clavier, lestateChanged
événement n'est pas déclenché, jusqu'à ce que le focus est perdu par leJSpinner
ou jusqu'à ce que touche Entrée.Si vous voulez télécharger de la valeur, une
KeyListener
est nécessaire, qui va effectuer unsetValue
dans leJSpinner
pour chaque clé tapé.Je laisse un exemple ici pour une
JSpinner
avec unSpinnerNumberModel
:Il pourrait être une réponse tardive mais vous pouvez utiliser mon approche.
Comme spuas mentionné ci-dessus, le problème est que
stateChanged
événement est déclenché uniquement lorsque le focus est perdu ou la touche Entrée est pressée.À l'aide de KeyListeners n'est pas une bonne idée.
Il serait préférable d'utiliser
DocumentListener
à la place. J'ai modifié spuas l'exemple un peu et c'est ce que j'ai:De la dernière réponse peut être réarrangé un peu pour le rendre un peu plus souple. Vous pouvez simplement utiliser cette nouvelle MyJSpinner à la place de tout JSpinner. Le plus gros changement est que vous pouvez utiliser cette nouvelle version avec n'importe quel modèle sous-jacent de la JSpinner (int, double, octet, etc.)
Je suis nouveau donc j'ai peut-être la rupture de certaines règles et je pourrais être en retard. Mais j'ai trouvé certaines réponses un peu confus, alors j'ai joué un peu dans l'EDI NetBeans et a constaté que si vous faites un clic droit sur le jspinner composant d'interface graphique placé sur votre jform et aller à des événements-> modifier, le code sera généré pour vous.