密钥侦听器不工作?



好的,所以我的游戏有这个关键侦听器,它不起作用,但是当我制作一个新项目只是为了测试它对我有用吗?所以这是我的游戏的一些代码:

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

相关内容

  • 没有找到相关文章

最新更新