我正在开发一个项目,该项目使用 JTable 来显示日期列等。我们需要对用户输入的日期进行验证,因此我实现了格式验证的屏蔽和实际日期验证的解析的组合。我已经使用日期列的自定义单元格编辑器完成了此操作。

在我的 MaskedCellEditor 中,我有一个 JFormattedTextField。我设置了日期屏蔽。然后我添加一个 InputVerifier 以允许实际验证。我的 InputVerifier 实现 verify() 来检查:1.textField.isEditValid() 2.DateValidator.ValidDate()。如果其中一个无效,则 verify 返回 false,并且 InputVerifier 将焦点锁定到文本字段(单元格编辑器),并显示一个小消息对话框,提醒用户日期格式。

错误消息是一个小的、未修饰的、非模态的、不可聚焦的 JDialog,它会在正在编辑的单元格下方弹出。它会在按键或成功的日期验证后消失。除了小边缘情况外,它工作得很好。

如果用户选择应用程序顶部的菜单按钮,同时弹出无效编辑对话框,则会切换屏幕,破坏当前屏幕上的所有内容(包括表格)。但是,由于正在显示对话框并且尚未发生按键/成功编辑,因此该对话框永远不会隐藏。它在不同屏幕上完全不相关的上下文中仍然可见。一旦用户关闭了表格的屏幕,用户就无法摆脱该对话框。

我曾讨论过在对话框本身上放置一个计时器和/或鼠标监听器,这会导致它消失,但我觉得我忽略了实际的问题。该对话框永远不会被处理,我很确定它是因为它仍然设置为可见,并且它阻止垃圾收集器处理它。

我在持有 JTable 的面板上有一个 Cleanup 方法,但我找不到引用对话框(InputVerifier 的一个组件)以摆脱它的好方法。该对话框与表的父面板相距甚远。(面板 -> JTable -> CellEditor -> JFormattedTextField -> InputVerifier -> JDialog)

关于如何在表被破坏时强制隐藏对话框的任何想法?如果您需要更多详细信息,请告诉我。我试图不让你们陷入细节的泥潭,但确实发生了很多事情。

有帮助吗?

解决方案

首先想到的是,你能不能不要采用倾听者的方法。如果您有一个 closeErrorDialog() 类型的方法,该方法在成功验证时被调用,那么您也可以在选择菜单操作时调用它。

作为替代方案,也许您可​​以以某种方式控制从菜单到菜单的转换,并创建一个“清理”方法来关闭任何现有的错误对话框。这将允许更改菜单时需要执行的任何其他操作在同一位置发生。

只是我脑海中的一些快速想法。希望它们符合您的意思

其他提示

很多人会因为这样说而投票给我,但听起来你的对话应该是模态的,这样用户就不能在不先解除它的情况下切换它。或者至少禁用允许人们在显示此对话框时切换的菜单。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top