2015-10-28 1 views
2

Je dois valider un formulaire JavaFX simple avec confirmation de mot de passe et de mot de passe.Validation du complexe ControlsFX

validationSupport.registerValidator(passwordInput, 
        Validator.createEmptyValidator("Password required!")); 
validationSupport.registerValidator(confirmPasswordInput, 
        new EqualsToValidator(passwordInput.textProperty(), 
            "Password differs from confirmation")); 

En EqualsToValidator je compare simplement property.getValue() et value passé à validateur.

Si je change ne mot de passe est EqualsToValidatorpas appelé parce qu'il écoute confirmPasswordInput pas passwordInput.

Je n'ai trouvé la solution laide:

passwordInput.textProperty().addListener((observable, oldValue, newValue) -> { 
    String oldText = confirmPasswordInput.getText(); 
    confirmPasswordInput.setText(null); 
    confirmPasswordInput.setText(oldText); 
}); 

Comment invalider un champ lorsqu'un autre change sur le terrain?

+0

Eh bien, il semble que la validation ne soit pas si complexe. J'ai écrit mon propre validateur simple. –

+1

Veuillez écrire votre solution dans la section des commentaires ou réponses afin que les personnes ayant le même problème aient la solution. – Maxoudela

+0

Avez-vous trouvé un moyen de l'utiliser avec ValidationSupport? – dinhokz

Répondre

1

My implementation

Validator.java - classe de base pour validateur.

TextValidator.java et PasswordValidator.java - implémentations. ValidationSupport.java suit tous les validateurs.

Utilisation:

validationSupport.addValidator(new TextValidator(usernameInput, "Username is required!")); 
validationSupport.addValidator(new TextValidator(passwordInput, "Password is required!")); 
validationSupport.addValidator(new PasswordValidator(passwordInput, confirmPasswordInput, "Password differs from confirmation")); 
0

Cela a fonctionné pour moi. J'ai simplement copié la classe ValidationSupport et ajouté le code suivant.

@SuppressWarnings("unchecked") 
public <T> void reaplyValidator(Control target){ 

    if(!controls.containsKey(target)){ 
     throw new NullPointerException("The given control was not registered"); 
    } 

    ValueExtractor.getObservableValueExtractor(target).map(e -> { 

     ObservableValue<T> observable = (ObservableValue<T>) e.call(target); 
     Validator<T> validator = (Validator<T>) controls.get(target); 

     Platform.runLater(() -> validationResults.put(target, validator.apply(target, observable.getValue()))); 

     dataChanged.set(true); 

     return e; 

    }); 
} 

public void revalidate(){ 
    for(Control c : getRegisteredControls()){ 
     reaplyValidator(c); 
    } 
} 

Vous devez également modifier les paramètres Définir sur une carte afin de conserver le validateur.

private ObservableMap<Control, Validator<?>> controls = FXCollections.observableMap(new HashMap<>());