2009-07-09 7 views
0

J'ai un cadre pivotant qui contient des panneaux intégrés qui contiennent d'autres panneaux, etc. Au fond, il y a un bouton. Je veux que le bouton obtienne la mise au point de sorte que l'appui sur la touche "entrée" génère un événement actionPerformed. Cependant, si je fais myButton.requestFocus() ou myButton.requestFocusInWindow() toute la fenêtre obtient le focus, mais rien ne semble se passer en termes de clavier. Il me manque évidemment quelque chose au sujet du sous-système de mise au pointComment faire un bouton en profondeur dans un panneau Swing imbriqué obtenir le "focus du clavier"?

Update2: J'ai explicitement ajouté un KeyListener en plus de l'ActionListener et maintenant cela fonctionne. C'est vraiment bizarre, puisque je pensais que actionListener incluait à la fois des actions de touches et de souris.

+0

Ce bouton est-il visible (par exemple, n'est pas caché par un sous-onglet ou quelque chose comme ça)? – akarnokd

+0

Avez-vous essayé requestFocusInWindow()? – Avrom

+0

Oui, j'ai essayé les deux. Et oui, le bouton est visible. C'est dans un contrôle à onglets mais l'onglet est visible. – Uri

Répondre

0

Des sons comme requestFocus() échouent à un certain niveau. Essayez de tester si l'un des parents jPanels ou d'autres composants peuvent demander une mise au point, et faites votre chemin pour trouver l'origine du problème.

0

Il est un moyen de spécifier programatically la fonctionnalité de l'onglet (vous savez quand vous appuyez sur l'onglet et le widget suivant gets sélectionné)

Par défaut, il suit la façon dont les composants ont été ajoutés. L'utilisation de ce mécanisme personnalisé vous permet de sélectionner votre bouton imbriqué en tant que premier recevant l'événement actionperformed.

Malheureusement, je ne me souviens pas ce que le nom de ce « mécanisme » est, mais est quelque chose comme traversal ou se concentrer traversal

+0

Vous pensez à FocusTraversalPolicy: http://java.sun.com/j2se/1.5.0/docs/api/java/awt/FocusTraversalPolicy.html –

+0

Ahh celui-là! Merci. – OscarRyz

0

Tout d'abord, ne pas utiliser requestFocus() utiliser requestFocusInWindow(). requestFocus a des problèmes spécifiques à la plate-forme, tandis que requestFocusInWindow est plus cohérent.

Votre problème actuel; le composant (ou l'un de ses parents) n'est probablement pas visible ou a été rendu non focalisable.

0

Je veux que le bouton pour obtenir mise au point pour que appuyant sur la touche « enter » serait générer un événement actionPerformed.

Ce sont des dépendances LAF. Entrez fonctionne dans Windows, mais pas le Metal LAF. Consultez Enter Key and Button pour plus d'informations.

La méthode requestFocusInWindow() ne fonctionne que si le composant est actuellement visible sur le cadre. Il n'y a pas d'autres astuces donc nous ne faisons que des suppositions aléatoires sur ce que vous faites mal. Si vous avez besoin d'aide, vous devez afficher un SSCCE démontrant le problème.

1

Pour la touche Entrée pour vous travailler voudrez probablement régler le bouton par défaut plutôt que la mise au point du clavier:

button.getRootPane().setDefaultButton(button); 

Si vous voulez vraiment le focus du clavier alors votre problème pourrait être lié à lorsque vous appelez requestFocus. Parfois, s'il est appelé avant qu'un composant soit entièrement visible, il peut être ignoré.Pour résoudre ce problème, vous pouvez retarder l'appel requestFocus qu'après d'autres événements ont été traités:

SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     button.requestFocus(); 
    } 
}); 
0

Vous pouvez obtenir le rootPane du cadre et mettre à jour le InputMap et ActionMap. Voir le code ci-dessous.

InputMap map = getRootPane(). GetInputMap (JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); map.put (KeyStroke.getKeyStroke (KeyEvent.VK_ENTER, 0), "ok"); ActionCap actionMap = getRootPane(). GetActionMap();

ActionMap.put ("ok", enterAction)
;

Ici enterAction est un objet AbstractAction dont l'actionPerformed() sera appelée lorsque l'utilisateur appuie sur Entrée.

Questions connexes