Question

Je souhaite donc déclencher un événement (mettre en pause ou en suspendre un contenu multimédia) chaque fois que l'utilisateur appuie sur la barre d'espace n'importe où dans l'application my Swing.

Étant donné le nombre de contrôles et de panneaux qui pourraient avoir le focus, il n’est pas vraiment possible d’ajouter des événements clés à tous (sans parler de brut).

J'ai donc trouvé

KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher()

qui est génial, vous pouvez enregistrer des pré-gestionnaires de pression globale. Il y a cependant un problème majeur: des espaces seront saisis tout le temps dans les champs de saisie, les cellules de tableau, etc., et je ne souhaite évidemment pas déclencher l'événement pause alors!

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

Était-ce utile?

La solution

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 s'il s'agit d'une instance d'une certaine classe de champs, vous ignorez l'espace aux fins de l'événement pause. Si cela vous semble trop compliqué, ne vous inquiétez pas, instanceof est TRÈS rapide pour la machine virtuelle Java (et quelle que soit la cause, vous parlez d’événements à échelle humaine qui sont très inquiétants pour un processeur).

Autres conseils

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.

ok ... Eh bien, j'essaie de filtrer en fonction de la source. Le problème est mes ComboBox modifiables ... Ils sont des exemples de

javax.swing.plaf.basic.BasicComboBoxEditor$BorderlessTextField

Et comme BorderlessTextField est une classe interne privée, je ne peux apparemment pas effectuer d’examen de vérification.

idées?

EDIT: ok donc ça marche ....

 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;
            }
        });

C'est totalement dégoûtant et je le déteste.  J'aimerais pouvoir trouver un moyen de vérifier si la pression exercée sur une touche a été consommée par un composant. Je ne pourrais alors effectuer l'événement de pause que lorsque la touche n'a été activée par aucun composant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top