2015-10-28 96 views
2

我需要使用密碼和密碼確認來驗證簡單的JavaFX表單。ControlsFX複雜驗證

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

在EqualsToValidator我簡單地比較property.getValue()value傳遞給驗證。

如果我改變密碼EqualsToValidator調用,因爲它是聽confirmPasswordInputpasswordInput

我只發現了醜陋的解決方案:

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

如何一個字段時,另一個領域的變化無效?

+0

好吧,看起來驗證不是那麼複雜。我寫了我自己的簡單驗證器。 –

+1

請在評論或回答部分寫下您的解決方案,以便具有相同問題的人員可以獲得解決方案。 – Maxoudela

+0

您是否找到了使用ValidationSupport的方法? – dinhokz

回答

1

My implementation

Validator.java - 用於驗證基類。

TextValidator.java和PasswordValidator.java - 實現。

ValidationSupport.java跟蹤所有驗證器。

用法:

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

這爲我工作。我只是複製了ValidationSupport類並添加了以下代碼。

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

您還需要更改控件設置爲一個映射,以保持驗證器。

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