Bonjour à tous,
je suis sur ce problème depuis des heures, et n'ayant toujours pas trouvé la solution, je me tourne vers vous.
Donc voilà, j'ai un JSpinner qui a pour modèle une SpinnerListModel qui contient elle même une ArrayList de String (pour info, des adresses mails).
Après avoir à peu près le compris le fonctionnement, je suis sur le casse-tête qu'est la saisie. Mon problème de base est que j'aimerais que l'on puisse modifier directement le champ en saisie, seulement je me suis rapidement rendu compte que la simple saisie ne sauvegarde pas la valeur pour autant. J'ai donc tant bien que mal réussi à ajouter un des Listener pour notifier la saisie.
La solution que j'ai retenue a donc été de mettre un KeyListener sur le JTextField de l'Editor du JSpinner, KeyListener que je dois changer lorsque le ChangeListener sur le JSpinner détecte un changement (vous suivez ?), je suppose.
Le vrai problème, que je ne parviens pas à résoudre, est que lorsque j'exécute la méthode commitEdit() du JSPinner, il me remet la première valeur, et non celle saisie. J'ai essayé de contourner cela en assignant à mon JSpinner par la méthode setValue(Object value) la valeur du JTextField qui est donc la source de l'événement KeyListener. Et là, la méthode setValue déclenche une IllegalArgumentExcepetion, ce que je ne comprends pas puisque ma liste contient bien des chaînes
Bon c'est un gros pavé, mais je voulais expliquer mon problème le plus clairement possible. Donc si quelqu'un a la solution a l'un des problèmes que j'ai énoncés, et que ça me permet de réussir ce que je veux (sauvegarder la saisie dans le JSpinner), je lui en serais très reconnaissant !
Si ça peut aider, voici un extrait de code qui délcenche l'exception IllegalArgumentExcepetion :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 public void keyReleased(KeyEvent e) { try { js.setValue("test"); js.commitEdit(); System.out.println("sauvé : "+js.getValue().toString()); } catch (ParseException pe) { pe.printStackTrace(); } }
EDIT :
Bon, en attendant mieux, j'ai rusé.
En attributs, j'ai ajouté une ArrayList qui est une copie de celle contenue dans le JSpinner, et un entier qui représente l'index actuel (dans le JSpinner).
Du coup, je mets à jour l'index lorsque le JSpinner change d'état (lorsque l'on clique sur les flèches) et je mets à jour en même temps le JTextField du JSpinner en copiant la valeur de mon ArrayList attribut trouvée à l'index précédemment modifié.
Lors d'une saisie, je modifie la chaine contenue à l'index attribut en copiant la valeur trouvée dans le JTextField.
L'inconvénient, c'est que je vais devoir faire autant d'attributs que je veux de JSpinner (2 fois en plus en fait, en gérant les index) et également beaucoup de classes de Listeners... J'aimerais bien éviter ça, donc si quelqu'un a mieux, je suis preneur !
Partager