我正在开发一个项目,该项目使用 JTable 来显示日期列等。我们需要验证用户输入的日期,所以我实现了格式验证的掩码和实际日期验证的解析的组合。我已经使用日期列的自定义 CellEditor 完成了此操作。
在我的 MaskedCellEditor 中,我有一个 JFormattedTextField。我为日期设置了掩蔽。然后我添加一个 InputVerifier 以允许实际验证。我的 InputVerifier 实现 verify() 来检查: 1. textField.isEditValid() 2. DateValidator.ValidDate()。如果任一无效,则验证返回 false 并且 InputVerifier 将焦点锁定在文本字段(单元格编辑器)中,并显示一个小消息对话框,提醒用户注意日期格式。
错误消息是一个小的、未修饰的、非模态的、不可聚焦的 JDialog,它会在正在编辑的单元格下方弹出。它会在按键或成功的日期验证时消失。除了一个小的边缘情况外,它工作得很好。
如果用户在弹出对话框时选择了应用程序顶部的菜单按钮,则会切换屏幕,破坏当前屏幕上的所有内容(包括表格)。但是,由于正在显示对话框并且没有发生按键/成功编辑,因此该对话框永远不会隐藏。它在不同屏幕上的完全不相关的上下文中仍然可见。一旦用户关闭了带有表格的屏幕,用户就无法摆脱对话框。
我曾讨论过在对话框本身上抛出 Timer 和/或 MouseListener 会导致它消失,但我觉得我忽略了实际问题。该对话框永远不会被丢弃,我很确定它是因为它仍然设置为可见并且它阻止垃圾收集器摆脱它。
我在持有 JTable 的面板上有一个 Cleanup 方法,但我找不到一个好方法来引用对话框(InputVerifier 的一个组件)以摆脱它。该对话框与表格的父面板相距甚远。(面板 -> JTable -> CellEditor -> JFormattedTextField -> InputVerifier -> JDialog)
关于如何在表格被销毁时强制隐藏对话框的任何想法?如果您需要更多详细信息,请告诉我。我试图不让你们陷入细节中,但还有很多事情要做。