2009-01-05 273 views
2

我正在使用JTable來顯示一個項目,其中包括一列日期。我們需要驗證日期的用戶輸入,所以我實現了用於格式驗證的掩碼和用於實際日期驗證的解析的組合。我已經使用日期列的自定義CellEditor完成了此操作。錯誤對話框沒有被銷燬

在我的MaskedCellEditor中,我有一個JFormattedTextField。我爲日期設置了遮罩。然後我添加一個InputVerifier以允許實際驗證。我的InputVerifier實現了verify()來檢查:1. textField.isEditValid()2. DateValidator.ValidDate()。如果其中任一個無效,則驗證返回false,並且InputVerifier將焦點鎖定到文本字段(單元格編輯器)中,並顯示一個小消息對話框,提醒用戶日期格式。

該錯誤消息是一個小的,未修飾的,非模態的,非可聚焦的JDialog該細胞正在編輯下方彈出。它在按鍵或成功的日期驗證中消失。除了小邊緣的情況外,它的效果很好。

如果用戶選擇的應用程序的頂部菜單按鈕,而無效的編輯,彈出的對話框中,切換屏幕時,屏幕上當前毀滅一切(包括表)。但是,由於正在顯示對話框並且沒有發生按鍵/成功編輯,對話框永遠不會被隱藏。它在不同屏幕上的完全不相關的情況下仍然可見。一旦用戶關閉了桌子的屏幕,用戶就無法擺脫對話。

我一直在爭論扔無論是定時器和/或對話框本身會導致它消失在MouseListener的,但我覺得我忽略了實際問題。該對話框永遠不會被丟棄,我非常肯定它的存在,因爲它仍然被設置爲可見的,並且阻止垃圾收集器擺脫它。

我有面板上的清理方法持有JTable,但我找不到一個很好的方法來引用對話框(InputVerifier的一個組件),以擺脫它。該對話框與表格的父面板相差甚遠。 (面板 - > JTable - > CellEditor - > JFormattedTextField - > InputVerifier - > JDialog)

關於如何強制對話框在表被銷燬時隱藏任何想法?如果你需要更多的細節,請告訴我。我試圖不讓你們陷入細節,但還有很多事情要做。

回答

1

作爲第一個想法,你能不聽從聽衆的方法。如果您有一個closeErrorDialog()類型的方法在成功的閾值時被調用,那麼您也可以在選擇菜單操作時調用它。

作爲替代方案,也許你可以控制從菜單到菜單以某種方式的轉變,並創建一個「清理」方法,這將關閉任何exisiting錯誤對話框。這將允許在更改菜單時發生的任何其他操作發生在同一地點。

只是我的頭頂幾個快速的想法。希望他們沿着你的意思線

0

很多人會投我失望這麼說,但它聽起來像是你的對話框應該是有模式,使用戶無法切換遠離它沒有先貶。或者至少禁用允許用戶在顯示該對話框時切換的菜單。

+1

它不是一種模式類型的對話框。它不會彈出並阻止使用。它更像是一個向用戶顯示正確格式的工具提示。它在編輯單元下方彈出。它是未修飾的(沒有最小化,最大化,關閉按鈕)和不可聚焦(如果用戶點擊它,沒有任何反應)。 – Saterus 2009-01-05 21:16:14