Maison  >  Article  >  Java  >  Pourquoi mes KeyListeners ne fonctionnent-ils pas dans mon JPanel ?

Pourquoi mes KeyListeners ne fonctionnent-ils pas dans mon JPanel ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-28 07:32:02390parcourir

Why Aren't My KeyListeners Working in My JPanel?

Les KeyListeners ne répondent pas dans JPanel : un problème courant

Lors de l'utilisation de KeyListeners pour détecter les frappes au clavier dans un JPanel, les développeurs rencontrent souvent le problème où le les auditeurs ne parviennent pas à déclencher les actions souhaitées. Ce problème peut provenir de plusieurs facteurs.

Contraintes des composants ciblés

Les KeyListeners comptent sur leur attachement au composant ciblé pour fonctionner correctement. Par défaut, le focus n'est pas automatiquement accordé à un JPanel. Pour résoudre ce problème, définissez explicitement la focalisation et demandez le focus dans le constructeur de JPanel :

<code class="java">public JPanel extends JPanel implements KeyListener {

    public JPanel() {
        this.addKeyListener(this);
        this.setFocusable(true);
        this.requestFocusInWindow();
    }</code>

Alternative : liaisons de touches

Alors que définir le focus manuellement est un solution viable, une approche plus robuste consiste à utiliser les liaisons de clés. Les liaisons de touches fournissent un mécanisme flexible pour associer des frappes à des actions spécifiques. Pour implémenter les raccourcis clavier dans un JPanel :

<code class="java">public JPanel extends JPanel implements ActionListener {

    public JPanel() {
        setupKeyBinding();
        this.setFocusable(true);
        this.requestFocusInWindow();
    }

    private void setupKeyBinding() {
        int condition = JComponent.WHEN_IN_FOCUSED_WINDOW;
        InputMap inMap = getInputMap(condition);
        ActionMap actMap = getActionMap();

        inMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "Left");
        actMap.put("Left", new leftAction());
    }

    private class leftAction extends AbstractAction {

        public void actionPerformed(ActionEvent e) {
            System.out.println("test");
        }
    }
}</code>

Dans cet exemple, la classe leftAction définit l'action à effectuer lorsque la touche fléchée gauche est enfoncée (dans ce cas, imprimer "test" sur la console) .

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn