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

时间:2017-04-03 18:50:37

标签: java

这是一个非常奇怪的问题,但我只是在一个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);

4 个答案:

答案 0 :(得分:1)

我最近遇到了这个问题,这是由于MacOS在您按住某些键时显示上下文菜单(允许您选择其他语言字符)引起的,并且错误报告页面为我提供了一个很好的解决方案:

https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8167263

  

要禁用字符重音菜单并启用自动重复功能,请输入   在命令提示符下:

defaults write -g ApplePressAndHoldEnabled -bool false
     

这可以通过以下方法反转:

defaults write -g ApplePressAndHoldEnabled -bool true

我刚刚在Mac控制台上尝试了此操作,而我的Java应用程序不再遇到关键问题。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

看来这是人们升级到MacOS Sierra后出现的Java错误:

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

答案 3 :(得分:0)

这里报告了更多麻烦的键

https://community.oracle.com/thread/4115318

目前看来,最好的解决方法是避免使用

z,c,n,a,s,e,y,u,i,o