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 :

Key binding : utilisation de InputMap et ActionMap


Sujet :

AWT/Swing Java

  1. #1
    Invité
    Invité(e)
    Par défaut Key binding : utilisation de InputMap et ActionMap
    Bonjour,

    Après avoir lu le tutorial "key binding" d'oracle, je n'arrive pas à utiliser correctement InputMap et ActionMap.

    Mon interface graphique ne contient que deux éléments : une JFrame et un JPanel dans lequel je dessine des trucs. Je voudrais associer des actions aux flèches directionelles (VK_LEFT, VK_RIGHT, ...). Le problème est que les flèches ne produisent pas de caractères Unicode, donc dans mon actionPerformed(), l'appel de getActionCommand() me renvoie "null" :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Panneau extends JPanel {
      Panneau() {
        Object cle = new Object();
        getInputMap().put(KeyStroke.getKeyStroke("LEFT"), cle);
        getInputMap().put(KeyStroke.getKeyStroke("RIGHT"), cle);
        getActionMap().put(cle, new ActionsClavier());
      }
    }

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class ActionsClavier extends AbstractAction {
      public void actionPerformed(ActionEvent e) {
        String touche = e.getActionCommand();
        System.out.println(touche); // affiche "null"
        if (touche.equals("LEFT"))
          ;//aller a gauche
        else if (touche.equals("RIGHT"))
          ;//aller a droite
      }
    }

    Avez-vous une idée de comment récupérer l'entier qui correspond à un champ static de KeyEvent ? (exemple KeyEvent.VK_LEFT ou KeyEvent.VK_RIGHT)

  2. #2
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Points : 1 540
    Points
    1 540
    Par défaut Peut être une idée
    Bonsoir,

    Je ne voudrais pas dire de bêtises mais pourquoi n'implémentez-vous pas tout simplement KeyListener dans votre JPanel histoire de réagir aux évènements produits par les touches du clavier ?

    Je ne comprends pas votre question :
    Avez-vous une idée de comment récupérer l'entier qui correspond à un champ static de KeyEvent ? (exemple KeyEvent.VK_LEFT ou KeyEvent.VK_RIGHT)
    Vous donnez vous-même la réponse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.out.println(KeyEvent.VK_LEFT);// par exemple
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Effectivement j'y ai déjà pensé mais cela n'est pas satisfaisant car il faut que le composant associé au KeyListener ait le focus.

    Je n'ai jamais réussi à donné le focus à ma JFrame ou à mon JPanel. (Les méthodes hasFocus() et isFocused() renvoient false.) Donc déjà c'est mal parti pour le KeyListener. Et en plus si plus tard je décide de rajouter des composants, je vais devoir mettre des KeyListeners partout pour être sûr que les frappes clavier sont toujours détectées.

    -------------------------------------

    Dans la fonction actionPerformed(ActionEvent e), je cherche un moyen de savoir si la touche à l'origine de l'évènement est KeyEvent.VK_LEFT ou KeyEvent.VK_RIGHT, en utilisant le paramètre ActionEvent e.

    J'ai examiné les méthodes offertes par le paramètre ActionEvent e, et aucune des fonctions ne convient (il n'y a que getActionCommand() mais ça ne marche pas pour les flèches directionnelles).

    --------------------------------------------------

    En attendant de trouver mieux, j'ai fait ça :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    class Fenetre extends JFrame {
      Fenetre() {
        Object cle1 = new Object();
        Object cle2 = new Object();
        Object cle3 = new Object();
        Object cle4 = new Object();
        InputMap inputMap = getRootPane().getInputMap(WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
        inputMap.put(KeyStroke.getKeyStroke("LEFT"), cle1);
        inputMap.put(KeyStroke.getKeyStroke("RIGHT"), cle2);
        inputMap.put(KeyStroke.getKeyStroke("UP"), cle3);
        inputMap.put(KeyStroke.getKeyStroke("DOWN"), cle4);
        getActionMap().put(cle1, new ActionsClavier("LEFT"));
        getActionMap().put(cle2, new ActionsClavier("RIGHT"));
        getActionMap().put(cle3, new ActionsClavier("UP"));
        getActionMap().put(cle4, new ActionsClavier("DOWN"));
      }
    }

    Mais c'est pas bon, il y a de la redondance (et je pense pas que ça soit la bonne façon d'utiliser InputMap et ActionMap).
    Dernière modification par Invité ; 06/03/2011 à 12h49.

  4. #4
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Points : 1 540
    Points
    1 540
    Par défaut D'accord
    Pour le moment, je n'ai pas le temps de chercher plus. Mais je penses que vous devriez jeter un oeil sur la classe java.awt.KeyboardFocusManager....
    Vous pouvez aussi consulter ce HowTo :
    http://download.oracle.com/javase/tu...eybinding.html
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  5. #5
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Pour donner la possibilité à un composant d'acquérir focus alors qu'il n'est pas initialement prévu pour ça il suffit de faire appel à la méthode sur ce composant. (la JFrame et les containers ne sont pas focusable par défaut).

    Dans ton cas il serait donc préférable que tes bindings soient placés sur un JPanel que tu rende focusable plutôt que directement sur ta JFrame.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  6. #6
    Invité
    Invité(e)
    Par défaut
    J'ai regardé un peu le système de focus et c'est un peu abrupt. Je crois que je vais rester comme ça, je vais juste mettre les bindings sur le JPanel au lieu de la JFrame.

    Merci bien pour vos réponses, topic résolu.

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

Discussions similaires

  1. JTextField ( focus ) et Key Bindings
    Par enibris dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 26/05/2014, 14h15
  2. [XSLT 1.0] fonction key variable ? / utilisation de l'index ? / autre solution
    Par eleve_prog dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 11/02/2013, 13h50
  3. Réponses: 2
    Dernier message: 12/07/2007, 10h30
  4. Plugin Eclipse key binding
    Par Goduak dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 21/02/2007, 14h10
  5. [MAJ]Problème de propagation d'évènement + Key Binding
    Par seiryujay dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 23/06/2006, 16h19

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