2008-11-05 6 views
3

Je souhaite donc déclencher un événement (mettre en pause/ne pas interrompre certains médias) chaque fois que l'utilisateur appuie sur la barre d'espace n'importe où dans l'application my Swing.capturer des touches de presses globales en Java

Puisqu'il y a tellement de contrôles et de panneaux qui pourraient avoir le focus, il n'est pas vraiment possible d'ajouter des keyevents à tous (pour ne pas mentionner brut).

Je trouve

KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher() 

ce qui est génial, vous pouvez vous inscrire keypress global pré-gestionnaires. Il y a cependant un problème majeur: les espaces seront tapés tout le temps dans les champs de saisie, les cellules de tableau, etc., et je ne veux évidemment pas déclencher l'événement de pause alors!

Alors, des idées? Peut-être y a-t-il moyen de détecter globalement si le curseur est focalisé sur quelque chose qui permet la saisie de texte, sans avoir à vérifier une liste de tous les contrôles éditables (vomir!)?

Répondre

2

Je pense que vous avez répondu vous-même - oui je pense que vous pouvez trouver l'élément actuel qui a le focus, et si c'est une occurrence d'une certaine classe de champ, vous ignorez l'espace pour l'événement pause. Si cela ne vous dérange pas, ne vous inquiétez pas, instanceof est TRÈS rapide pour la JVM (et dans tous les cas, vous parlez d'événements à échelle humaine qui sont un problème pour un processeur).

1

Je suis rouillé sur mon Swing, mais je pense que vous devriez essayer d'enregistrer un écouteur global en utilisant Toolkit.addAWTEventListener avec un KEY_EVENT_MASK. Vous pouvez ensuite filtrer le traitement AWTEvent en fonction de son type et de sa source.

0

Ok ... Bien essayer de filtrer en fonction de la source. Le problème est mon ComboBoxes éditables ... Ils sont instanceof

javax.swing.plaf.basic.BasicComboBoxEditor$BorderlessTextField 

Et puisque BorderlessTextField est une classe intérieure privée, je ne peux pas apparemment faire une vérification instanceof contre elle.

idées?

EDIT: ok si cela fonctionne ....

KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventPostProcessor(new KeyEventPostProcessor() { 

      public boolean postProcessKeyEvent(KeyEvent e) { 
       if (e.getID() == KeyEvent.KEY_PRESSED) { 
        Object s = e.getComponent(); 
        if (!(s instanceof JTextField) && 
         !(s instanceof JTable && ((JTable) s).isEditing()) 
         ) { 
         music_player.pauseEvent(); 
        } 

        //System.out.println(s.getClass().toString()); 
       } 
       return true; 
      } 
     }); 

Son tout à fait brut et je déteste ça. Je voudrais pouvoir trouver un moyen de vérifier si la touche a été consommée par un composant - alors je n'ai pu effectuer l'événement de pause que lorsque la touche n'a été actionnée par aucun composant.

Questions connexes