在Mac上,在Java中,keyPressed事件不会触发某些键

这是一个非常奇怪的问题,但我只是在一个JPanel上添加了一个简单的keyListener,它在keyPressed和keyReleased上打印。 通常它工作正常,但在某些键上,如’A’,如果我在释放之前按住,没有其他键会在释放之后触发keyPressed,直到我按住某些键,如’D’。 在那之后,它会恢复正常,除非我按下“坏”键并保持太长时间。

最后一点,keyReleased ALWAYS正确触发,只是keyPressed失败了。

EDIT2:我已经将代码简化为以下内容,它的行为仍然如上所述:

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

编辑:代码提取:

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

我通过进入我的系统首选项 – >键盘并将键重复滑块一直向左移动到“关闭”来修复它。

看来这是人们升级到MacOS Sierra后出现的一个Java bug:

  • Java Bug数据库

  • Redditpost

作为临时解决方法,您可以尝试使用标准WASD之外的其他键来控制移动。