仅在提交后使用 ValidationSupport 验证 JavaFX 表单
Validate JavaFX form only after submission using ValidationSupport
我正在尝试使用 ValidationSupport 验证 javafx 表单,验证工作正常,但是当我访问表单时,"errors decorations" 已经显示,甚至在提交表单或聚焦文本字段之前。
ValidationSupport validationSupport = new ValidationSupport();
validationSupport.registerValidator(textField, Validator.createEmptyValidator("Text is required"));
下图显示了处于初始状态的表单示例。
如何强制装饰仅在用户提交表单或更改 TextField 值后显示?
按需验证控件是 ControlsFx 问题跟踪器上的一个问题 (on-demand validation option),该问题跟踪器仍处于打开状态,因此 ControlsFx 尚不支持它。
但是有一种方法可以抑制错误修饰:
ValidationSupport validationSupport = new ValidationSupport();
validationSupport.setErrorDecorationEnabled(false);
稍后,当您真正想要验证时(例如在提交按钮上),您需要将其重置为默认值:
validationSupport.setErrorDecorationEnabled(true);
validationSupport.redecorate();
这样,字段仍然会在每次更改时得到验证,但错误装饰不会显示,直到您真正希望显示它们。
示例:
在此示例中,我们希望仅当数字字段具有焦点时才看到验证错误。
public class Sandbox extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
GridPane pane = new GridPane();
pane.add(new Label("Number field:"), 0 , 0);
TextField numberField = new TextField("");
pane.add(numberField, 1, 0);
TextField textField = new TextField("");
pane.add(new Label("Text field:"), 0, 1);
pane.add(textField, 1, 1);
ValidationSupport vs = new ValidationSupport();
vs.setErrorDecorationEnabled(false); // we don't want errors to bother us for now.
vs.registerValidator(numberField, Validator.createRegexValidator("must be digits only!", "\d*", Severity.ERROR));
// validate and show errors only if number field has the focus
vs.errorDecorationEnabledProperty().bind(numberField.focusedProperty());
primaryStage.setScene(new Scene(pane));
primaryStage.show();
}
public static void main(String[] args) {
Application.launch(Sandbox.class);
}
}
或者如果您只想在第一次单击提交按钮后才看到验证错误:
...
Button button = new Button("Submit");
pane.add(button, 0, 2);
ValidationSupport vs = new ValidationSupport();
vs.setErrorDecorationEnabled(false); // we don't want errors to bother us for now.
vs.registerValidator(numberField, Validator.createRegexValidator("must be digits only!", "\d*", Severity.ERROR));
button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
vs.setErrorDecorationEnabled(true); // validate and show errors now!
}
});
...
您可能想看看 ValidatorFX,它试图克服 ControlsFX 中验证的一些问题。
完全披露:我是 ValidatorFX 的作者。
我正在尝试使用 ValidationSupport 验证 javafx 表单,验证工作正常,但是当我访问表单时,"errors decorations" 已经显示,甚至在提交表单或聚焦文本字段之前。
ValidationSupport validationSupport = new ValidationSupport();
validationSupport.registerValidator(textField, Validator.createEmptyValidator("Text is required"));
下图显示了处于初始状态的表单示例。
如何强制装饰仅在用户提交表单或更改 TextField 值后显示?
按需验证控件是 ControlsFx 问题跟踪器上的一个问题 (on-demand validation option),该问题跟踪器仍处于打开状态,因此 ControlsFx 尚不支持它。
但是有一种方法可以抑制错误修饰:
ValidationSupport validationSupport = new ValidationSupport();
validationSupport.setErrorDecorationEnabled(false);
稍后,当您真正想要验证时(例如在提交按钮上),您需要将其重置为默认值:
validationSupport.setErrorDecorationEnabled(true);
validationSupport.redecorate();
这样,字段仍然会在每次更改时得到验证,但错误装饰不会显示,直到您真正希望显示它们。
示例:
在此示例中,我们希望仅当数字字段具有焦点时才看到验证错误。
public class Sandbox extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
GridPane pane = new GridPane();
pane.add(new Label("Number field:"), 0 , 0);
TextField numberField = new TextField("");
pane.add(numberField, 1, 0);
TextField textField = new TextField("");
pane.add(new Label("Text field:"), 0, 1);
pane.add(textField, 1, 1);
ValidationSupport vs = new ValidationSupport();
vs.setErrorDecorationEnabled(false); // we don't want errors to bother us for now.
vs.registerValidator(numberField, Validator.createRegexValidator("must be digits only!", "\d*", Severity.ERROR));
// validate and show errors only if number field has the focus
vs.errorDecorationEnabledProperty().bind(numberField.focusedProperty());
primaryStage.setScene(new Scene(pane));
primaryStage.show();
}
public static void main(String[] args) {
Application.launch(Sandbox.class);
}
}
或者如果您只想在第一次单击提交按钮后才看到验证错误:
...
Button button = new Button("Submit");
pane.add(button, 0, 2);
ValidationSupport vs = new ValidationSupport();
vs.setErrorDecorationEnabled(false); // we don't want errors to bother us for now.
vs.registerValidator(numberField, Validator.createRegexValidator("must be digits only!", "\d*", Severity.ERROR));
button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
vs.setErrorDecorationEnabled(true); // validate and show errors now!
}
});
...
您可能想看看 ValidatorFX,它试图克服 ControlsFX 中验证的一些问题。 完全披露:我是 ValidatorFX 的作者。