Question

Je travaille sur un projet qui utilise une JTable pour afficher, entre autres choses, une colonne de dates. Nous avions besoin d'une validation pour l'entrée utilisateur pour les dates. J'ai donc mis en œuvre une combinaison de masquage pour la validation de format et d'analyse pour la validation de date réelle. J'ai fait cela en utilisant un CellEditor personnalisé pour la colonne de date.

Dans mon éditeur MaskedCellEditor, j’ai un JFormattedTextField. Je configure le masquage pour les dates. Ensuite, j'ajoute un InputVerifier pour permettre la validation réelle. Mon InputVerifier implémente verify () pour vérifier: 1. textField.isEditValid () 2. DateValidator.ValidDate (). Si l'une ou l'autre est invalide, verify renvoie false et InputVerifier verrouille le focus dans le champ de texte (l'éditeur de cellule) et un petit message s'affiche pour rappeler à l'utilisateur le format de date.

Le message d'erreur est un petit JDialog non modal, non décorable, non décoré, qui apparaît sous la cellule en cours de modification. Il disparaît lors d'une pression sur une touche ou d'une vérification de date réussie. Cela fonctionne très bien, sauf pour un petit boîtier.

Si l'utilisateur sélectionne un bouton de menu en haut de l'application alors qu'une modification non valide est apparue dans la boîte de dialogue, il bascule les écrans et détruit tout ce qui est présentement à l'écran (y compris le tableau). Cependant, étant donné que la boîte de dialogue est affichée et qu’une touche n’a pas été enfoncée / que l’édition n’a pas eu lieu, elle n’est jamais masquée. Il reste visible dans un contexte totalement indépendant sur un écran différent. Une fois que l'utilisateur a désactivé l'écran avec la table, il ne peut plus se débarrasser du dialogue.

J'ai envisagé de placer sur le dialogue lui-même un minuteur et / ou un MouseListener qui le ferait disparaître, mais j’ai l’impression d’ignorer le problème. La boîte de dialogue n’est jamais supprimée et je suis pratiquement certaine qu’elle reste car elle est toujours configurée pour être visible et empêche le ramasse-miettes de s’en débarrasser.

J'ai une méthode de nettoyage sur le panneau contenant la table JTable, mais je ne trouve pas un bon moyen de référencer la boîte de dialogue (un composant de InputVerifier) ??afin de la supprimer. Le dialogue est assez éloigné du panneau parent de la table. (Panneau - > JTable - > CellEditor - > JFormattedTextField - > InputVerifier - > JDialog)

Des idées sur la façon de forcer le dialogue à être masqué lorsque la table est détruite? Si vous avez besoin de plus de détails, faites le moi savoir. J'essaie de ne pas vous enliser dans les détails, mais il se passe beaucoup de choses.

Était-ce utile?

La solution

En guise de première pensée, ne pouvez-vous pas adopter l'approche de l'auditeur? Si vous disposez d'une méthode de type closeErrorDialog () qui est appelée lorsque la validation est réussie, vous pouvez également l'appeler lorsqu'une action de menu est sélectionnée.

Comme alternative, vous pourriez peut-être contrôler la transition d'un menu à l'autre et créer un "nettoyage". méthode qui fermera les dialogues d’erreur existants. Cela permettrait que toute autre action nécessaire lors du changement de menu soit exécutée au même endroit.

Juste quelques idées rapides sur le dessus de ma tête. J'espère qu'ils vont dans le sens de ce que vous vouliez dire

Autres conseils

Beaucoup de gens me critiqueront pour avoir dit cela, mais il semble que votre dialogue devrait être modal afin que les utilisateurs ne puissent pas le quitter sans le rejeter au préalable. Ou au moins désactivez les menus permettant aux utilisateurs de changer de session lorsque cette boîte de dialogue est affichée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top