J'ai un jdialog modal non décoré que je souhaite SETSIBLE (FALSE) lorsque l'utilisateur clique sur l'extérieur de la boîte de dialogue modale. P>
est-ce possible dans Swing? P>
Qu'est-ce que je fais, c'est apparaître un éditeur personnalisé pour un champ de texte comme un sélecteur de date. Y a-t-il un moyen plus facile de faire ce que je veux? P>
N'oubliez pas que les blocs modaux sur l'appel à la configuration (VRAI), vous ne pouvez donc pas simplement dire «N'utilisez pas de boîte de dialogue modale» p>
Et j'ai essayé des auditeurs de focus sur la boîte de dialogue, ils ne se déclenchent pas lorsque c'est modal. P>
7 Réponses :
Pas vraiment une boîte de dialogue modale, alors si vous cliquez sur autre où la ferme, vous voulez peut-être Cependant, quelque chose comme ce qui suit devrait faire l'affaire (non testée). Remarque, je recommanderais de déplacer le code dans quelque chose de mieux conçu que d'utiliser comme prévu. P> setalwaysontop code>
Je viens de tester cela et il semble que ce type d'auditeur n'obtient pas d'événements de souris de l'extérieur de la boîte de dialogue modale.
Ajoutez probablement un FocusListener et cacher le dialogue quand il perd le focus. Peut être délicat si certains éléments de la boîte de dialogue peuvent avoir la mise au point. Quoi qu'il en soit, expérimenter avec elle. P>
Une boîte de dialogue modale (et des composants d'enfants) peut-elle se concentrer sur autre chose que de passer à une autre application?
Ah, obtenu ce que vous voulez dire, vous vouliez dire au lieu d'une boîte de dialogue modale! Je ne sais pas pourquoi cela a été voté
EDIT: strong> modifié pour utiliser WindowFocusListener au lieu de FocusListener, ainsi que de vérifier les composants descendants sur la mise au point de l'accent pour ne pas cacher si un composant enfant gagne de la mise au point. em> Un moyen simple serait d'ajouter une fenêtre auditeur de la fenêtre sur la boîte de dialogue qui la cache lorsque la mise au point est perdue. Je ne vois pas le besoin de modalité dans ce cas. Par exemple: p>
La perte de concentration devrait s'assurer que le composant qui a gagné n'est pas un composant enfant de la boîte de dialogue, vous devrez donc rechercher la hiérarchie des composants via getparent () code>
@vickirk - Bon point. J'ai changé l'exemple ci-dessus pour vérifier les composants de descendants (sans doute un cas de bord, mais j'ai amélioré l'exemple pour permettre la création d'une fenêtre enfant de la boîte de dialogue). Je l'ai également changé pour utiliser un auditeur de la fenêtre.
Oui, je comprends totalement comment on peut le faire sans boîte de dialogue modale, mais le point de la question était s'il était possible de le faire avec une boîte de dialogue modale. L'avantage principal de l'utilisation d'une boîte de dialogue modale est-il bloqué lorsque SETVISIBLE (VRAI). Mon objectif était de ne pas avoir besoin de restructurer le programme d'utiliser une boîte de dialogue non modale ou d'écrire un utilitaire pour imiter la nature de blocage dans une boîte de dialogue non modale.
Utilisez un windowListener et gérer l'événement WindowDeactivé (). P>
Je viens de tester cela et pour moi, cette approche ne semblait que travailler en cliquant complètement en dehors de l'application Java, mais pas lorsque vous essayez de cliquer sur le cadre principal Java qui a engendré la boîte de dialogue modale.
@Zalumon, je suppose que cette réponse n'était pas très claire. C'était une suggestion de ne pas utiliser de JDialog modal. Lorsque vous utilisez un JDialog modal comme fenêtre contextuelle, vous ne pouvez pas fermer la boîte de dialogue si vous cliquez devant la boîte de dialogue. Il s'agit d'une solution pour vous permettre de fermer une boîte de dialogue code> non modale de code> lorsque vous cliquez sur la zone de la boîte de dialogue, la "boîte de dialogue contextuelle" est donc fermée.
Ce n'est pas une boîte de dialogue modale si vous pouvez cliquer en dehors de celui-ci et "quelque chose" se produit. Toutes les réponses sont correctes, vous devriez créer une boîte de dialogue non modale, puis traiter votre cas d'utilisation via un focuslistener. P>
C'est la réponse la plus proche de "non". C'est tout ce que je demandais. Pas comment je peux y parvenir sans une boîte de dialogue non modale.
Il n'est pas nécessaire d'être une boîte de dialogue modale (moyen modal qu'il vous empêche d'utiliser la fenêtre du propriétaire jusqu'à ce que vous masquiez la boîte de dialogue). Mieux vaut essayer ceci:
Essayez de définir le mode modal sur FALSE, puis utilisez WindowsDeactivated () pour Fermer de dialogue (Dialog.Dispose ()), fonctionne pour moi. P>
Avez-vous essayé la méthode AddawteventListener, cela devrait vous donner des événements pour tous les types d'événements spécifiés, par ex. Dans l'exemple que j'ai donné ci-dessous, ce serait tous les événements de la souris.
Je sais que vous avez dit "afin que vous ne puissiez pas simplement dire" N'utilisez pas une boîte de dialogue modale "", cela est probablement parce que vous avez du code qui exécute tout droit après l'appel SETVISIBLE? Pourriez-vous ne pas déplacer cela dans peut-être un auditeur pour quand la boîte de dialogue est fermée? Sans connaître les détails de votre application, il peut fournir une conception plus propre, notamment en ce qui concerne les tests unitaires, j'aime déplacer des dialogues dans une stratégie pour obtenir des réponses de l'utilisateur, de cette façon, je peux injecter des stratégies simulées sans suspendre un test d'unité lorsqu'il se déroule sans tête ou sans avoir à désordre avec création d'événements de manière programmable.