"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Por que meus KeyListeners não estão funcionando no meu JPanel?

Por que meus KeyListeners não estão funcionando no meu JPanel?

Publicado em 2024-11-08
Navegar:944

Why Aren\'t My KeyListeners Working in My JPanel?

KeyListeners não respondem no JPanel: um problema comum

Ao usar KeyListeners para detectar pressionamentos de tecla em um JPanel, os desenvolvedores geralmente encontram o problema em que o os ouvintes não conseguem acionar as ações desejadas. Esse problema pode surgir de vários fatores.

Restrições de componentes em foco

KeyListeners dependem de se anexarem ao componente em foco para funcionar corretamente. Por padrão, o foco não é concedido automaticamente a um JPanel. Para resolver esse problema, defina explicitamente a capacidade de foco e solicite o foco no construtor do JPanel:

public JPanel extends JPanel implements KeyListener {

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

Alternativa: Key Bindings

Embora definir o foco manualmente seja uma solução viável, uma abordagem mais robusta é utilizar Key Bindings. As associações de teclas fornecem um mecanismo flexível para associar pressionamentos de tecla a ações específicas. Para implementar associações de teclas em um 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");
        }
    }
}

Neste exemplo, a classe leftAction define a ação a ser executada quando a tecla de seta para a esquerda for pressionada (neste caso, imprimindo "test" no console).

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3