2010-12-06 34 views
2

J'ai une application Java que j'appelle App. App affichera parfois un JFrame que nous appellerons myFrame. App affichera également une JTextArea qui est contenue dans un JDialog ou un JFrame (je ne sais pas lequel, mais je peux savoir si c'est nécessaire pour répondre à cette question). Appelons cela JTextArea "myTextArea".JFrame continue à recevoir des touches même après avoir semblé perdre le focus

Maintenant, la séquence des événements suivants se produit:

  1. Nous affichons myFrame. Il a l'accent et vous pouvez lui donner votre avis.
  2. Nous appelons myFrame.setVisible (false)
  3. Nous affichons myTextArea.
  4. Nous appelons myTextArea.requestFocus().
  5. myTextArea a le focus (le curseur clignote dedans), mais toutes les frappes qui sont entrées sont envoyées à myFrame!

Notez que myTextArea n'est pas contenu dans myFrame.

Que se passe-t-il ici? Quelqu'un at-il entendu parler d'un JFrame non-visible recevant des frappes? Non seulement recevoir des frappes mais les voler d'un autre composant qui a le focus?

+3

Jamais vu est arrivé. Publiez votre SSCCE (http://sscce.org) qui montre le problème. – camickr

+0

Je * aimerais * poster mon SSCCE pour cela. C'est une application énorme, cependant, et cela peut prendre du temps. –

+2

Si vous ne disposez pas d'une solution appropriée dans un proche avenir, le temps nécessaire pour réduire votre application à un SSCCE peut être du temps. Je prédis que si vous faites cela, vous trouverez vous-même le problème et la solution et n'aurons même pas besoin de notre aide. –

Répondre

1

J'ai trouvé ce qui cause le problème. MyFrame a une classe MyKeyEventHandler qui implémente KeyEventDispatcher. La méthode dispatchKeyEvent(KeyEvent e) renvoie toujours la valeur false, même pour les frappes de touches destinées à myTextArea. Par conséquent, les frappes de touche n'atteignent pas myTextArea.

+0

Merci d'avoir posté un suivi. 1+ rep. –

0

Il ne s'agit pas de basculer la visibilité. Le JFrame est initialisé en premier et a toujours le focus. Vous ne faites que le rendre invisible, n'en enlevant pas le focus.

De plus, votre JTextBox doit avoir un conteneur parent. Eventuellement

myFrame.add (myTextArea);

devrait fonctionner. Pour déplacer le focus sur JTextArea, utilisez:

myTextArea.requestFocus();

+0

Désolé pour le TextBox, c'était TextArea. – r3st0r3

+0

L'appel de myTextArea.requestFocus() ne résout pas le problème (même si c'est peut-être une partie nécessaire du correctif). –

+1

Lorsque vous définissez un cadre invisible, le système d'exploitation détermine quelle autre fenêtre sur le bureau obtient le focus. Je doute que l'utilisation de "requestFocus" résoudra le problème, mais même si c'est un problème de mise au point qui est la mauvaise méthode à utiliser. Lisez la description de l'API de la méthode requestFocus pour connaître la méthode appropriée à utiliser. – camickr