Java - KeyBinds在按住键

时间:2016-10-31 00:58:57

标签: java swing key-bindings

*更新 - 我从我的MacBook上取下了我的项目并将其移动到Windows计算机(相同的代码),代码就像它应该的那样工作!有谁知道为什么会这样?

这是我在Stack Overflow上的第一个问题,所以我会尽力做正确的格式化。

我正在制作一个简单的Pong程序,它需要一个桨来上下移动关键事件(A& Z)。当我只是键入一个键时,关键事件工作得很完美,但是当我因某种原因按住一个键太久时键事件完全停止工作,这意味着即使键入键也不会再注册任何内容,直到我重新启动程序

我已经搜索了超过2个小时的答案但没有用。每个似乎相似的问题最终都会得到重点是问题的答案,并在InputMap中添加JComponent.WHEN_IN_FOCUSED_WINDOW。但是我已经尝试了这个,它根本没有帮助或解决我的问题。

这是我的代码:

public class ColorPanel extends JPanel implements ActionListener{
    public ColorPanel(Color backColor, int width, int height){

   //Non Relavent coding removed

    //Code for KeyBinding

    InputMap im = getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
    ActionMap am = getActionMap();

    im.put(KeyStroke.getKeyStroke(65, 0, false), "actionName");
    im.put(KeyStroke.getKeyStroke(65, 0, true), "actionName");
    im.put(KeyStroke.getKeyStroke(KeyEvent.VK_Z, 0, true), "actionName");
    im.put(KeyStroke.getKeyStroke(KeyEvent.VK_Z, 0, false), "actionName");

    am.put("actionName", new AbstractAction("actionName") {
          public void actionPerformed(ActionEvent e) {
            //System.out.println("---" + e.getActionCommand() + "---");
            if(e.getActionCommand().equals("a")){
                System.out.println("a!");
            }else if (e.getActionCommand().equals("z")){
                System.out.println("z!");
            }
          }
        });


}

2 个答案:

答案 0 :(得分:0)

您需要禁用按住某个键时通常显示的macOS重音弹出窗口。出于某种原因,这会让Java感到困惑。见这里:http://www.techradar.com/how-to/computing/apple/easy-mac-hacks-disable-the-pop-up-accent-window-when-typing-1305618

答案 1 :(得分:-1)

我在Mac上遇到完全相同的问题,并且如此处所述,罪魁祸首是用于重音键的mac的弹出窗口。这是一个不那么完美的解决方法:

每当问题发生且密钥停止工作时,首先点击任何"文本字段"在框架中使其聚焦,然后用重音弹出框(例如" a"键)保持这些键中的任何一个,直到弹出显示。然后点击退出键,然后所有键再次开始工作。

(参考:https://stackoverflow.com/a/49783514/8371761