Utiliser JavaFX / TextFormatter

environnement

Qu'est-ce que Text Formatter?

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.

Conservation du modèle de données

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

filtre

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

Qu'est-ce qu'un filtre?

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;

À propos de la sélection

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.

a.png

Exemple d'utilisation de TextFormatter

TextFormatter est créé en passant StringConverter, filter ou les deux. TextFormatter (JavaFX): API Document

Voici un exemple.

Champ de texte pour modifier la devise du yen japonais

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);

b.png

"" 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");
});

9.png

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.

c.png

Champ de texte où seuls les nombres peuvent être saisis

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".

e.png

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.

Champ de texte pour modifier l'adresse IPv4

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.

f.png

Inet4AddressFormatter.java

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.

Une autre utilisation de TextFormatter

É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.

référence

Blog de Yutchi: J'ai également essayé le texte formaté ajouté dans JDK8u40. Source: GitHub FXLM: GitHub

Recommended Posts

Utiliser JavaFX / TextFormatter
Utilisez l'API Clipboard de JavaFX
[JavaFX] [Java8] Comment utiliser GridPane
Utilisez before_action! !!
Texte JavaFX
Utiliser XMLHttpRequest
Mémorandum JavaFx
Utiliser AutosizingTextView