Example:
We have a dialog to create a new user with these fields:
[*]User name (TextField)
[*]Password (PasswordField)
[*]Repeat password (PasswordField)
< /ul>
Wir registrieren Validatoren wie folgt: < /p>
Code: Select all
@Component
public class ValidationHelper {
public void registerUserRegistrationValidations(ValidationSupport validationSupport, TextField userName,
PasswordField password, PasswordField repeatPassword) {
registerFocusLostValidation(userName, getEnteredUserNameDataLengthValidator(), validationSupport);
registerFocusLostValidation(password, getEnteredPasswdDataLengthValidator(), validationSupport);
registerFocusLostValidation(repeatPassword, getEnteredPasswdDataLengthValidator(), validationSupport);
registerFocusLostValidation(repeatPassword, getEnteredPasswordsEqualValidator(repeatPassword), validationSupport);
}
private Validator getEnteredUserNameDataLengthValidator() {
return Validator.createPredicateValidator(
userName -> userName != null && ((String) userName).length() > 2,
"user name too short");
}
private Validator getEnteredPasswdDataLengthValidator() {
return Validator.createPredicateValidator(
pin -> pin != null && ((String) pin).length() > 2,
"Password too short");
}
private Validator getEnteredPasswordsEqualValidator(PasswordField passwdField) {
return Validator.createPredicateValidator(
password -> password != null && password.equals(passwdField.getText()),
"Passwords do not match");
}
private void registerFocusLostValidation(Control control, Validator validator, ValidationSupport validationSupport) {
validationSupport.registerValidator(control, false, validator);
}
}
< /code>
Wir tun dies auch, um ein globales Flag zu binden: < /p>
BooleanBinding isInvalid = Bindings.createBooleanBinding(
() -> !validationSupport.getValidationResult().getErrors().isEmpty(),
validationSupport.validationResultProperty()
);
validationState.formInvalidProperty().bind(isInvalid);
< /code>
Dann im Fußzeilencontroller: < /p>
okButton.disableProperty().bind(validationState.formInvalidProperty());
< /code>
[b] Das [url=viewtopic.php?t=20324]Problem[/url] < /strong> < /p>
Dies funktioniert hauptsächlich, aber erst nachdem der Benutzer mit dem Eingeben beginnt. Passwort) < /li>
Die Validierung für Wiederholungskennwort wird erst nach dem Fokusverlust ausgelöst. /> Wir haben versucht, erforderlich zu werden Start?package controlsFx;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.ConfigurableApplicationContext;
import java.io.IOException;
import java.net.URL;
@SpringBootApplication
public class ControlsFxApp extends Application {
private static final String RESOURCE = "sample.fxml";
private ConfigurableApplicationContext springContext;
@Override
public void init() {
springContext = new SpringApplicationBuilder(ControlsFxApp.class).run();
}
@Override
public void start(Stage primaryStage) throws Exception {
Parent root = load(RESOURCE);
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.show();
}
public Parent load(String fxmlPath) throws IOException {
URL location = getClass().getResource(fxmlPath);
FXMLLoader fxmlLoader = new FXMLLoader(location);
fxmlLoader.setControllerFactory(springContext::getBean);
return fxmlLoader.load();
}
}
Code: Select all
package controlsFx;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import org.springframework.stereotype.Controller;
@Controller
public class FooterController {
private final ValidationState validationState;
public Button register;
public FooterController(ValidationState validationState) {
this.validationState = validationState;
}
@FXML
private void initialize() {
register.setOnAction(event -> {
System.out.println("Validation requested for the current step...");
});
register.disableProperty().bind(validationState.formInvalidProperty());
}
}
Code: Select all
package controlsFx;
import javafx.application.Platform;
import javafx.beans.binding.Bindings;
import javafx.beans.binding.BooleanBinding;
import javafx.fxml.FXML;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import org.controlsfx.validation.ValidationSupport;
import org.controlsfx.validation.decoration.GraphicValidationDecoration;
import org.springframework.stereotype.Controller;
@Controller
public class RegistrationController {
private final ValidationHelper validationHelper;
private final ValidationSupport validationSupport = new ValidationSupport();
private final ValidationState validationState;
public TextField userName;
public PasswordField password;
public PasswordField repeatPassword;
public RegistrationController(ValidationHelper validationHelper, ValidationState validationState) {
this.validationHelper = validationHelper;
this.validationState = validationState;
}
@FXML
public void initialize() {
validationSupport.setValidationDecorator(new GraphicValidationDecoration());
validationHelper.registerUserRegistrationValidations(validationSupport, userName, password, repeatPassword);
Platform.runLater(() -> {
validationSupport.revalidate();
BooleanBinding isInvalid = Bindings.createBooleanBinding(
() -> !validationSupport.getValidationResult().getErrors().isEmpty(),
validationSupport.validationResultProperty()
);
validationState.formInvalidProperty().bind(isInvalid);
});
}
}
Code: Select all
package controlsFx;
import javafx.scene.control.Control;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import org.controlsfx.validation.ValidationSupport;
import org.controlsfx.validation.Validator;
import org.springframework.stereotype.Component;
@Component
public class ValidationHelper {
public void registerUserRegistrationValidations(ValidationSupport validationSupport, TextField userName,
PasswordField password, PasswordField repeatPassword) {
registerFocusLostValidation(userName, getEnteredUserNameDataLengthValidator(), validationSupport);
registerFocusLostValidation(password, getEnteredPasswdDataLengthValidator(), validationSupport);
registerFocusLostValidation(repeatPassword, getEnteredPasswdDataLengthValidator(), validationSupport);
registerFocusLostValidation(repeatPassword, getEnteredPasswordsEqualValidator(repeatPassword), validationSupport);
}
private Validator getEnteredUserNameDataLengthValidator() {
return Validator.createPredicateValidator(
userName -> userName != null && ((String) userName).length() > 2,
"user name too short");
}
private Validator getEnteredPasswdDataLengthValidator() {
return Validator.createPredicateValidator(
pin -> pin != null && ((String) pin).length() > 2,
"Password too short");
}
private Validator getEnteredPasswordsEqualValidator(PasswordField passwdField) {
return Validator.createPredicateValidator(
password -> password != null && password.equals(passwdField.getText()),
"Passwords do not match");
}
private void registerFocusLostValidation(Control control, Validator validator, ValidationSupport validationSupport) {
validationSupport.registerValidator(control, false, validator);
}
}
Code: Select all
package controlsFx;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import org.springframework.stereotype.Component;
@Component
public class ValidationState {
private final BooleanProperty formInvalid = new SimpleBooleanProperty(true);
public BooleanProperty formInvalidProperty() {
return formInvalid;
}
}
Code: Select all
User Name:
Password:
Repeat Password:
Code: Select all
Code: Select all
Code: Select all
4.0.0
controlsFx
validationdemo
1.0-SNAPSHOT
UTF-8
17
22
org.openjfx
javafx-controls
${javafx.version}
org.openjfx
javafx-fxml
${javafx.version}
org.controlsfx
controlsfx
11.1.2