2010-01-25 9 views
17

J'ai un JPanel dans un JFrame. J'ai enregistré un KeyListener, basé sur lequel je veux mettre à jour le JPanel. Le problème que je suis est que je ne peux pas obtenir le focus sur le JPanel et par conséquent mon KeyListener ne fonctionnera pas. Je sais déjà que le KeyListener est fonctionnel parce que je l'ai enregistré avec le JFrame et il a bien fonctionné. Mon code va quelque chose comme ça en ce moment:Obtention de focus sur un JPanel

myFrame.setFocusable(false); 
myPanel.setFocusable(true); 
myPanel.addKeyListener(myKL); 
myFrame.add(myPanel); 

Quelqu'un at-il déjà rencontré un problème comme celui-ci? Y a-t-il quelque chose qui me manque à cet égard?

P.S .: Je n'ai aucun composant à l'intérieur du JPanel Je dessine juste une image sur le fond, ainsi j'ai besoin de l'accent soit sur le JPanel lui-même et pas sur quelque chose à l'intérieur.

+1

Hmm, avec l'ajout myPanel.requestFocus() cela fonctionne pour moi. Quelle version de Java utilisez-vous? –

+1

Peut-être publier un SSCCE (simple exemple compilable autonome) qui reproduit cela. Cela donnera aux autres quelque chose à travailler pour aider. J'ai également remarqué un problème en le réduisant au minimum, parfois je suis capable de trouver la solution moi-même. – broschb

Répondre

21

Bien que vous indiquiez que le panneau peut être mis au point, le panneau ne demande pas de mise au point. Essayez d'utiliser myPanel.requestFocus();.

+0

Merci pour votre réponse. Essayé à la fois requestFocus() et requestFocusInWindow(), ni l'un ni l'autre ne permet au panneau d'obtenir le focus. Avez-vous d'autres suggestions? –

+1

Cela peut dépendre de quand vous l'appelez. Ne l'appelez pas dans le constructeur de JPanel, par exemple, car il est appelé avant l'affichage du panneau. –

+0

Merci David, cette réponse a fonctionné pour moi, je n'avais aucune idée que je ne pouvais pas faire l'appel du constructeur. Dès que j'ai déplacé le requestFocus() à une méthode qui était appelée après l'affichage sur l'écran, cela a fonctionné parfaitement. –

1

Je rencontre parfois un problème similaire. J'ai remarqué que dans certains cas, il est préférable de faire ou de demander de se concentrer sur un contrôle spécifique dans le panneau qui est dans le cadre (par exemple, la zone de saisie à laquelle vous voulez aller), plutôt que de demander le focus volet lui-même.

+0

totalement d'accord. –

1

Essayez

panel.setFocusable(true); 
panel.setRequestFocusEnabled(true); 

// some code here 

panel.grabFocus(); 
6

Utilisez setFocusable(true) puis requestFocusInWindow(). Mais ce dernier doit être fait après la fenêtre contenant le panneau est rendue visible, pour laquelle vous aurez probablement besoin d'enregistrer un écouteur de fenêtre et faites le requestFocusInWindow() dans le code de gestionnaire activé par la fenêtre.

Note: Plus précisément après la fenêtre est visible, non seulement après avoir appelé setVisible(true).

1

Essayez quelque chose comme ceci:

myFrame.addFocusListener(new FocusAdapter() { 

     /** 
     * {@inheritDoc} 
     */ 
     @Override 
     public void focusGained(FocusEvent aE) { 
      myPanel.requestFocusInWindow(); 
     } 
    }); 
Questions connexes