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

AWT/Swing Java Discussion :

Système de touches de raccourci


Sujet :

AWT/Swing Java

  1. #1
    Membre éclairé
    Homme Profil pro
    Première S
    Inscrit en
    Juillet 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Première S

    Informations forums :
    Inscription : Juillet 2010
    Messages : 266
    Par défaut Système de touches de raccourci
    Bonjour, ma question est simple, mais le web ne fourmille pas de solution à ce sujet ...
    Voilà, j'aimerai faire des touche de raccourci, et accessibles n'importe où dans logiciel ... par exemple Ctrl. + N pour nouveau, à savoir qu'il n'y a pas forcément de composant graphique lié, donc pas de setAccelerator ou setMnemonic ...

    Auriez vous une idée de la marche à suivre ?
    merci d'avance.

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Par défaut
    Tu peux peut-être mettre un KeyListener avec un code écrit dans une classe dédiée afin d'éviter de faire des copier coller et de t’emmêler les pinceaux en cas de changement

  3. #3
    Membre éclairé
    Homme Profil pro
    Première S
    Inscrit en
    Juillet 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Première S

    Informations forums :
    Inscription : Juillet 2010
    Messages : 266
    Par défaut
    Oui, mais il faudrait ajouter en écouteur tous les composants graphiques ...
    Donc pas très pratique, d'autant plus que si un composant graphique est ajouté en écouteur, puis que ce composant graphique est détruit ...

    C'est effectivement une solution, mais si o, pouvait trouvé mieux ...
    merci beaucoup.

  4. #4
    Membre éclairé
    Homme Profil pro
    Première S
    Inscrit en
    Juillet 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Première S

    Informations forums :
    Inscription : Juillet 2010
    Messages : 266
    Par défaut
    je reviens un peu sur ce que j'ai dis, je ne vois effectivement pas ce que je pourrais faire d'autre ... si encore on pouvait faire un setAccelerator sur un JButton ou un JToggleButton, ça m'arrangerait, mais là même pas moyen ...
    Et un setMnemonic ne supporte par les combinaison telle que Ctrl. + etc. je crois ...

    Je vais voir si quand on ajoute un keyListener sur un JFrame, l'évènement se déclenche à chaque touche quand on est sur le JFrame ... j'ai juste peur que ça ralentisse un peu, parce que si on contrôle toutes les touches ...

  5. #5
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Par défaut
    Vous pouvez redéfinir les classes de swing. Par exemple un classe Fenetre qui hérite de JFrame et implémente KeyListener. Ainsi dans les constructeurs ajouter le listener et implémenter le code dans ces classes.

    Lorsque je développe une application, je redéfini presque à chaque fois les classes de Swing pour y ajouter des éléments. Je les réutilise à chaque fois

  6. #6
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Par défaut
    Pour ce qui est du ralentissement à vous de faire l'algo approprié. des switch case imbriqués feront très bien l'affaire. Deux switch principaux ou vous controllez controlle ou alt (donc environs deux fois moins de controlles) puis la touche qui accompagne et dès qu'elle est trouvée, on arrête

  7. #7
    Membre éclairé
    Homme Profil pro
    Première S
    Inscrit en
    Juillet 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Première S

    Informations forums :
    Inscription : Juillet 2010
    Messages : 266
    Par défaut
    c'est effectivement ce que je pensait, toutes mes ihm implémentent aussi JFrame (ou JDialog), donc je n'est plus qu'à implémenter en plus KeyListener (pas bête du tout ça ) Moi j'aurais fait un addKeyListener sur la JFrame ... mais je ne sait pas si ça aurait marché ...

    Merci beaucoup, je suis en train de monter ça ...
    à beintôt, je vous tiens au courant des résultats.

  8. #8
    Membre éclairé
    Homme Profil pro
    Première S
    Inscrit en
    Juillet 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Première S

    Informations forums :
    Inscription : Juillet 2010
    Messages : 266
    Par défaut
    Citation Envoyé par oneagaindoguys Voir le message
    Pour ce qui est du ralentissement à vous de faire l'algo approprié. des switch case imbriqués feront très bien l'affaire. Deux switch principaux ou vous controllez controlle ou alt (donc environs deux fois moins de controlles) puis la touche qui accompagne et dès qu'elle est trouvée, on arrête
    et en cas d'action conséquente, on lance dans un nouveau Thread
    oui mais attends, moi je compte me baser sur les keycode ... (avec Keystroke etc)
    Et j'ai fait des essai, dans le keyReleased, quand je j'appuie sur Ctrl, ça ne fait rien, puis quand je tape 'f' puis que je lâche les deux touche, ça produit deux évènement à la suite, l'un correspondant au Ctrl + f, l'autre correspondant au f.
    Mais comment puis-je savoir à partir du keycode si c'est une combinaison ?
    Peut-être es-ce que les combinaison donne un keycode supérieur à x ou quelque chose dans le genre ?

    Merci beaucoup.

  9. #9
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    La solution passe par les ActionMap/InputMap, disponible sur tous les composants Swing.


    L'ActionMap permet de d'associer une clef à une action. Cette clef peut correspondre à n'importe quoi (une simple string peut faire l'affaire) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	ActionMap actionMap = c.getActionMap();
    	actionMap.put("new", new AbstractAction() {
    		@Override
    		public void actionPerformed(ActionEvent e) {
    			// code
    		}
    	});

    Ensuite il faut utiliser l'InputMap pour associer une combinaison de touches à cette action :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	InputMap inputMap = c.getInputMap();
    	inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_DOWN_MASK), "new");
    Ainsi dès que tu feras cette combinaison de touche sur ce composant, l'action sera exécutée.


    Mais tu peux également utiliser un InputMap plus général, comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	InputMap inputMap = c.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
    Les combinaisons de touches de cet InputMap affecteront toute la fenêtre. Il te suffit d'utiliser cela sur ton ContentPane



    Attention aux duplications. Par exemple si tu définis "Ctrl+C" en global, il ne sera pas exécuté dans les JTextField où il est déjà défini (pour "copier").



    Enfin tu peux également utiliser KeyStroke.getKeyStroke(String) pour générer tes combinaisons de touches (plus pratique) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	InputMap inputMap = c.getInputMap();
    	inputMap.put(KeyStroke.getKeyStroke("ctrl N"), "new");

    a++

  10. #10
    Membre éclairé
    Homme Profil pro
    Première S
    Inscrit en
    Juillet 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Première S

    Informations forums :
    Inscription : Juillet 2010
    Messages : 266
    Par défaut
    magnifique, merci beaucoup !
    encore jamais vu ça sur le web ...
    je pense que ça va me suffire pour ce coup, je fait les tests, merci encore.
    à bientôt.

    NB

    au passage, merci pour le déplacement du message, je ne pensais pas que cela touchait autant le graphisme ...

  11. #11
    Membre éclairé
    Homme Profil pro
    Première S
    Inscrit en
    Juillet 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Première S

    Informations forums :
    Inscription : Juillet 2010
    Messages : 266
    Par défaut
    oups, pas si vite, je ne trouve pas la méthode getActionMap sur le composant JFrame !!!
    c'est pourtant bien du Swing ! (j'ai vérifié dans les imports)
    pourquoi ?!
    merci beaucoup.

  12. #12
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Par défaut
    Je ne connaissais pas cette solution. Merci

  13. #13
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Par défaut
    Citation Envoyé par Dominique49 Voir le message
    oups, pas si vite, je ne trouve pas la méthode getActionMap sur le composant JFrame !!!
    c'est pourtant bien du Swing ! (j'ai vérifié dans les imports)
    pourquoi ?!
    merci beaucoup.
    Et par le contentPane de la JFrame ?

  14. #14
    Membre éclairé
    Homme Profil pro
    Première S
    Inscrit en
    Juillet 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Première S

    Informations forums :
    Inscription : Juillet 2010
    Messages : 266
    Par défaut
    non plus ... même si je n'y avais pas pensé ...
    par contre, je peu récupérer le JPanel que j'ai ajouté à ma JFrame, du mois pour ce cas là. Mais c’eût été mieux si on pouvait directement le faire sur la JFrame, pour être sûr d'intercepter les touches ...

    EDIT

    je viens de voir qu'en faisant un cast avec le type dont on s'est servi pour le setContentPane, ça marche ... par exemple (JPanel)this.getContentPane().getActionMap() ...

    mais ça reviens au même d'appeler getActionMap directement sur le JPanel que l'on a utilisé comme container ... non ?

  15. #15
    Membre éclairé
    Homme Profil pro
    Première S
    Inscrit en
    Juillet 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Première S

    Informations forums :
    Inscription : Juillet 2010
    Messages : 266
    Par défaut
    au passage, je viens de voir cette méthode :
    getActionForKeyStroke()
    mais je ne peu apparemment rien en tirer pour ajouter un écouteur ... ce n'est apparemment qu'un getter, dommage que le setter correspondant n'existe pas

    EDIT

    ça ne marche pas avec la méthode du cast, sans doute parce que le cast bousille la référence à l'objet. Par contre, ça marche avec une JTable ou un JPanel, donc je me débrouille avec ça, merci beaucoup !

    Par contre, si quelqu'un savait comment faire en sorte que les raccourcis soient accessible depuis n'importe ou sur l'application ...

    et puis .. si quelqu’un sait aussi comment faire pour que les raccourcis soient accessible de aprtout sur l'ordi, comme cam studio par exemple ... même si j'en ai pas besoin maintenant, ça peu être très intéressant

    Merci encore, et à bientôt.

  16. #16
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Les fenêtres sont un peu à part.
    Utilises le ContentPane ou le RootPane... ou n'importe quel composant en fait du moment qu'il appartient à la fenêtre et que tu utilises le WHEN_IN_FOCUSED_WINDOW.




    a++

    PS : Pour le déplacement, c'est parce que c'est une question spécifique à Swing

  17. #17
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    T'embêtes pas et positionnes les sur le rootpane :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InputMap inputMap = frame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
    Citation Envoyé par Dominique49 Voir le message
    Par contre, si quelqu'un savait comment faire en sorte que les raccourcis soient accessible depuis n'importe ou sur l'application ...
    Tu devras installer les action/input maps sur chaque fenêtre.
    Sinon il doit y avoir moyen de "hacker" l'EDT... mais pas sûr que ce soit plus simple...

    Citation Envoyé par Dominique49 Voir le message
    et puis .. si quelqu’un sait aussi comment faire pour que les raccourcis soient accessible de aprtout sur l'ordi, comme cam studio par exemple ... même si j'en ai pas besoin maintenant, ça peu être très intéressant
    Là tu touches à des spécificités de l'OS hôte... Il te faudra donc passer par du code natif.

    Il faut donc déjà cibler les OS sur lesquelles ton application va tourner, puis se renseigner sur le code natif à utiliser et l'existence éventuelle d'une librairie Java pour cela...


    a++

  18. #18
    Membre éclairé
    Homme Profil pro
    Première S
    Inscrit en
    Juillet 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Première S

    Informations forums :
    Inscription : Juillet 2010
    Messages : 266
    Par défaut
    merci beaucoup .. mais j'ai un dernier pb (le dernier).
    comme tu me l'a montré plus haut, on peu faire KeyStroke.getKeyStroke("ctrl e"); par exemple. Mais si j'essaye de rajouter .getKeycode() par derrrière, ça me lève un NullPointerException ... comment récupérer le keycode alors ?
    merci.

    EDIt

    je pourrais le fair à la main mais ça ne serait pas spécialement facile ...

  19. #19
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Le nom de la lettre doit être en majuscule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    KeyStroke.getKeyStroke("ctrl E")
    cf la javadoc

    a++

  20. #20
    Membre éclairé
    Homme Profil pro
    Première S
    Inscrit en
    Juillet 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Première S

    Informations forums :
    Inscription : Juillet 2010
    Messages : 266
    Par défaut
    oups pardon, j'avait fait exrpsè un toLowerCase() pour mettre en minuscule ... comme dans ton exemple (corrigé d'ailleurs )

    Merci beaucoup, je n'aurais pas cru que c'était si bête ...
    à bientôt.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 10/03/2008, 22h33
  2. touches de raccourcis
    Par buzzz dans le forum Visual C++
    Réponses: 1
    Dernier message: 06/09/2007, 11h45
  3. affecter touche de raccourci à un bouton
    Par piotrr dans le forum Tkinter
    Réponses: 7
    Dernier message: 30/05/2007, 15h17
  4. Assigné une touche de raccourci a un bouton.
    Par morgan47 dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 01/10/2006, 19h23
  5. faire de la touche F1 une touche de raccourci?
    Par sb dans le forum Composants VCL
    Réponses: 3
    Dernier message: 06/08/2002, 10h11

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