1

さて、私は自分のゲームにこのキー リスナーを持っていますが、機能していませんが、テストするためだけに新しいプロジェクトを作成したとき、それはまったく機能しますか? だからここに私のゲームのいくつかのコードがあります:

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

それで、問題は何ですか?

4

3 に答える 3

5

問題はKeyListener、Swing がKeyBindingsを使用するように設計されているときに s を使用することです。この違いは、フォーカス動作の違いによるものである可能性があります。

たとえば、たまにしか機能しないこの質問を参照してくださいKeyListener

于 2012-06-26T16:18:32.173 に答える
2

KeyListener をキャンバスに追加し、Focus が必要なためsetFocusableにする必要があります。

于 2012-06-26T16:15:46.037 に答える
2

JFrame 自体ではなく、子 (キャンバス) にリスナーを追加してみてください。キーは、現在フォーカスがある要素で発生します。

JFrames にフォーカスがあることはほとんどありません。

于 2012-06-26T16:17:41.953 に答える