【问题标题】:On mac, in Java, keyPressed event doesn't fire for certain keys在 Mac 上,在 Java 中,keyPressed 事件不会针对某些键触发
【发布时间】:2017-04-03 18:50:36
【问题描述】:

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

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

编辑2: 我已将代码简化为以下内容,它的行为仍如上文所述:

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

【问题讨论】:

  • 请分享你的代码
  • 也许其他东西在 Java 看到之前捕获了事件。你有粘滞键或类似的东西在运行吗?
  • 您使用的是哪个操作系统?
  • 我使用的是 Mac OS 10.12.2,所以没有粘滞键。它只发生在某些键上。我已将代码添加到问题中。
  • 这似乎是一个类似的问题,但尚未得到回答:stackoverflow.com/questions/39705742/…

标签: java


【解决方案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 应用程序不再有关键问题。

【讨论】:

    【解决方案2】:

    我通过进入我的系统偏好设置 -> 键盘并将按键重复滑块一直向左移动到“关闭”来修复它。

    【讨论】:

      【解决方案3】:

      这似乎是人们升级到 MacOS Sierra 后出现的一个 Java 错误:

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

      【讨论】:

        【解决方案4】:

        这里报告了更多麻烦的键

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-05-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-06
          相关资源
          最近更新 更多