"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Por qué mis KeyListeners no funcionan en mi JPanel?

¿Por qué mis KeyListeners no funcionan en mi JPanel?

Publicado el 2024-11-08
Navegar:997

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

KeyListeners no responden en JPanel: un problema común

Al utilizar KeyListeners para detectar pulsaciones de teclas dentro de un JPanel, los desarrolladores a menudo encuentran el problema de que los oyentes no logran desencadenar las acciones deseadas. Este problema puede surgir de varios factores.

Restricciones de componentes enfocados

Los KeyListeners dependen de conectarse al componente enfocado para funcionar correctamente. De forma predeterminada, el foco no se otorga automáticamente a un JPanel. Para resolver este problema, establezca explícitamente la capacidad de enfoque y solicite el enfoque dentro del constructor de JPanel:

public JPanel extends JPanel implements KeyListener {

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

Alternativa: combinaciones de teclas

Si bien establecer el enfoque manualmente es una solución viable, un enfoque más sólido es utilizar combinaciones de teclas. Las combinaciones de teclas proporcionan un mecanismo flexible para asociar pulsaciones de teclas con acciones específicas. Para implementar combinaciones de teclas en 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");
        }
    }
}

En este ejemplo, la clase leftAction define la acción que se realizará cuando se presiona la tecla de flecha izquierda (en este caso, imprimir "prueba" en la consola).

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3