错误对话框没有被销毁

问题描述:

我正在使用JTable来显示一个项目,其中包括一列日期。我们需要验证日期的用户输入,所以我实现了用于格式验证的掩码和用于实际日期验证的解析的组合。我已经使用日期列的自定义CellEditor完成了此操作。错误对话框没有被销毁

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

该错误消息是一个小的,未修饰的,非模态的,非可聚焦的JDialog该细胞正在编辑下方弹出。它在按键或成功的日期验证中消失。除了小边缘的情况外,它的效果很好。

如果用户选择的应用程序的顶部菜单按钮,而无效的编辑,弹出的对话框中,切换屏幕时,屏幕上当前毁灭一切(包括表)。但是,由于正在显示对话框并且没有发生按键/成功编辑,对话框永远不会被隐藏。它在不同屏幕上的完全不相关的情况下仍然可见。一旦用户关闭了桌子的屏幕,用户就无法摆脱对话。

我一直在争论扔无论是定时器和/或对话框本身会导致它消失在MouseListener的,但我觉得我忽略了实际问题。该对话框永远不会被丢弃,我非常肯定它的存在,因为它仍然被设置为可见的,并且阻止垃圾收集器摆脱它。

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

关于如何强制对话框在表被销毁时隐藏任何想法?如果你需要更多的细节,请告诉我。我试图不让你们陷入细节,但还有很多事情要做。

作为第一个想法,你能不听从听众的方法。如果您有一个closeErrorDialog()类型的方法在成功的阈值时被调用,那么您也可以在选择菜单操作时调用它。

作为替代方案,也许你可以控制从菜单到菜单以某种方式的转变,并创建一个“清理”方法,这将关闭任何exisiting错误对话框。这将允许在更改菜单时发生的任何其他操作发生在同一地点。

只是我的头顶几个快速的想法。希望他们沿着你的意思线

很多人会投我失望这么说,但它听起来像是你的对话框应该是有模式,使用户无法切换远离它没有先贬。或者至少禁用允许用户在显示该对话框时切换的菜单。

+1

它不是一种模式类型的对话框。它不会弹出并阻止使用。它更像是一个向用户显示正确格式的工具提示。它在编辑单元下方弹出。它是未修饰的(没有最小化,最大化,关闭按钮)和不可聚焦(如果用户点击它,没有任何反应)。 – Saterus 2009-01-05 21:16:14