Я работаю над приложением Javafx + Spring Boot, используя шаблон MVVM. Мы используем ValidationsFx ValidationsUpport для проверки полей в форме входа в систему. Пропустите < /p>
< /li>
< /ul>
Пример: < /p>
У нас есть диалог для создания нового пользователя с этими полями: < /p>
Имя пользователя (Textfield) < /li>
Пароль (пароль) < /> (Passwordfield) < /li>
< /ul>
Мы регистрируем валидаторы, например: < /p>
@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>
Мы также делаем это, чтобы связать глобальный флаг: < /p>
BooleanBinding isInvalid = Bindings.createBooleanBinding(
() -> !validationSupport.getValidationResult().getErrors().isEmpty(),
validationSupport.validationResultProperty()
);
validationState.formInvalidProperty().bind(isInvalid);
< /code>
Затем в контроллере нижнего колонтитула: < /p>
okButton.disableProperty().bind(validationState.formInvalidProperty());
< /code>
проблема < /strong> < /p>
Это в основном работает, но только после того, как пользователь начинает печатать. Пароль) < /li>
Проверка для повторного пароля запускается только после потери фокуса < /li>
< /ul>
Мы хотим, чтобы проверка появилась, как только отображается форма, без взаимодействия пользователей. /> Мы попытались настройки обязательно = true в registervalidator < /li>
Мы также попытались вызвать проверку upport.getValidationResult (). geterRors () вручную
, но начальное состояние всегда рассматривается как «достоверное». Начать? PrettyPrint-Override ">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();
}
}
footercontroller.java
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
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
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
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>
User Name:
Password:
Repeat Password:
footer.xml>
sample.fxml
pom.xml
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
Подробнее здесь: https://stackoverflow.com/questions/795 ... alid-input
Показать ошибки проверки при загрузке и отключить кнопку OK до действительного ввода ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Клиент не может вызвать RPC-сервер даже при наличии действительного владельца сети.
Anonymous » » в форуме C++ - 0 Ответы
- 9 Просмотры
-
Последнее сообщение Anonymous
-