# Java > Interfaces Graphiques en Java > AWT/Swing >  [JButton]Associer un raccourci clavier a certaines touches du clavier ?

## jlassiramzy

Salut,

j'au un certain ensemble d'actions associs a des boutons respectifs ( 14 en tout) et que j'aimerais leur associer des raccourcis clavier bien prcis:

- les touches F1 jusqu'a F12 
- la touche Entre
- la touche Echap

Etant donne que j'utilise le Jbutton , peut on me dire comment proceder etape par etape ? 

merci

----------


## Orian

Tu utilise la mthode setMnemonic()



```
bouton.setMnemonic('VK_F1');
```

----------


## jlassiramzy

je ne pense pas que ca puisse marcher car VK_F1 n'est pas un caractere ni un entier , il faudra un argument compatible a setmnemonic mais lequel dans mon cas  ::(:  !

----------


## Orian

Exact, erreur de ma part...Utilise un KeyListenner alors.

----------


## spekal

Vois aussi How to Use Key Bindings. Si tu comprends pas l'anglais dis-le et j'essaierai d'expliquer.

----------


## bouye

Dans le cas d'un _Menu_ et d'un _MenuItem_ : 

```
menu.setAccelerator(KeyStroke.getKeyStroke("F1"));
```

Pour un bouton tu peux aussi essayer de lui associe une _Action_ dont la propriete _ACCELERATOR_KEY_ pointe sur le bon _KeyStroke_. Mais je n'ai jamais trop essaye si les saisies clavier sont correctement interceptees apres.

