Bonjour,
je cherche à trouver le meilleur moyen de propager les infos contenues dans un champ de saisie TextField vers une propriété de type DoubleProperty.
Ça marche très bien lorsque l’utilisateur saisi des chiffres, mais je ne parviens pas à trouver une solution optimale lorsque l’utilisateur utilise une notation scientifique (e, E).
Sans précaution particulière, l'utilisation d'un listener de type changelistener déclenche une exception de type NumberFormatException lorsque l’utilisateur saisi e ou E.
Rien d'anormal, sauf que je ne parviens pas à trouver une solution à ce problème.

J'ai initialement pensé à utiliser un changelistener de ce type :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
ChangeListener<String> volumeOfreactorListener = (ObservableValue<? extends String> o,String oldVal, String newVal)->{
		try
	    {
	        Double.parseDouble(newVal);
	        // Valid double
	        node.myProperty().set(Double.valueOf(newVal));
	    }
	    catch (NullPointerException | NumberFormatException ex)
	    {
	        // Not valid double
	    }
	};
Le problème intervient si l'utilisateur saisi uniquement une valeur du type "x.xe" sans rien mettre après le "e". Je ne peux pas laisser l’utilisateur quitter le champ incomplet.
Si je tente de restaurer la valeur de la propriété dans la TextField dans le cas où la conversion n'est pas possible, alors, cela revient à m’empêcher d’utiliser les notations scientifiques.
Car il va m'effacer les caractères de type e chaque fois qu'une erreur de conversion est rencontrée.

J'ai ensuite pensé à utiliser un listener de type myTextField.setOnKeyPressed(new EventHandler<KeyEvent>() { ...});
En filtrant la saisi clavier aux touches Enter et Tab, on sais quand l’utilisateur valide la saisie, et on peut vérifier la compatibilité du champ saisi avec une propriété de type DoubleProperty.
Problème : lorsque l'utilisateur clic sur un autre élément graphique sans valider la saisie par un appui sur les touches Enter ou Tab, les modifications ne sont pas prises en compte.

Inversement, lorsque j'utilise un listener de type myTextField.focusProperty(), le changement n'est pas propagé lorsque l’utilisateur utilise les touches du clavier pour valider la saisie, ce qui peut être source d'erreur si il n'est pas suffisamment attentif.

L'idéal aurait été une combinaison de ces listeners.
J'aimerais donc avoir votre avis sur l'approche qui vous semble la plus pertinente pour traiter ce genre de cas.
Merci d'avance.