Java Swing键事件随机关闭
我正在用Java制作一个2D游戏。播放时,控件将随机锁定,通常在30秒内,绑定将停止对按键的反应。控件偶尔会在短时间内返回。我使用Z、X和箭头键。单独使用箭头键似乎可以,但Z键和X键似乎可以触发锁定
对于控件,我最初使用KeyListeners,然后使用KeyEventDispatcher,然后尝试键绑定。虽然keylisters似乎仍然触发keyreased事件,只是没有按下keyressed,但它们都会发生这种情况。键绑定完全停止
游戏窗口是JFrame中JPanel中的画布。使用面板的输入和操作映射设置绑定
我在mac电脑上,最近升级到macOS Sierra。我在升级之前就看到过这个问题,但升级之后情况变得更糟,游戏变得无法运行。我还没有在其他操作系统或其他Mac上测试过
我在网上发现一些人似乎也有同样的问题,有人提交了一份bug报告:
https://bugs.openjdk.java.net/browse/JDK-8167263
但除此之外,我还没有找到多少解决方法。在这一点上,我最好的猜测是,这是一个连接到Sierra的bug,要么会有修复程序,要么我的mac上有需要重新配置的东西。我会继续找的。任何建议都很好,因为我可能错过了重要的一步。谢谢大家
下面是一个使用WASD键的可编译示例:
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
public class KeyErrorTest
{
public KeyErrorTest() {}
public static void main(String[] args)
{
KeyErrorTest keyErrors = new KeyErrorTest();
keyErrors.go();
}
public void go()
{
//create panel
JPanel panel = new JPanel();
panel.setFocusable(true);
panel.requestFocusInWindow();
//set up bindings for press and release
InputMap inputMap = panel.getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW);
ActionMap actionMap = panel.getActionMap();
//W
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0, false), 1);
actionMap.put(1, new KeyPresser(KeyEvent.VK_W));
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0, true), 2);
actionMap.put(2, new KeyReleaser(KeyEvent.VK_W));
//A
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0, false), 3);
actionMap.put(3, new KeyPresser(KeyEvent.VK_A));
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0, true), 4);
actionMap.put(4, new KeyReleaser(KeyEvent.VK_A));
//S
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_S, 0, false), 5);
actionMap.put(5, new KeyPresser(KeyEvent.VK_S));
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_S, 0, true), 6);
actionMap.put(6, new KeyReleaser(KeyEvent.VK_S));
//D
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0, false), 7);
actionMap.put(7, new KeyPresser(KeyEvent.VK_D));
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0, true), 8);
actionMap.put(8, new KeyReleaser(KeyEvent.VK_D));
//create frame
JFrame frame = new JFrame("Key Bindings Test");
frame.getContentPane().add(panel);
frame.pack();
frame.setVisible(true);
System.out.println("Press [W], [A], [S], or [D] several times");
System.out.println("The error tends to occur within 30 seconds");
System.out.println("The keys will randomly stop registering");
}
private class KeyPresser extends AbstractAction
{
int key;
public KeyPresser(int key)
{
this.key = key;
}
@Override
public void actionPerformed(ActionEvent e)
{
System.out.println((char)key+" down");
}
}
private class KeyReleaser extends AbstractAction
{
int key;
public KeyReleaser(int key)
{
this.key = key;
}
@Override
public void actionPerformed(ActionEvent e)
{
System.out.println((char)key+" up");
}
}
}
共 (0) 个答案