En mac, en Java, el evento keyPressed no se activa para ciertas teclas
Este es un problema realmente extraño, pero solo tengo un simple KeyListener agregado a un JPanel que imprime en keyPressed y en keyReleased. Por lo general, funciona bien, pero en ciertas teclas como 'A', si presiono y sostengo antes de soltar, ninguna otra tecla disparará la tecla presionada después de esa liberación hasta que presione y mantenga presionadas ciertas teclas como 'D'. Después de eso, vuelve a la normalidad a menos que presione una tecla "incorrecta" y la mantenga presionada durante demasiado tiempo.
Una última nota, keyReleased SIEMPRE se activa correctamente, solo keyPressed falla.
EDIT2: he simplificado el código simplemente a lo siguiente y todavía se comporta como se describe anteriormente:
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
public class Test {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setSize(800, 600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
System.out.println("Pressed");
}
@Override
public void keyReleased(KeyEvent e) {
System.out.println("Released");
}
});
}
}
EDITAR: extracto de código:
JFrame frame = new JFrame("test");
frame.setSize(WIDTH, HEIGHT);
frame.setLocationRelativeTo(null);
frame.setLayout(null);
frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
frame.setResizable(false);
JLayeredPane panel = new JLayeredPane();
panel.setBounds(0, 0, WIDTH, HEIGHT);
panel.setLayout(null);
frame.add(panel);
KeyListener listener = new KeyListener() {
public void keyTyped(KeyEvent e) {
System.out.println("typed: "+e.getKeyCode());
}
@Override
public void keyPressed(KeyEvent e) {
System.out.println("pressed: "+e.getKeyCode());
}
@Override
public void keyReleased(KeyEvent e) {
System.out.println("released: "+e.getKeyCode());
System.out.println();
}
};
panel.addKeyListener(listener);
frame.addKeyListener(listener);
frame.setVisible(true);