IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants Java Discussion :

[JComponent]Associer dynamiquement une touche à une action


Sujet :

Composants Java

  1. #1
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 847
    Points
    4 847
    Par défaut [JComponent]Associer dynamiquement une touche à une action
    Bonjour,

    Le titre n'étant pas très clair je vais préciser la question.
    Dans une interface graphique, je voudrais être capable d'associer une action lorsque l'utilisateur presse telle ou telle touche (bon, ça c'est pas dur, y'a plein de façon de procéder).

    Seulement je voudrais que ce soit l'utilisateur qui choisisse quelle touche associer à telle action, et là, je ne vois pas comment faire.
    Enfin si, ce serait simple en passant par la valeur entière de la touche en question, mais c'est impossible :

    L'utilisateur doit pouvoir modifier un fichier de configuration contenant un liste d'actions et lui associant une liste de touches que le programme doit récupérer et interpréter correctement.
    Les touches à attribuer ne se limitent pas aux lettres de l'alphabet et peuvent être des touches comme "Entrée", "Tab", etc.

    Si vous savez comment faire, merci de m'en faire part.

    Merci,
    Loceka.

    [ Sujet déplacé depuis le forum java par Viena ]
    Les Règles du Forum

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 65
    Points : 63
    Points
    63
    Par défaut
    Tu peux créer un panneau de configuration qui permet de choisir le type de combinaison clavier
    par exemple:
    une liste pour Alt, Ctrl, Shift,...
    et une autre pour les touches a,b,c,d,...
    la dernière liste étant la commande à effectuer

    un bouton valider
    et tu sauvegardes la combinaison dans un fichier XML par exemple (il faudra vérifier si la commande n'existait pas précédement auquel cas il faudra demander confirmation avant de l'écraser)

    exemple xml
    <?xml version="1.0" encoding="iso-8859-1"?>
    <configCommande>
    <!--
    Les caractères < et & ne peuvent pas être utilisés dans le texte, car ils sont utilisés dans le balisage. Si vous devez employer ces caractères, utilisez &lt; à la place de < et &amp; à la place de &
    Les caractères >, " , et ' peuvent également être remplacés par &gt; , &quot; et &apos; respectivement
    -->

    <commande1 touche="Alt+A"/>
    <commande2 touche="Shift+A"/>
    <commande3 touche="A"/>


    </configCommande>


    ----------------------------------
    attention il ne peut pas y avoir d'espace dans les balises
    ex <commande1 ->OK
    <commande 1 -> ne fonctionne pas correctement


    Il n'y a plus qu'a faire une recherche pour par exemple la commande2 dans le fichier XML
    il faudra interprèter la touche (dans l'exemple: Shift+A)
    et on pourra l'assigner.
    L'assignation devra se faire au chargement du panneau désiré.

  3. #3
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 851
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 851
    Points : 22 863
    Points
    22 863
    Billets dans le blog
    51
    Par défaut
    Une fois que tu as tes raccourcis via la méthode décrite plus haut (editor + eventuellement sauvegarde dans un fichier de conf XML ou .properties) tu as ensuite plusieurs méthodes pour associer un raccourcit clavier à un composant :

    S'il s'agit d'une Action, d'une sous-classe d'AbstractBouton ou associé (menu item) le plus simple est de créer un KeyStroke et de le mettre sur l'action ou le bouton. Attention dans la syntaxe des key stroke, il n'y a pas de + entre control et A. Egalement il faut fouiller/tester un peu pour trouver le mot clé associé à certaines touches du pavé numérique.

    Plus complexe mais plus généraliste : tu peux créer une InputMap (ou ComponentInputMap) et une ActionMap que tu installeras dans un de tes composants de haut-niveau (la frame ou le panel principal). Tu peux ensuite te créer un éditeur permettant à l'utilisateur d'associer tel ou tel KeyStroke (avec la possibilité d'en créer des nouveaux) avec telle ou telle Action.

  4. #4
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 847
    Points
    4 847
    Par défaut
    Merci bien, mais c'est surtout ça que je ne sais pas faire (ou plutôt que je ne vois pas comment faire et je n'ai rien trouvé dessus) :

    Citation Envoyé par bouye
    Tu peux ensuite te créer un éditeur permettant à l'utilisateur d'associer tel ou tel KeyStroke (avec la possibilité d'en créer des nouveaux) avec telle ou telle Action.
    Faire en sorte qu'à partir d'une chaîne de caractères je puisse déterminer quelle est la touche à assigner à l'action.
    Il faut aussi que le processus soit réversible : si l'utilisateur passe par l'interface graphique pour associer une touche à une action, cette touche doit être inscrite sous forme de chaîne de caractère dans le fichier de configuration.

    Une méthode simple mais très bourrine et pas très jolie de le faire serait de reprendre toutes les clefs listées dans la classe KeyEvent, de trouver le code (int) associé à chacune d'elle et de faire un "switch" pour les associer à un "string". Autant dire que s'il existe une autre méthode je la préfèrerai de loin !

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 65
    Points : 63
    Points
    63
    Par défaut
    Malheureusement je pense qu'en effet on est obligé de passé par un switch
    Maintenant une fois que tu as déterminé le int des touches tu peux le rajouter dans le fichier xml

    exemple:
    <commande1 touche="Alt+A" code="151"/>
    <commande2 touche="Shift+A" code="138"/>
    <commande3 touche="A" code="117"/>

    Tu n'auras donc plus qu'a charger le code et plus besoin de faire un switch à chaque chargement

  6. #6
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Lisez un peu la documentation. Allez voir la methode KeyStroke.getKeyStroke(String). Ca permet par exemple de specifier une action avec des chaines comme "control A", "typed ENTER", "controlt alt INSERT", etc.

  7. #7
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 851
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 851
    Points : 22 863
    Points
    22 863
    Billets dans le blog
    51
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Une méthode simple mais très bourrine et pas très jolie de le faire serait de reprendre toutes les clefs listées dans la classe KeyEvent
    Etant donné que tu risques d'avoir le même key code plusieurs fois mais avec des modificateur différents ce serait dommage de passer par un switch. Tu as déjà 2 maps (l'ActionMap et l'InputMap), pour faire un éditeur permettant d'associer le KeyStroke à l'Action tu peux faire un truc facilement avec une JTable et/ou des JComboBox. Ensuite Gfx t'as indiqué comment créer des KeyStroke. Outre le fait de taper textuellement le raccourcit clavier, tu peux aussi essayer de mettre un KeyListener sur un composant quelconque pour directement taper tes racourcits au clavier (faire une sorte d'enregistreur).

  8. #8
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 847
    Points
    4 847
    Par défaut
    Apparement j'ai mal expliqué le problème :

    J'ai une fenêtre principale dans laquelle je peux faire plusieurs actions par l'intermédiaire du clavier ou de la souris. Si l'utilisateur veut changer les touches via l'interface graphique, il va dans un menu d'option à partir duquel il ouvre une autre fenêtre où il peut configurer les touches.


    Pour se faire, je penser lister toutes les actions possibles (par exemple "avancer", "tourner à gauche", etc.) avec, à côté, les touches qui leur sont attribuées. Quand l'utilisateur sélectionne une action particulière, il lui suffit d'appuyer sur une touche du clavier pour lui affecter cette touche.

    Le programme récupère alors la touche en question (je pensais le faire en implémentant KeyListener : keyPressed() ou bien avec KeyStroke) puis il l'écrit dans un fichier de configuration sous forme de chaîne de caractère en l'associant à l'action.

    Là déjà, je ne vois pas comment faire pour associer une touche à une chaîne de caractère. Il y'a bien une méthode getKeyText() dans KeyEvent mais apparement le résultat dépend de la plateforme (chez moi il retourne "espace" et "entrée" or je doûte qu'il en aille de même sur une machine non française).


    Puis, une fois que l'utilisateur valide les changements, ils sont écrit dans le fichier de configuration. Ce fichier de configuration reste le tel quel une fois l'application terminée ce qui permet, lorsqu'on relance l'application, d'avoir déjà la dernière modification des touches : le programme doit donc lire une chaîne de caractère et l'associer à une touche du clavier (bon, avec la méthode getKeyStroke(String) c'est apparement faisable mais ça suppose que le fichier de configuration contient exactement la chaîne de caractère attendue... or justement je ne vois pas comment rentrer une telle chaîne de caractère, cf ci-dessus).


    Si l'utilisateur ne veut pas passer par le menu d'option de l'interface graphique mais qu'il veut modifier lui-même la touche dans le fichier de configuration, il doit pouvoir le faire.


    Une solution alternative serait d'utiliser la valeur entière de la touche avec les méthodes getKeyCode() et setKeyCode(int) mais ce serait tout sauf lisible dans le fichier. C'est pour ça que je veux faire quelque chose de similaire avec des String.

    C'est pourtant une façon de procéder assez courante il me semble, en tout cas dans les jeux vidéo, donc je pensais que des méthodes "simples" permettaient de le faire directement.

    J'espère que c'est plus compréhensible.

  9. #9
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Il faut faire la difference entre les donnes et l'affichage. Dans ton fichier de proprietes, tu enregistres la chaine fournie par la methode toString() de KeyStroke et tu recrees les KeyStroke avec getKeyStroke(). Mais pour l'affichage dans la boite de dialogue tu "parses" ton KeyStroke et utilises les getKeyText() pour avoir un affichage localise. Pour cela il suffit d'utiliser les methodes getModifiers() et getKeyCode() de KeyStroke.

  10. #10
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 847
    Points
    4 847
    Par défaut
    Merci bien, cette fois je crois que c'est bon.

    J'ai cherché à le faire avec le toString de KeyEvent comme tu me l'as indiqué, mais forcément, l'affichage du toString() ne correspond pas à la chaîne attendue par KeyStroke.getKeyStroke(String).

    Par contre en cherchant des solutions permettant d'utiliser le toString() ou le getKeyext() pour écrire les touches dans le format attendu, je suis tombé sur cette page, où ils proposent un "parser" :

    http://javaalmanac.com/egs/javax.swing/Key2Str.html

    S'ils l'ont fait ainsi, je pense que les autres solutions devaient être assez limitées, voire inexistantes, mais au moins ça me donne la synthaxe requise par le getKeyStroke(String) de KeyStroke.

    Merci à vous tous,
    Loceka.

  11. #11
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Lis la doc de la methode toString() tu verras qu'elle fournit une chaine recevable par getAWTKeyStroke() dans la meme classe :

    The String returned by this method can be passed as a parameter to getAWTKeyStroke(String) to produce a key stroke equal to this key stroke.

  12. #12
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 847
    Points
    4 847
    Par défaut
    Autant pour moi...

    J'utilisais la methode toString() de la classe KeyEvent, mais c'est un heritage de celle de la classe AWTEvent et non de celle de AWTKeyStroke comme je le croyais.

    Forcement ca marchait beaucoup moins bien.

    Merci de ta patience !

    Ca reste resolu, mais c'est beaucoup plus simple et plus propre maintenant.

    Loceka.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/10/2006, 14h25
  2. Assigné une fonction à une touche du clavier
    Par jay1234 dans le forum C++
    Réponses: 5
    Dernier message: 10/10/2006, 22h30
  3. Associer les données d'une session à une BDD
    Par TinyDwarf dans le forum Langage
    Réponses: 3
    Dernier message: 27/07/2006, 19h11
  4. Associer un son ou une musique à une touche du clavier
    Par Revan777 dans le forum C++Builder
    Réponses: 3
    Dernier message: 06/04/2006, 21h33
  5. Réponses: 6
    Dernier message: 23/02/2006, 09h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo