2017-04-03 114 views
1

这是一个非常奇怪的问题,但我只是将一个简单的keyListener添加到在keyPressed和keyReleased上打印的JPanel。通常它可以正常工作,但对于某些按键(如“A”),如果在释放之前按住按钮,在释放之后没有其他按键会触发按键,直到按住某些按键(如“D”)。之后,除非按下“坏”键并保持太久,否则它会恢复正常。在mac上,在Java中,keyPressed事件不会触发某些键

最后一个注意事项,keyReleased总是触发正常,它只是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); 
+1

请分享您的代码 –

+0

也许别的东西在Java看到它之前捕获事件。你有没有粘键或类似的运行? – ingyhere

+0

您正在使用哪种操作系统? – Felix

回答

0

我通过去固定它放入我的系统首选项 - >键盘,然后将按键重复滑块一直移动到左侧以“关闭”。

0

看来,这是一个Java漏洞的人升级到MacOS的塞拉利昂之后出现了:

作为临时解决办法,你可以尝试使用用于控制移动的标准WASD以外的按键。