我正在设计一个 Swing 窗口来管理有关 NonPlayerCharacter 实体的信息。该设计旨在易于扩展。编辑器表单的主体包含在一个选项卡式 Pane 中,以便将来的扩展模块可以添加选项卡来扩展编辑器。
选项卡式 Pane 可以由实现 NPCEditorTab
接口(interface)的选项卡填充。 “保存”过程的一部分涉及一个循环,循环遍历选项卡,在每个选项卡上调用 verifyFields()
方法,确保所有字段都正确完成(我应该遵守惯例,我应该将其重命名为验证字段 ()
)。如果所有选项卡的验证都成功,另一个循环会为每个选项卡调用 saveNPC()
方法,指示它们将数据写入 NPC 对象。
我的问题是:跟踪每个选项卡验证的最佳方法是什么,以便可以向用户报告验证失败的原因?
我有两个选择:
1) 让方法抛出 ValidationException
。
此 ValidationException
将包含有关源选项卡的信息以及哪些表单字段不完整以及原因,允许编辑器将此作为一条消息报告给用户。我可能会收集异常,因为它们出现在一个集合中,并在一次报告所有选项卡的结果之前完成所有验证(以防止用户从选项卡 2 收到错误,修复它,然后哦,你还有选项卡 4 等中的错误)。
在这里和其他地方阅读有关使用异常进行流量控制的建议是糟糕的设计,这就是我犹豫是否使用此选项的原因。
2) 让方法返回一个 ValidationResult
对象。
这些 ValidationResult
对象将在每次迭代后添加到集合中并进行检查。它们将包含一个 boolean 标志 (isValidated()
)、一个标识源选项卡的源字符串,以及一个描述验证失败原因的字符串列表。
在任何一种情况下,验证结果都会在一个对话中报告给用户。
我个人认为第一个选项没有问题,对于我(一个自学成才的 Java 爱好者)来说,它似乎对性能影响最小(一个对象只在失败的情况下生成,而不是无论什么时候都与第二个选项一样)。
我没有开发自定义 API 的经验(我有点喜欢摸索前行并找到自己解决问题的方法),但我正在尝试将此程序设计为可扩展的,以便我可以轻松添加功能后来没有对现有代码进行大量修改(我在这个项目的第一次迭代中遇到了这个问题,每个新功能都使基本代码变得越来越复杂,直到变得难以管理)。
这就是我以这种方式处理表单验证的原因,我只是对在单个选项卡中包含验证报告持谨慎态度,因为我不希望用户收到每个单独选项卡的唯一通知。 However, if you think the best method is to do just that (IE when a tab's validation fails, it notifies the user itself via JOptionPane
and then returns false
which terminates the validation检查),让我知道。
附录
根据外部建议,我决定放弃整个多选项卡验证方案,而是通过捕获失去焦点事件并强制用户在输入后立即更正无效输入来验证单个表单元素。
最佳答案
我更喜欢 2) 选项。您可以查看例如 SpringMVC 验证逻辑。
表单的每个字段都可以用必要的验证进行注释,例如@Email、@NotEmpty 等。 验证时有一组错误(如果所有字段都有效,则可能为空)。然后每个字段都可以用特定于该字段的错误消息以某种方式标记(如果有效则为空)。
检查时可能会出现有关错误的消息。在关闭时,消息最好指向(例如设置焦点)第一个无效控件。
关于java - 为了在 Swing 中执行多对象验证,应该通过异常或返回 Result 对象来报告验证失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19993157/