【发布时间】:2015-12-17 09:04:31
【问题描述】:
由于在 JavaFX 中似乎没有用于输入验证的方法,因此我正在考虑如何在我当前的项目中以一种干净的方式进行验证。
这是我的想法:
- 所有验证规则都是正则表达式(如“min-length”、“not-empty”、“only-numbers”等),它们存储在 .properties 文件中
示例:
validationrules_only_numbers="[0-9]+" - 我在 .fxml 文件中使用此验证,方法是为任何应验证的输入定义
<properties>标记 例子:<ChoiceBox><properties rules="%validationrules_only_numbers"/></ChoiceBox> - 在一个抽象/父控制器中,我编写了一个方法,该方法获取当前 AnchorPane 的所有子级并对其进行迭代(假设在用户单击“确定”提交表单后)。所有具有验证规则的子项都将传递给另一个方法,该方法根据输入字段的类型将验证规则应用于输入。
- 所有存在验证错误的控件都会突出显示。
我个人喜欢这个想法的地方:
- 只需将验证规则添加到 .properties 文件即可轻松扩展它们
- 在 .fxml 文件中分配规则
- 所有控制器(扩展抽象/父控制器)不需要执行任何验证任务
我不喜欢/不确定它在现实中是否有效:
- 验证规则都是正则表达式,我不知道这是否适用于所有输入字段(但我不介意编写“hacks”来使其工作,因为我只会做一次父控制器)
- 我必须检查带有 instanceof 的控件,才能为该特定控件正确应用规则,因为并非所有控件都有
getText()方法,并且需要以其他方式验证输入 - 不知道是否有更好的方法将规则放入 .fxml 文件然后使用
<properties>
你的想法是什么?我在这里遗漏了什么重要的东西吗?
我在谷歌上搜索了几天关于这个主题,似乎没有像我们熟悉的网络开发社区那样真正好的解决方案。
【问题讨论】:
-
顺便说一句,您能否提供代码示例或指向此类的链接,以说明如何从
Node获取此<properties>?我似乎找不到任何关于它的文档,而且看起来很有趣! -
@sillyfly 假设你有一个像我上面的例子一样的选择框,然后你可以做
ObservableMap<Object, Object> controlProperties = choiceBox.getProperties();然后String rules = (String) controlProperties.get("rules"); -
谢谢。现在我们只需要将其添加到 Scene Builder:bugs.openjdk.java.net/browse/JDK-8090540
标签: validation javafx