好的,所以我的游戏有这个关键侦听器,它不起作用,但是当我制作一个新项目只是为了测试它对我有用吗?所以这是我的游戏的一些代码:
public class GameKeyListener implements KeyListener {
private void pressMainWeapon() {
Constants.MAIN_WEAPON_PRESSED = Constants.MAIN_WEAPON_PRESSED ? true : false;
}
private void pressSecondaryWeapon() {
Constants.SECONDARY_WEAPON_PRESSED = Constants.SECONDARY_WEAPON_PRESSED ? true : false;
}
private void pressSkillsButton() {
Constants.SKILLS_BUTTON_PRESSED = Constants.SKILLS_BUTTON_PRESSED ? true : false;
}
private void gameKeyPressed(int keyCode) {
switch (keyCode) {
case KeyEvent.VK_Q:
pressMainWeapon();
break;
case KeyEvent.VK_E:
pressSecondaryWeapon();
break;
case KeyEvent.VK_TAB:
pressSkillsButton();
break;
case KeyEvent.VK_W:
Constants.CHARACTER_Y -= 5;
break;
case KeyEvent.VK_A:
Constants.CHARACTER_X -= 5;
break;
case KeyEvent.VK_S:
Constants.CHARACTER_Y += 5;
break;
case KeyEvent.VK_D:
Constants.CHARACTER_X += 5;
break;
}
}
private void gameKeyReleased(int keyCode) {
}
private void gameKeyTyped(char keyChar) {
}
@Override
public void keyPressed(KeyEvent e) {
gameKeyPressed(e.getKeyCode());
System.out.println(e.getKeyChar());
}
@Override
public void keyReleased(KeyEvent e) {
gameKeyReleased(e.getKeyCode());
}
@Override
public void keyTyped(KeyEvent e) {
gameKeyTyped(e.getKeyChar());
}
和
public class GraphicsMain {
static JFrame f = new JFrame("Gurillia");
private static GameCanvas gc = new GameCanvas();
public static void startGraphics() throws IOException {
f.setVisible(true);
f.setIgnoreRepaint(true);
f.setContentPane(gc);
gc.setPreferredSize(new Dimension(Constants.GAME_WIDTH, Constants.GAME_HEIGHT));
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setResizable(false);
f.addKeyListener(new GameKeyListener());
}
但这确实有效:
public class testkeylistener implements KeyListener {
@Override
public void keyPressed(KeyEvent arg0) {
System.out.println(arg0.getKeyChar());
}
@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
public static void main(String args[]) {
JFrame f = new JFrame("test");
f.setSize(1000,1000);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
f.pack();
f.addKeyListener(new testkeylistener());
}
那么问题出在哪里呢?
问题是你使用 KeyListener
s,而 Swing 被设计为使用 KeyBindings。差异可能是由于不同的焦点行为造成的。
例如,请参阅此问题,其中KeyListener
只是偶尔工作
尝试将侦听器添加到子项(画布),而不是 JFrame 本身。密钥在当前具有焦点的元素上触发。
JFrames几乎从不专注。
KeyListener 应该添加到画布中,并设置可聚焦,因为需要 Focus