ControlsFX 复杂验证
ControlsFX complex validation
我需要使用密码和密码确认来验证简单的 JavaFX 表单。
validationSupport.registerValidator(passwordInput,
Validator.createEmptyValidator("Password required!"));
validationSupport.registerValidator(confirmPasswordInput,
new EqualsToValidator(passwordInput.textProperty(),
"Password differs from confirmation"));
在 EqualsToValidator 中,我只是比较传递给验证器的 property.getValue()
和 value
。
如果我更改 仅 密码 EqualsToValidator
是 not 因为它正在监听 confirmPasswordInput
而不是 passwordInput
.
我只找到丑陋的解决方案:
passwordInput.textProperty().addListener((observable, oldValue, newValue) -> {
String oldText = confirmPasswordInput.getText();
confirmPasswordInput.setText(null);
confirmPasswordInput.setText(oldText);
});
如何在另一个字段更改时使一个字段失效?
Validator.java - 验证器的基础 class。
文本Validator.java 和密码Validator.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"));
这对我有用。我只是复制了 ValidationSupport class 并添加了以下代码。
@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<>());
我需要使用密码和密码确认来验证简单的 JavaFX 表单。
validationSupport.registerValidator(passwordInput,
Validator.createEmptyValidator("Password required!"));
validationSupport.registerValidator(confirmPasswordInput,
new EqualsToValidator(passwordInput.textProperty(),
"Password differs from confirmation"));
在 EqualsToValidator 中,我只是比较传递给验证器的 property.getValue()
和 value
。
如果我更改 仅 密码 EqualsToValidator
是 not 因为它正在监听 confirmPasswordInput
而不是 passwordInput
.
我只找到丑陋的解决方案:
passwordInput.textProperty().addListener((observable, oldValue, newValue) -> {
String oldText = confirmPasswordInput.getText();
confirmPasswordInput.setText(null);
confirmPasswordInput.setText(oldText);
});
如何在另一个字段更改时使一个字段失效?
Validator.java - 验证器的基础 class。
文本Validator.java 和密码Validator.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"));
这对我有用。我只是复制了 ValidationSupport class 并添加了以下代码。
@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<>());