Numérique TextField pour les Entiers en JavaFX 8 avec TextFormatter et/ou UnaryOperator
Je suis en train de créer un numérique TextField pour les Entiers à l'aide de la TextFormatter de JavaFX 8.
Solution avec UnaryOperator:
UnaryOperator<Change> integerFilter = change -> {
String input = change.getText();
if (input.matches("[0-9]*")) {
return change;
}
return null;
};
myNumericField.setTextFormatter(new TextFormatter<String>(integerFilter));
Solution avec IntegerStringConverter:
myNumericField.setTextFormatter(new TextFormatter<>(new IntegerStringConverter()));
Les deux solutions ont leurs propres problèmes. Avec le UnaryOperator, je ne peut entrer que des chiffres de 0 à 9 comme prévu, mais j'ai aussi besoin d'entrer des valeurs négatives comme "-512", où le signe est seulement permis à la première position. Aussi je ne veux pas des chiffres comme "00016" ce qui est encore possible.
La IntegerStringConverter méthode qui fonctionne le mieux: Chaque numéro non valide comme "-16-123" n'est pas acceptée et les nombres tels que "0123" converties "123". Mais la conversion ne se produit que lorsque le texte est engagée (par l'intermédiaire de la touche entrée) ou lorsque le Champ de texte perd de sa pertinence.
Est-il un moyen de faire respecter la conversion de la seconde méthode avec le IntegerStringConverter chaque fois que la valeur du Champ est mis à jour?
OriginalL'auteur ShadowEagle | 2016-11-07
Vous devez vous connecter pour publier un commentaire.
Le convertisseur est différent pour le filtre: le convertisseur indique comment convertir le texte en valeur, et le filtre de changements de filtres, l'utilisateur peut faire. Il sonne comme ici, vous voulez à la fois, mais vous voulez que le filtre avec plus de précision filtrer les changements qui sont autorisés.
J'ai l'habitude de trouver qu'il est plus facile de vérifier la nouvelle valeur du texte si la modification est acceptée. Vous souhaitez éventuellement avoir une
-
, suivie par1-9
avec n'importe quel nombre de chiffres après. Il est important de permettre à une chaîne vide, sinon l'utilisateur ne sera pas en mesure de supprimer tout.Donc, vous avez probablement besoin de quelque chose comme
Vous pouvez même ajouter plus de fonctionnalités pour le filtre à laisser le processus de
-
de façon plus intelligente, par exempleCela permettra à l'utilisateur d'appuyer sur
-
à tout moment et il va alterner le signe de l'entier.SSCCE:
?
sur le nombre de groupe! A été de penser à-?([1-9]?|[1-9][0-9]*)
, mais c'est beaucoup plus propre!J'apprécie vraiment vos efforts, votre solution a parfaitement fonctionné!
OriginalL'auteur James_D
OriginalL'auteur user8498734