ControlSFX Validations Support: Validierungsfehler auf dem Laden anzeigen und die OK -Taste deaktiviert halten, bis die Java

Java-Forum
Anonymous
 ControlSFX Validations Support: Validierungsfehler auf dem Laden anzeigen und die OK -Taste deaktiviert halten, bis die

Post by Anonymous »

Ich arbeite an einer JavaFx + Spring -Boot -Anwendung mit dem MVVM -Muster. Wir verwenden ControlSFX -Validierungen, um Felder in einem Anmeldeformular zu validieren. />

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();
}
}
foterController.java[/b]

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());
}
}
registrationController.java

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);
});
}
}
ValidationHelper.java

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);
}
}
validationState.java

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;
}
}
Center.fxml

Code: Select all






User Name:

Password:

Repeat Password:



foter.xml

Code: Select all







Sample.fxml

Code: Select all



























pom.xml

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



Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post