"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Pourquoi mes KeyListeners ne fonctionnent-ils pas dans mon JPanel ?

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

Publié le 2024-11-08
Parcourir:293

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 sein d'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 dépendent de 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 possibilité de focus et demandez le focus dans le constructeur de JPanel :

public JPanel extends JPanel implements KeyListener {

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

Alternative : liaisons de touches

Bien que la définition manuelle du focus soit une solution viable, une approche plus robuste consiste à utiliser les liaisons de touches. Les liaisons de touches fournissent un mécanisme flexible pour associer des frappes à des actions spécifiques. Pour implémenter des liaisons de touches dans un JPanel :

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

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

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3