2010-04-04 5 views
0

Dans mon application, j'ai un cadre, avec barre d'outils (la barre d'outils contient quelques actions). Je souhaite que la barre d'outils soit visible uniquement lorsque la fenêtre est mise au point. Donc, j'ai enregistré un windowFocusListener sur la fenêtre. Le problème est - lorsque la fenêtre n'est pas mise au point et je clique sur l'endroit où une action de la barre d'outils devrait être l'action est effectuée. Cela se produit car WindowFocusGained est appelé avant que le bouton de la souris ne soit relâché et lorsque le bouton de la souris est libéré, il appelle l'actionPerformed.Problème Swing-focus

Est-ce que quelqu'un a une idée pour contourner ce problème? Est-ce que quelqu'un sait comment déterminer si le bouton de la souris est cliqué maintenant?

Répondre

0

Vous pouvez ajouter un MouseListener à la fenêtre et vérifier si la barre d'outils est visible dans l'événement mousePressed. Si la barre d'outils n'est pas visible au moment où la souris est pressée, définissez un indicateur sur la barre d'outils (quelque chose comme "ignoreNextAction").

Dans la barre d'outils, vérifiez cet indicateur dans votre gestionnaire d'événements actionPerformed.

Réinitialisez l'indicateur de barre d'outils dans l'événement mouseReleased sur la fenêtre, afin que le clic suivant fonctionne correctement.

Cela suppose que l'événement mouseReleased sur la fenêtre se produit après l'actionPerformed sur la barre d'outils (pas sûr à ce sujet). Dans le pire des cas, vous pouvez travailler avec une minuterie qui réinitialise le drapeau 50ms après l'événement de la souris.

0

Vous pouvez maintenant seulement masquer la barre d'outils lorsque la fenêtre perd le focus, mais aussi désactiver tous les boutons avec setEnabled(false), puis réactiver sur le gain de mise au point. Vous pouvez également synchroniser setEnabled (..) avec la visibilité des boutons (au lieu du focus de la fenêtre).