2

我正在开发一个项目,该项目使用 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)

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

4

2 回答 2

1

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

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

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

于 2009-01-06T13:15:02.067 回答
0

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

于 2009-01-05T20:33:13.027 回答