2

我正在设计一个用于管理有关 NonPlayerCharacter 实体的信息的 Swing 窗口。该设计旨在易于扩展。编辑器表单的主体包含在选项卡式窗格中,以便将来的扩展模块可以添加选项卡来扩展编辑器。

选项卡式窗格可以由实现NPCEditorTab接口的选项卡填充。“保存”过程的一部分涉及一个循环,该循环verifyFields()在每个选项卡上调用该方法,确保所有字段都正确完成(我应该遵守约定,我应该将其重命名为validateFields())。如果所有选项卡的验证成功,则另一个循环调用saveNPC()每个选项卡的方法,指示它们将数据写入 NPC 对象。

我的问题是:跟踪每个选项卡的验证的最佳方法是什么,以便可以向用户报告验证失败的原因?

我有两个选择:

1)让方法抛出一个ValidationException.

ValidationException将包含有关源选项卡以及哪些表单字段不完整以及原因的信息,从而允许编辑器将其作为单个消息报告给用户。我可能会收集集合中发生的异常,并在一次报告所有选项卡的结果之前完成所有验证(以防止用户从选项卡 2 收到错误,修复它,然后哦,你也有选项卡 4 中的错误等)。

在此处和其他地方阅读有关使用异常进行流控制的建议是不好的设计,这就是为什么我不愿使用此选项的原因。

2)让方法返回一个ValidationResult对象。

这些ValidationResult对象将在每次迭代后添加到集合中并进行检查。它们将包含一个布尔标志 ( isValidated())、一个标识源选项卡的源字符串,以及一个描述验证失败原因的字符串列表。

在任何一种情况下,验证结果都将在单个对话中报告给用户。

我个人认为第一个选项没有问题,至于我(一个自学成才的 Java 爱好者)它似乎对性能影响最小(一个对象仅在发生故障时生成,而不是每次都没有与第二个选项一样)

我没有开发自定义 API 的经验(我有点喜欢摸索自己的方式并找到自己解决问题的方法),但我正在尝试将这个程序设计为可扩展的,以便我以后可以轻松地添加功能而无需大量对现有代码的修改(我在这个项目的第一次迭代中遇到了这个问题,每个新功能都使基本代码变得越来越复杂,直到它变得无法管理)。

这就是我以这种方式处理表单验证的原因,我只是对在各个选项卡中包含验证报告持谨慎态度,因为我不希望用户收到每个单独选项卡的唯一通知。但是,如果您认为最好的方法是这样做(即,当Tab的验证失败时,它会通过通过验证检查来通知用户本身JOptionPane,然后返回false以终止验证检查),请告诉我。

附录

根据外部建议,我决定放弃整个多选项卡验证方案,而是通过捕获失去焦点事件并强制用户在输入无效输入后立即更正无效输入来验证单个表单元素。

4

1 回答 1

1

我更喜欢 2) 选项。例如,您可以看到 SpringMVC 验证逻辑。

表单的每个字段都可以用必要的验证进行注释,例如@Email、@NotEmpty 等。验证时有一组错误(如果所有字段都有效,则可能为空)。然后可以以某种方式用特定于该字段的错误消息标记每个字段(如果有效,则为空)。

检查时可能会显示有关错误的消息。在关闭消息时,最好将(例如设置焦点)指向第一个无效控件。

于 2013-11-15T05:45:03.650 回答