验证是核心javafx框架所缺少的一件事。 为了填补这一空白, controlsfx中已经存在一个第三方验证库 。 但是,我有一个问题:它不是在考虑FXML的情况下创建的。 这并不是说它不是一个很好的库,只是错过了这个细节,对我来说这是不可行的。 因此,我决定创建自己的验证框架: FXValidation 。
怎么运行的
为了向您展示FXValidation的工作原理,让我们从头开始,向您展示一个使用该库时FXML文件的外观示例。 这是一个登录屏幕的简单示例,其中用户需要输入用户名和密码:
<Label><text>User Name:</text>
</Label>
<TextField fx:id="userName" id="userName"></TextField>
<Label><text>Password:</text>
</Label>
<PasswordField fx:id="password" id="password"></PasswordField><Button text="Submit" onAction="#submitPressed"></Button><fx:define><RequiredField fx:id="requiredField1" ><srcControl><fx:reference source="userName"></fx:reference></srcControl></RequiredField><RequiredField fx:id="requiredField2" ><srcControl><fx:reference source="password"></fx:reference></srcControl></RequiredField>
</fx:define><ErrorLabel message="Please enter your username"><validator><fx:reference source="requiredField1"></fx:reference></validator>
</ErrorLabel>
<ErrorLabel message="Please enter your password"><validator><fx:reference source="requiredField2"></fx:reference></validator>
</ErrorLabel>
在FXML代码段的开头,我定义了用于输入登录详细信息的文本字段和密码字段。 除此之外,还有一个提交按钮,以便用户可以将登录信息发送到系统。 之后是有趣的部分。 首先,我们定义几个RequiredField类型的验证器。 该验证器检查所输入的内容是否为空,如果是,则在标志中存储验证是否有错误。 FXValidation框架中还内置了其他类型的验证器,但我们将稍作介绍 。 最后,我们定义了几个ErrorLabel。 这是实现IValidationDisplay的节点,实现此接口的任何类都是一个类,其目的是在验证过程中发生错误时向用户显示信息。 当前,框架中只有此类之一:ErrorLabel。 最后,我们需要在用户单击“提交”按钮时调用验证,这是在控制器中的Submit方法上完成的:
public void submitPressed(ActionEvent actionEvent) {requiredField1.eval();requiredField2.eval();
}
这将触发对我们定义的验证器的验证。 如果有错误,ErrorLabels将显示在其中定义的错误消息。 验证器还有另外一件事:验证器生效后,它们将css样式类“ error”添加到每个有错误的控件中。 这使程序员只要在控件上附加了错误类,就可以使用css改变控件的样式。 程序员可以通过检查验证器中的hasErrors属性来检查验证过程中的错误。
这是我们的示例:
细节
从上面显示的内容可以看出,基本上涉及两种类型的类:
- 验证器:负责检查目标控件( srcControl )是否符合验证规则。 如果没有,它将“错误”样式类附加到目标控件,将其hasErrors属性设置为true。 所有验证器都从ValidatorBase扩展。
- 错误显示信息:负责通知用户验证发生了什么问题,可能是必填字段,字段内容没有必要的字符数,等等。所有这些类都实现IValidationDisplay 。
在库中,当前有3个验证器,并且只有一个错误“显示器”即ErrorLabel。 验证器如下:
- RequiredField:检查目标控件( srcControl )是否具有内容,如果没有,则给出错误。
- CardinalityValidator:检查目标控件( srcControl )是否至少具有最小字符数和最大最大字符数。
- RegexValidator:根据给定的正则表达式检查目标控件( srcControl )的内容
就是这样。
翻译自: https://www.javacodegeeks.com/2014/08/validation-in-java-javafx.html