我正在开发一个使用JTable来显示日期列的项目。我们需要验证日期的用户输入,因此我实现了格式验证的屏蔽和实际日期验证的解析组合。我使用自定义CellEditor为日期列完成了这项工作。
在我的MaskedCellEditor中,我有一个JFormattedTextField。我为日期设置了屏蔽。然后我添加一个InputVerifier以允许实际验证。我的InputVerifier实现了verify()来检查:1。textField.isEditValid()2。DateValidator.ValidDate()。如果其中一个无效,则验证返回false,并且InputVerifier将焦点锁定到文本字段(单元格编辑器),并显示一个小消息对话框,提醒用户注明日期格式。
错误消息是一个小的,未修饰的,非模态的,不可聚焦的JDialog,它在正在编辑的单元格下方弹出。它会在按键或日期验证成功时消失。除了小边缘外,它的效果很好。
如果用户选择了应用程序顶部的菜单按钮,而对话框中弹出了无效编辑,则会切换屏幕,销毁当前屏幕上的所有内容(包括表格)。但是,由于正在显示对话框并且未发生按键/成功编辑,因此永远不会隐藏对话框。它在不同屏幕上的完全不相关的上下文中仍然可见。一旦用户使用表关闭屏幕,用户就无法摆脱对话框。
我已经辩论过在对话框本身上抛出一个Timer和/或一个MouseListener会导致它消失,但我觉得我忽略了实际的问题。该对话框永远不会被丢弃,我很确定它,因为它仍然设置为可见,它阻止了垃圾收集器摆脱它。
我在持有JTable的面板上有一个Cleanup方法,但是我找不到一个很好的方法来引用对话框(InputVerifier的一个组件)来摆脱它。该对话框远离表格的父面板。 (Panel - > JTable - > CellEditor - > JFormattedTextField - > InputVerifier - > JDialog)
关于如何在销毁表时强制隐藏对话框的任何想法?如果您需要更多详细信息,请与我们联系。我试图不让你们陷入细节之中,但是还有很多事情要发生。
答案 0 :(得分:1)
首先想到的是,你能否采取听众的态度。如果你有一个closeErrorDialog()类型的方法,在成功的valdiation时被调用,那么你也可以在选择菜单操作时调用它。
作为替代方案,也许您可以通过某种方式控制从菜单到菜单的转换,并创建一个“清理”方法,该方法将关闭任何现有的错误对话框。这将允许在更改菜单时发生在同一位置时发生的任何其他操作。
只是几个关于我头脑的快速想法。希望他们符合你的意思
答案 1 :(得分:0)
很多人会因为这样说而投票给我,但听起来你的对话应该是模态的,这样用户就不能在不先解除它的情况下切换它。或者至少禁用允许人们在显示此对话框时切换的菜单。