【发布时间】:2016-10-31 00:58:57
【问题描述】:
*更新 - 我从我的 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!");
}
}
});
}
【问题讨论】:
-
在 Windows 7 上使用 JDK8 对我来说效果很好。我只是在 JFrame 上使用了一个面板。
This is my first question here on Stack Overflow- 发布正确的SSCCE 来演示问题。我们不知道您的程序中是否还有其他可能导致问题的原因。 -
我查看了您所说的内容,并在我使用 mac 时在 windows 设备上尝试了我的项目。问题消失了!?你知道为什么会发生这种情况吗?
-
我从未使用过 Mac,所以我不确定会出现什么问题。然而,在 Windows 上,当您按住某个键时,您会生成诸如“按下、按下、按下、......释放”之类的事件。即“已发布”事件仅生成一次。在 Mac 上,我相信你会得到:“按下、释放、按下、释放、按下、释放”。那是由于某种原因,释放的事件不断产生。也许这是造成差异的原因?
标签: java swing key-bindings