TextFormatter <T>
est une classe qui gère la "conversion et la modification" dans un contrôle d'entrée de texte, et est utilisée en le définissant dans un contrôle d'entrée de texte tel que TextField
ou TextArea
. Il a les rôles suivants.
T
TextFormatter contient le modèle de données du type spécifié par l'argument de type T
.
Vous pouvez le récupérer avec getValue ()
et obtenir la propriété avec valueProperty ()
, donc vous pouvez également faire la liaison de propriété. De plus, cette "valeur" et le texte du contrôle de saisie de texte "changeront l'un après l'autre quel que soit celui qui est réécrit.
StringConverter
Par exemple, si vous voulez éditer des données de type Integer avec TextField
, vous devez les convertir en une représentation textuelle et l'afficher. En outre, pour traiter la valeur modifiée comme un entier, vous devez analyser le texte. StringConverter est une interface qui fournit un cadre pour de tels types d'interconversion.
JavaFX a déjà un StringConverter intégré pour les types courants, vous pouvez donc choisir de l'utiliser ici. Package javafx.util.converter
TextFormatter.Change
TextFormatter.Change
est une classe qui contient le changement d'état du contrôle d'entrée de texte. Chaque fois qu'un contrôle d'entrée de texte est ** manipulé **, un Change
est généré et passé au TextFormatter
. Il contient les informations suivantes.
TextFormatter.Change (JavaFX): API Document
TextFormatter a la fonction de traiter ce changement
. En d'autres termes, vous pouvez remplacer les changements que vous n'aimez pas par Change
par d'autres changements. Dans TextFormatter, cette opération est appelée un filtre et peut être implémentée comme une interface fonctionnelle qui reçoit «Change» et renvoie «Change».
UnaryOperator<TextFormatter.Change> filter;
La sélection est définie entre l'ancre et le carryt. Le report est la position actuelle où vous entrez, mais sachez que cela a des implications différentes quand il se trouve au début et à la fin de la sélection.
TextFormatter est créé en passant StringConverter, filter ou les deux. TextFormatter (JavaFX): API Document
Voici un exemple.
Essayez d'utiliser la classe intégrée CurrencyStringConverter
pour afficher Number comme devise.
Exemple
TextFormatter<Number> currencyFormatter = new TextFormatter<>(
new CurrencyStringConverter(Locale.JAPAN),
0,
change -> {
//La sélection ne peut pas être avant le premier caractère
change.setAnchor(Math.max(1, change.getAnchor()));
change.setCaretPosition(Math.max(1, change.getCaretPosition()));
//La plage de changement de texte ne peut pas être avant le premier caractère
change.setRange(Math.max(1, change.getRangeStart()), Math.max(1, change.getRangeEnd()));
return change;
});
textField1.setTextFormatter(currencyFormatter);
"" Est toujours affiché au début. Lorsque la touche Entrée est enfoncée, CurrencyStringConverter effectue une conversion mutuelle telle que «¥ 100000» → 100000 → «¥ 100 000», et 100000 est réglé sur «valeur» de «TextFormatter».
Grâce à «valeur», la représentation du champ de texte et le modèle de données peuvent être traités séparément. Voici un exemple de virage des caractères en rouge lorsque le nombre est de 30000 ou moins.
Exemple
currencyFormatter.valueProperty().addListener((o, oldValue, newValue) -> {
textField1.setStyle(newValue.intValue() <= 30000 ?
"-fx-text-fill: red" : "-fx-text-fill: black");
});
De plus, un filtre est passé à ce TextFormatter
afin que le premier caractère" \ "ne puisse pas être sélectionné, supprimé ou modifié. Vous trouverez ci-dessous une sélection de tous en appuyant sur Ctrl-A.
Exemple
Pattern notNumberPattern = Pattern.compile("[^0-9]+");
TextFormatter<String> lowerFormatter = new TextFormatter<>(change -> {
String newStr = notNumberPattern.matcher(change.getText()).replaceAll("");
int diffcount = change.getText().length() - newStr.length();
change.setAnchor(change.getAnchor() - diffcount);
change.setCaretPosition(change.getCaretPosition() - diffcount);
change.setText(newStr);
return change;
});
textField2.setTextFormatter(lowerFormatter);
Ce TextFormatter
ne reçoit que le filtre, et c'est un mécanisme pour remplacer le texte de différence de changement par uniquement des nombres à chaque fois. Vous trouverez ci-dessous le champ de texte après avoir tapé "2017-04-01T12: 00: 00".
Puisque le filtre convertit chaque mise à jour, il fonctionne non seulement pour la saisie de clé mais aussi pour le copier-coller et la définition de valeur par TextField :: setText
.
J'ai créé un champ d'adresse IPv4 dans lequel vous pouvez entrer une valeur numérique pour chaque octet. Vous ne pouvez pas modifier autre chose que des nombres et en tapant "." Sélectionne l'octet à droite.
Exemple
textField3.setTextFormatter(new Inet4AddressFormatter(null));
Il existe une limite pour déterminer le fonctionnement de la souris de l'utilisateur et le fonctionnement des touches à partir de la différence de changement. Si vous voulez faire quelque chose de élaboré, vous devriez envisager une autre approche.
Étant donné que le filtre est pratique car il ne peut connaître que la partie modifiée du champ de texte à la fois, il semble qu'il soit souvent utilisé facilement comme alternative au ChangeListener du champ de texte.
Blog de Yutchi: J'ai également essayé le texte formaté ajouté dans JDK8u40. Source: GitHub FXLM: GitHub