Sinon, de maniere plus generale, l'_ActionMap_ et l'_InputMap_ (ce qu'a indique spekal) permettent en effet de rendre completement customisable l'interface graphique, y compris sur les boutons.
De toute maniere tu vas avoir tendance a centraliser ce que tu fais dans des Action de maniere a eviter de dupliquer du code dans les menu et les boutons...

----------


## jlassiramzy

merci pour vos rponses, mais j'avoue que je suis toujours bloqu  ::(:  .. y as pas un moyen le plus simple possible pour assosier cette touche de clavier en particulier ( F1..F12 ) a mon bouton , j'avoue que ce que vous avez suugr est un peu du chinois pour moi  ::oops::  
merci

j'ai juste oubli de dire que mes boutons en font pas parti d'un menu , mais des boutons Jbutton classiques
merci

----------


## spekal

Tu es bloqu o ? As-tu commenc  suivre l'une des techniques que l'on t'a indiques (Action et accelerator_key, ou key binding) ?

----------


## jlassiramzy

je ne peux apparamment pas utiliser les accelerator_key pour mes jbuttons, ca ne figure meme pas dans la liste des methodes / attributs de ce component  ::(:

----------


## jproto

Lorsque tu as plusieurs points d'entre pour une mme action (bouton, touche de raccouris, menus, etc), la classe Action est ton allie : http://java.sun.com/docs/books/tutor...sc/action.html

Chris.

----------


## jlassiramzy

oui c'est tres interessant ..;mais je ne vois pas comment associer les touches F1..F12 aux 1 boutons dont je dispose  ::(:  .. comment ajouter ca ?

----------


## jproto

Pas le temps de tester, mais qqc du genre :



```

```

----------


## jlassiramzy

j'ai compris ton ide et le principe aussi , mais il se trouve que j'ai dja affect des actionlistners aux boutons , alors comment prendre en compte la classe Action afin de leur ajouter la fonction putvalue()?

j'ai part exemple un listner():


```

```

ce dode fonctionne bien sur , mais il me reste a l'annoter pour prendre en compte l'interface Action que tu viens de me suggerer ; mais comment  ::(:  ?
merci encore

----------


## jproto

S'il n'y a que la fonction *actionperformed()* dans ton listener, tu peux faire migrer tout ta fonction dans l'homologue de la classe *myDefinedAction*.

Cela donnera quelque chose de ce genre :



```

```

----------


## jlassiramzy

j'ai essay comme tu l'a suggr :



```

```

et a mon bouton j'ai mis:



```

```

mais la fenetre ne s'affiche pas , donc l'action ne s'excute pas ;(

je comprends pas ;(

----------


## jproto

Lorsque tu cris cela :



> myl.putValue("F1", new Integer(KeyEvent.VK_F1));


Je ne suis pas d'accord.
Le premier argument de putValue est un mot clef, mais pas TON mot clef.
"MNEMONIC_KEY" correspond,  priori,  l'ajout de ton raccourci clavier. (Cf. http://javasearch.developpez.com/j2s...ng/Action.html pour la liste des mots clef. Section *Field Summary*)

Perso, j'aurai essay avec :


```

```

----------


## jlassiramzy

tu veux dire 


```

```

mais j'ai ezssay et ca ne marche pas  ::(:  , j'ai essay de taper sur la touche F1 mais rien ne se passe comme avant  ::(:

----------


## jproto

Voici un exemple tout bte :



```

```

 
Cela peut ventuellement t'aiguiller. Ce n'est pas trs beau, mais cela montre que a fonctionne.

Sinon, une question me vient en tte : es-tu sr que ton vnement (l'appui sur la touche F1) n'est pas mang par un de tes contrle ?

----------


## jlassiramzy

oui sur , car c'est le seul endroit ou je l'utilise, je voulais juste amliorer mes anciens listeners ensupportant ces touches

----------


## jproto

Je pensais ventuellement a des default keymap affectes  certains contrles.
Dans le lot, il peut y en avoir une qui mange le F1. Auquel cas, il sera ncessaire de d'abord lui retirer cette attribution.

----------


## jlassiramzy

j'ai test ton code , oui ca marche sauf que pour mon cas je ne veux pas de la combinaison alt+F1 mais tout simplement F1 directement  ::(: 

j'azi pas compris le truc des keymaps tu peux m'expliquer stp?
merci

----------


## bouye

Pour un composant donne, tu peux definir une _ActionMap_ et une _InputMap_.

- l'_InputMap_ associe un KeyStroke (une touche ou combinaison de touche du clavier) a un nom.
- l'_ActionMap_ associe un nom a une _Action_.

Quand le composant a le focus et detecte le _KeyStroke_ en question, il recherche le nom dans l'_InputMap_ puis active l'action associee dans _ActionMap_.

Ex pour installer une action :



```

```

Avec ce principe tu peux arriver a facilement te creer une interface pour associer des touches du clavier aux actions disponibles dans ton application (de maniere similaire aux ecrans de configuration du clavier dans des jeux par exemple). Tu peux aussi avoir plusieurs _KeyStroke_ qui pointent sur la meme _Action_. Pour la cle tu n'est pas oblige d'utiliser le nom de l'_Action_, tu peux utiliser un identificateur maison.

Apres il faut t'arranger pour que ton composant ai le focus ou alors utiliser une action/input map plus globale que celle du composant meme.

----------


## jproto

Merci Bouye pour cette explication.
jlassiramzy, l o je voulais en venir, cest que certains composants possdent une default InputMap. En fait,  ma connaissance, tous les composants hritant de JComponent en possdent une.
Si un composant intercepte ton  F1  avant le composant dans lequel tu as dfinis ton action ... cest perdu pour toi (sauf sil a la politesse de retransmettre lvnement).

Pour ce qui est de ta remarque sur le  ALT+F1  au lieu du  F1 , je dois admettre avoir t un peu distrait  ::oops:: . Et je dois bien admettre que je ne vois pas du tout pourquoi ce  ALT  est l.

----------


## jlassiramzy

je ne sais pas si j'ai bien saii mais je vais essayer de m'en inspirer.
Mais au fait quelles seront les valeurs respectives aux touches F1..F12 si on raisonne en keystroke ?

----------


## jproto

Il y a quelque temps, j'ai t confront  un problme similaire pour lequel j'ai d vider une InputMap (http://www.developpez.net/forums/sho...ferrerid=81280) cela t'aidera peut tre.
Pour ce qui est des valeurs respectives aux touches F1..F12, tant que je n'aurais pas trouv pourquoi un *KeyEvent.VK_F1* ragit  "*ALT+F1*" au lieu de "*F1*", je ne peux pas te dire.

----------


## bouye

> Mais au fait quelles seront les valeurs respectives aux touches F1..F12 si on raisonne en keystroke ?


F1..F12



```
KeyStroke s = KeyStroke.getKeyStroke("F1");
```

C'est indique dans la doc de la methode getKeyStroke(), hors touches modificatrices (alt, ctrl, etc...) il faut simplement utiliser le suffixe indique apres le *VK_* dans la liste des constantes/keycode de _KeyEvent_.
Une variante de cette methode accepte egalement un _KeyEvent_ et une autre un keycode...

Effectivement si tu as un composant plus prioritaire qui utilise deja cette touche ou si ton application utilise JavaHelp, ben tu auras du mal a l'utiliser toi-meme.

----------

