[JAVA] Utiliser ControlsFX / Validation

environnement

Validation dans ControlsFX

Utilisons la fonction de validation de ControlsFX pour implémenter la vérification d'entrée dans les applications JavaFX. Cela ressemble à ce qui suit.

0.png

Lorsque vous placez le curseur sur l'icône d'erreur, un message d'erreur s'affiche sous forme de puce d'outil. (C'est un peu difficile à remarquer)

0e.png

Préparation

Puisque ControlsFX est utilisé, ajoutez ControlsFX à la dépendance de Gradle ou Maven. Si vous souhaitez importer directement, veuillez télécharger depuis ici.

Validator Validator fournit un mécanisme de base pour vérifier votre entrée, et vous pouvez également définir vos propres conditions. Vous pouvez créer un validateur à l'aide des quatre méthodes suivantes.

Validator<T>:: mouvement
createEmptyValicator Définir l'entrée vide sur ERROR
createEqualsValidator Définir ERROR pour une entrée ne figurant pas dans la liste
createRegexValidator Définissez ERROR sur une entrée qui ne correspond pas à l'expression régulière
createPredicateValidator Prédicat spécifié<S>Définissez l'entrée qui ne correspond pas à ERROR

Predicate <S> est une interface fonctionnelle qui prend une ** valeur de contrôle ** et renvoie un booléen. Vous pouvez implémenter vos conditions préférées à l'aide d'expressions lambda, vous pouvez donc écrire clairement et c'est utile. Spécifiez également le niveau d'erreur (Severity.ERROR ou Severity.WARNING) et le message d'erreur dans l'argument. Validator (ControlsFX): API Document

Pour définir plusieurs validateurs dans un contrôle, vous devez utiliser Validator <T> :: combine pour synthétiser les validateurs, ce que je ne couvrirai pas ici. (Il existe également un moyen de le faire avec un seul, par exemple en utilisant "Veuillez entrer au format de" comme chèque vide.)

Un exemple de code de validation est donné ci-dessous.

ValidationSupport Valicator est utilisé en l'enregistrant dans la classe ValidationSupport. Après cela, la validation est effectuée automatiquement à chaque fois que le contenu d'entrée est modifié, de sorte que toute validation ne fonctionne qu'avec l'exemple suivant.

Utilisez ValidationSupport :: registerValidator pour enregistrer le validateur. Vous pouvez spécifier si vous souhaitez afficher l'icône requise au moment de l'enregistrement.

Lors de l'initialisation, etc.


ValidationSupport support = new ValidationSupport();
support.registerValidator(textField1, false, Validator.createEmptyValidator(
                "Text is required",
                Severity.WARNING));
support.registerValidator(textField2, Validator.createEqualsValidator(
                "A or B or C is required",
                Arrays.asList("A", "B", "C")));
support.registerValidator(textField3, Validator.createRegexValidator(
                "Number is required",
                Pattern.compile("^[0-9]+$"), Severity.ERROR));
support.registerValidator(checkBox, Validator.createEqualsValidator(
                "Check is required",
                Collections.singletonList(true)));
support.registerValidator(comboBox, Validator.createEqualsValidator(
                "First item is required",
                Collections.singletonList(comboBox.getItems().get(0))));
support.registerValidator(colorPicker, Validator.createEqualsValidator(
                "WHITE or BLACK is required",
                Arrays.asList(Color.WHITE, Color.BLACK)));
support.registerValidator(slider, Validator.createPredicateValidator(
                (Double value) ->  value > 0.0,
                "Positive number is required"));

//Utilisation de l'importation statique
// import static org.controlsfx.validation.Validator.*;
//Puis à chaque fois Validator.Tu n'as pas besoin d'écrire

5.png

La classe ValidationSupport a des propriétés pour tout le résultat de la validation, ce qui est utile pour implémenter un mécanisme pour suivre le résultat entier.

//Boutons valides uniquement si tous les résultats sont valides
Button buttonValidated= new Button();
buttonValidated.disableProperty().bind(support.invalidProperty());

//ListView pour afficher tous les messages d'erreur
ListView<ValidationMessage> listView = new ListView<>();
support.validationResultProperty().addListener((o, oldValue, newValue) ->
                listView.getItems().setAll(newValue.getMessages()));

ValidationSupport (ControlsFX): API Document

Si vous souhaitez modifier l'affichage des erreurs par CSS

L'exemple ci-dessus affiche uniquement l'erreur avec l'icône par défaut, mais vous pouvez la modifier. Utiliser StyleClassValidateionDecoration ajoutera une classe de style au contrôle, warning pour les avertissements et ʻerrorpour les erreurs. L'implémenteur doit décrire le style au moment de l'erreur dans le fichier CSS appliqué àScene`. Il peut également être utilisé en combinaison avec l'affichage d'icônes.

//Pour CSS uniquement
support.setValidationDecorator(new StyleClassValidationDecoration());
//Lors de l'utilisation simultanée d'icônes et de CSS
support.setValidationDecorator(new CompoundValidationDecoration(
    new GraphicValidationDecoration(), 
    new StyleClassValidationDecoration()));

Main.css


.warning{
    -fx-border-color: orange;
    -fx-border-width: 2;
}
.error{
    -fx-border-color: red;
    -fx-border-width: 2;
}

Où lire FXML, etc.


scene.getStylesheets().addAll(getClass().getResource("Main.css").toExternalForm());

Ce qui suit est l'affichage de l'écran lorsque vous utilisez l'icône et le CSS ensemble.

5e.png

Dans le cas de CSS uniquement, il n'y a aucun moyen d'afficher la puce de l'outil, il est donc nécessaire de concevoir pour transmettre le contenu de l'erreur.

Si vous souhaitez repenser les icônes et les puces d'outils

Il existe un moyen de changer la conception des icônes et des puces d'outils en héritant de GraphicValidationDecoration et en remplaçant la méthode correspondante.

GraphicValidationDecoration:: La description
createErrorNode Icône d'erreur
createWarningNode Icône d'avertissement
createRequireDecorations Icône obligatoire
createTooltip Info-bulle

Je pense qu'il serait plus facile de réécrire une partie de celui-ci en référence à la source originale. GraphicValidationDecoration (ControlsFX): API Document bitbucket: GraphicValidationDecoration

Code pour définir la classe héritée


support.setValidationDecorator(new YourGraphicValidationDecoration());

Précautions lors de la validation des contrôles personnalisés

Le validateur ControlsFX ne sait pas quelle propriété du contrôle personnalisé que vous avez créé doit être vérifiée. Si vous souhaitez valider un contrôle qui n'est pas standard JavaFX, vous devez l'enseigner avec le code suivant. Cliquez ici pour une explication officielle

//Lorsque vous souhaitez valider la valeur d'une propriété pour le contrôle YourControl
ValueExtractor.addObservableValueExtractor( 
        c -> c instanceof YourControl, 
        c -> ((YourControl)c).someProperty());

référence

ControlsFX: sample Source: GIT FXML,CSS: GIT

Recommended Posts

Utiliser ControlsFX / Validation
[Rails] Comment utiliser la validation
Utilisez before_action! !!
Utiliser XMLHttpRequest
[Rails] Utiliser la validation sur un contrôleur spécifique
Utiliser AutosizingTextView