Tengo una aplicación Swing que necesita mostrar diferentes conjuntos de controles en función de si se presionan las teclas de control o alt. Agregué un KeyListener al componente principal, pero se notifica solo si se selecciona ese componente, no si se selecciona un subcomponente. ¿Hay alguna forma de escuchar eventos para un componente y todos los descendientes?Escucha de eventos clave para una jerarquía de componentes
Editar:
He intentado utilizar InputMap del componente principal, pero ningún caso se dispara cuando se pulsa una tecla de modificación. En concreto, tengo el siguiente código:
InputMap inputMap = panel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
inputMap.put(KeyStroke.getKeyStroke("pressed CONTROL"), "test1");
inputMap.put(KeyStroke.getKeyStroke("released CONTROL"), "test2");
ActionMap actionMap = panel.getActionMap();
actionMap.put("test1", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("pressed");
}
});
actionMap.put("test2", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("released");
}
});
Al presionar y soltar la tecla de control, esto imprimirá "liberado", pero no "presionado". Nada más está registrando nada en ningún InputMap, por lo que no es como si algo más estuviera registrado para el mismo golpe de tecla.
Esto funciona para pulsaciones de teclas "CONTROL liberado" pero no para "CONTROL presionado". Del mismo modo para alt y shift. –
@ Adam Crume Bueno, algunos controles pueden estar escuchando ctrl, alt o shift. Sin embargo, al menos probar con otras teclas, inicia la acción dada al presionar la tecla. Es cierto, sin embargo, se lanzará repetidamente mientras se presiona la tecla. –
Lo que Zack menciona con InputMap y ActionMap usa enlaces de teclas. Nuevamente, revise el tutorial que resolverá su problema. –