Frage

ich an einem Projekt arbeite, die eine JTable angezeigt werden verwendet, unter anderem einer Säule von Terminen. Wir mussten die Validierung für die Benutzereingabe für Daten, so habe ich eine Kombination von Maskierung für Formatvalidierung implementiert und für aktuelle Datum Validierung Parsen. Ich habe dies getan, eine benutzerdefinierte CellEditor für das Datum Spalt.

In meinem MaskedCellEditor habe ich eine JFormattedTextField. Ich Setup für Daten der Maskierung. Dann füge ich einen InputVerifier für tatsächliche Validierung zu ermöglichen. Meine InputVerifier Geräte überprüfen () zu überprüfen: 1. textField.isEditValid () 2. DateValidator.ValidDate (). Wenn entweder ungültig ist, überprüfen false zurückgibt und die InputVerifier sperrt den Fokus in das Textfeld (die Zelle Editor) und einem kleinen Nachrichtendialog angezeigt wird, um den Benutzer des Datumsformat erinnert.

Die Fehlermeldung ist ein kleiner, undecorated, nicht-modal, nicht-fokussierbaren JDialog, die unterhalb der Zelle bearbeitet erscheint. Er verschwindet auf einem Tastendruck oder eine erfolgreiche Datum Überprüfung. Es funktioniert großartig bis auf einen kleinen Rand Fall.

Wenn der Benutzer ein Menü-Taste auf der Oberseite der Anwendung auswählt, während eine ungültige bearbeiten den Dialog aufgetaucht ist, schaltet es Bildschirme, alles zur Zeit auf dem Bildschirm zu zerstören (einschließlich der Tabelle). Da jedoch der Dialog wird angezeigt und ein keypress / erfolgreich bearbeiten nicht aufgetreten ist, wird der Dialog nie versteckt. Es bleibt sichtbar in einem völlig anderen Kontext auf einem anderen Bildschirm. Sobald der Benutzer aus dem Bildschirm mit dem Tisch gewechselt hat, gibt es keine Möglichkeit für den Benutzer des Dialogs zu entfernen.

Ich habe zu werfen diskutiert entweder einen Timer und / oder einen Mouselistener auf dem Dialog selbst, die es verursachen würde verschwinden, aber ich fühle, dass ich das eigentliche Problem bin ignorieren. Der Dialog wird nie angeordnet ist, und ich bin mir ziemlich sicher sein, weil es immer noch sichtbar sein gesetzt ist, und es wird die Garbage Collector zu verhindern, dass es loszuwerden.

Ich habe eine Cleanup-Methode auf dem Panel die JTable zu halten, aber ich kann nicht eine gute Art und Weise zu referenzieren den Dialog (eine Komponente des InputVerifier), um loszuwerden, es finden. Der Dialog ist ziemlich weit von der Mutterplatte der Tabelle entfernt. (Panel -> JTable -> CellEditor -> JFormattedTextField -> InputVerifier -> JDialog)

Alle Ideen, wie der Dialog zu zwingen, ausgeblendet werden, wenn der Tisch zerstört wird? Wenn Sie weitere Informationen benötigen, lassen Sie es mich wissen. Ich versuche nicht zu euch kommen in den Details verzetteln, aber es gibt eine Menge los.

War es hilfreich?

Lösung

Als erster Gedanke, können Sie nicht den Hörer Ansatz nach unten gehen. Wenn Sie eine closeErrorDialog () Art Methode, die, wenn nach erfolgreicher valdiation aufgerufen wird, dann können Sie es auch nennen, wenn ein Menü Aktion ausgewählt wird.

Als Alternative könnten Sie vielleicht den Übergang von Menü zu Menü in irgendeiner Art und Weise steuern, und create-Methode einer „Bereinigung“, die alle vorhandenen Fehlerdialoge schließen nach unten. Dies würde für alle anderen Aktionen ermöglichen, die stattfinden müssen, wenn Menüs zu ändern, an der gleichen Stelle passieren.

Nur ein paar schnelle Ideen der Spitze von meinem Kopf. Hoffe, dass sie entlang der Linien sind, was Sie gemeint

Andere Tipps

Viele Menschen werden mir sagen, diese überstimmen, aber es klingt wie Ihr Dialog modal sein sollte, so dass Benutzer nicht davon schalten weg, ohne es zunächst zu entlassen. Oder zumindest die Menüs deaktivieren, die Menschen erlauben weg zu schalten, während das Dialogfeld angezeigt wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top