2012-06-26 45 views
1

好的,所以我有这个关键听众为我的游戏,它不工作,但是当我做了一个新的项目只是为了测试它对我来说是否工作,它呢?因此,这里是我的一些游戏代码:KeyListener不工作?

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()); 
} 

那么是什么问题?

+0

耶IVE添加打印语句在的keyPressed() – user1483224

+0

也testkeylistener工作在我的项目,但不是gamekeylistener – user1483224

回答

5

问题是您使用KeyListener s,而Swing旨在使用​​3210。差异可能是由于不同的焦点行为。

见例如this question其中KeyListener只是偶尔工作

+0

噢,谢谢!现在工作:) – user1483224

2

的KeyListener的应该被添加到画布上,并setFocusable因为需要重点

+0

仍然没有工作:/ – user1483224

+0

必须setFocusable,但最真实和最安全的方式是在@Robin的回答+1 – mKorbel

2

尝试添加监听孩子(画布),而不是JFrame的本身。 关键是在当前焦点的元素上触发。

JFrames几乎从未有焦点。