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 :

[SWING] gérer les entrées clavier à un seul endroit


Sujet :

AWT/Swing Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 94
    Points : 85
    Points
    85
    Par défaut [SWING] gérer les entrées clavier à un seul endroit
    Bonjour,

    Je desire gérer tous les evènements clavier avec la classe principale de mon programme. Elle implémente l'interface KeyListener. J'utilise le BorderLayout qui contient des JPanel qui eux-meme peuvent en contenir d'autres pour finir sur les éléments proprement dit.
    Existe-t-il un moyen de spécifier la gestion des entrées clavier pour toute l'application ou dois-je utiliser la méthode addKeyListener pour chaque composant? Par exemple, lorsqu' un JButton a le focus, l'évènement keyTyped ne remonte pas, par defaut, au composant parent.

    J'ai aussi pensé à faire une méthode qui prendrait un JPanel en parametre et lancerait le addKeyListener pour tous ses Component mais je me demandais s'il n'y avait pas un truc plus simple.

    Merci pour vos réponses.

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    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 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Regarde peut-être du côté des classes javax.swing.InputMap, javax.swing.ComponentInputMap et de la méthode JComponent.setInputMap(int condition, InputMap map).
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Il y a deux solutions. La premiere est d'utiliser un glass pane, qui est un composant, de preference transparent, qui se trouve par dessus tout le reste de l'interface. Regarde les methodes getGlassPane() et setGlassPane() de la classe JFrame. En gros, si tu crees un glass pane, que tu le rends transparent et que tu ecoutes les touches avec, tu feras ce que tu veux. Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class MaFrame extends JFrame {
      public MaFrame() {
        JPanel glassPane = new JPanel();
        glassPane.setOpaque(false);
        setGlassPane(glassPane);
        glassPane.setVisible(true);
        glassPane.addKeyListener(monKeyListener);
      }
    }
    L'autre solution, que je prefere car j'utilise souvent les glass panes pour d'autres raisons, est d'installer un AWTEventListener :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Toolkit.getDefaultToolkit().addAWTEventListener(new MyListener(), AWTEvent.KEY_EVENT_MASK); 
    // ...
    class MyListeners implements AWTEventListener {
          public void eventDispatched(AWTEvent event) {
            if (event.getID() == KeyEvent.KEY_PRESSED) {
                KeyEvent keyEvent = (KeyEvent) event;
                System.out.println("Key: " + keyEvent.getKeyCode());
            }
        }
    }
    Romain Guy
    Android - Mon livre - Mon blog

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Personelement j'ai utilisé cette methode pour tous ce qui est action global de l'application et y rajouter des racourci clavier, ici ALT+V

    maFrame() {
    Action monAction =
    new AbstractAction() {
    /* action a efectuer */
    }
    };

    ((JComponent) contentPane).getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_V, KeyEvent.ALT_DOWN_MASK), "mon Action");
    ((JComponent) contentPane).getActionMap().put("mon Action", monAction);
    }

    Voila bonne journée

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 94
    Points : 85
    Points
    85
    Par défaut
    Merci pour vos réponses.

    J'ai finalement installé un AWTEventListener dans ma classe principale et cela marche parfaitement bien.

    J'ai regardé la documentation de la classe InputMap ainsi que les différents exemple que j'ai pu trouver et il me semble que cette classe est plus adaptée à l'interception d'une ou quelques touches. Si on veut tout intercepté cela devient assez fastidieux car il faut tout ajouter. A moins que quelque chose m'ait échappé.
    D'autre part j'ai testé la solution basée sur un glassPane sans succès. Lorsqu'un JButton a le focus il recupére le KeyEvent avant le glassPane.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 103
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par Gfx
    Il y a deux solutions. La premiere est d'utiliser un glass pane, qui est un composant, de preference transparent, qui se trouve par dessus tout le reste de l'interface. Regarde les methodes getGlassPane() et setGlassPane() de la classe JFrame. En gros, si tu crees un glass pane, que tu le rends transparent et que tu ecoutes les touches avec, tu feras ce que tu veux. Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class MaFrame extends JFrame {
      public MaFrame() {
        JPanel glassPane = new JPanel();
        glassPane.setOpaque(false);
        setGlassPane(glassPane);
        glassPane.setVisible(true);
        glassPane.addKeyListener(monKeyListener);
      }
    }
    L'autre solution, que je prefere car j'utilise souvent les glass panes pour d'autres raisons, est d'installer un AWTEventListener :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Toolkit.getDefaultToolkit().addAWTEventListener(new MyListener(), AWTEvent.KEY_EVENT_MASK); 
    // ...
    class MyListeners implements AWTEventListener {
          public void eventDispatched(AWTEvent event) {
            if (event.getID() == KeyEvent.KEY_PRESSED) {
                KeyEvent keyEvent = (KeyEvent) event;
                System.out.println("Key: " + keyEvent.getKeyCode());
            }
        }
    }
    je me suis servi de ce code pour voir si je pouvais recuperer les evenements clavier et ça marche sans problemes mais comment est ce que je peux faire pour executer une action si le raccourci CTRL+N est realisé ?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 103
    Points : 53
    Points
    53
    Par défaut
    c'est bon en fait j'ai trouvé

  8. #8
    Membre confirmé Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Points : 554
    Points
    554
    Par défaut
    Citation Envoyé par Gfx
    Il y a deux solutions. La premiere est d'utiliser un glass pane, qui est un composant, de preference transparent, qui se trouve par dessus tout le reste de l'interface. Regarde les methodes getGlassPane() et setGlassPane() de la classe JFrame. En gros, si tu crees un glass pane, que tu le rends transparent et que tu ecoutes les touches avec, tu feras ce que tu veux. Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class MaFrame extends JFrame {
      public MaFrame() {
        JPanel glassPane = new JPanel();
        glassPane.setOpaque(false);
        setGlassPane(glassPane);
        glassPane.setVisible(true);
        glassPane.addKeyListener(monKeyListener);
      }
    }
    L'autre solution, que je prefere car j'utilise souvent les glass panes pour d'autres raisons, est d'installer un AWTEventListener :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Toolkit.getDefaultToolkit().addAWTEventListener(new MyListener(), AWTEvent.KEY_EVENT_MASK); 
    // ...
    class MyListeners implements AWTEventListener {
          public void eventDispatched(AWTEvent event) {
            if (event.getID() == KeyEvent.KEY_PRESSED) {
                KeyEvent keyEvent = (KeyEvent) event;
                System.out.println("Key: " + keyEvent.getKeyCode());
            }
        }
    }

    Je remonte un vieux sujet, mais c'est juste pour préciser que j'ai cherché partout le moyen de faire des raccourcis clavier sur mon application swing (genre ctrl+o pour ouvrir...) et que la solution avec un glasspane est très très galère puisqu'il faut en fait que le glasspane ait le focus pour recevoir les evenements clavier (ce qui n'est pas le cas pour les évènements souris)...

    La 2eme solution "quotée" () est superbe pour faire ce que je veux faire, puisqu'en plus de récupérer les évènements, il les laisse atteindre les composants (comme par exemple les JTextField qui ont besoin de récupérer ces évènements).

    Bref tout ça pour dire que encore une fois, la solution est sur ce forum

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

Discussions similaires

  1. Gérer les évenements clavier
    Par Telemak dans le forum NetBeans
    Réponses: 10
    Dernier message: 25/07/2007, 21h25
  2. Java ignore les entrées clavier
    Par yannart dans le forum Général Java
    Réponses: 9
    Dernier message: 26/05/2007, 18h26
  3. [Entrée standard] Prendre les entrées clavier.
    Par Katyucha dans le forum Langage
    Réponses: 4
    Dernier message: 19/09/2005, 12h22
  4. Réponses: 5
    Dernier message: 25/07/2005, 09h29
  5. Réponses: 3
    Dernier message: 04/02/2004, 18h35

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