1

基本上我已经创建了一个连接到我的 JPanel 的关键侦听器。有时当我编译并运行它时,它确实工作得很好,而且没有任何问题。但有时当我编译它时它不会工作。它不识别按键。

这是我在 JPanels 更新方法中用于关键侦听器的代码:        

if(keyListener.getMovingRight() == KeyEvent.VK_RIGHT){
            player.playerMoveRight();
        }
        if(keyListener.getMovingLeft() == KeyEvent.VK_LEFT){
            player.playerMoveLeft();
        }
        if(keyListener.getMovingUp() == KeyEvent.VK_UP){
            player.playerMoveUp();
        }
        if(keyListener.getMovingDown() == KeyEvent.VK_DOWN){
            player.playerMoveDown();
        }

上面的代码知道是否从这个类中按下了键:

public class KeyBoard implements KeyListener {

    private int playerMoveUp;
    private int playerMoveDown;
    private int playerMoveLeft;
    private int playerMoveRight;

    public KeyBoard(){
        playerMoveUp = 0;
        playerMoveDown = 0;
        playerMoveLeft = 0;
        playerMoveRight = 0;
    }

    @Override
    public void keyTyped(KeyEvent keyEvent) {
    }

    @Override
    public void keyPressed(KeyEvent keyEvent) {

        //Switch statement to get which keys were pressed
        switch(keyEvent.getKeyCode()){

            case KeyEvent.VK_UP:
                playerMoveUp = keyEvent.getKeyCode();
                break;

            case KeyEvent.VK_DOWN:
                playerMoveDown = keyEvent.getKeyCode();
                break;

            case KeyEvent.VK_LEFT:
                playerMoveLeft = keyEvent.getKeyCode();
                break;

            case KeyEvent.VK_RIGHT:
                playerMoveRight = keyEvent.getKeyCode();
                break;
        }
    }

    @Override
    public void keyReleased(KeyEvent keyEvent) {

        //Switch statement to get which keys were released
        switch(keyEvent.getKeyCode()){

            case KeyEvent.VK_UP:
                playerMoveUp = 0;
                break;

            case KeyEvent.VK_DOWN:
                playerMoveDown = 0;
                break;

            case KeyEvent.VK_LEFT:
                playerMoveLeft = 0;
                break;

            case KeyEvent.VK_RIGHT:
                playerMoveRight = 0;
                break;
        }
    }

    public int getMovingUp(){
        return playerMoveUp;
    }
    public int getMovingDown(){
        return playerMoveDown;
    }
    public int getMovingLeft(){
        return playerMoveLeft;
    }
    public int getMovingRight(){
        return playerMoveRight;
    }
}

我当然通过这样做将关键侦听器添加到 JPanel:

panel.addKeyListener(KeyBoardClasshere);

由于它不经常工作,我尝试了其他称为 Key Bindigs 的东西,因为我听说这会增加我的机会..

我在我的 JPanel 类中添加了这个,并在更新方法中注释掉了关键监听器:

   

public void keyBindingsInitialize(ActionMap am, InputMap im){
        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "Right");
        am.put("Right", RightBind);

        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "Left");
        am.put("Left", LeftBind);

        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "Up");
        am.put("Up", UpBind);

        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "Down");
        am.put("Down", DownBind);
    }
    
    Action RightBind = new AbstractAction(){
        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            player.playerMoveRight();
        }
    };
    Action LeftBind = new AbstractAction(){
        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            player.playerMoveLeft();
        }
    };
    Action UpBind = new AbstractAction(){
        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            player.playerMoveUp();
        }
    };
    Action DownBind = new AbstractAction(){
        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            player.playerMoveDown();
        }
    };

这也有效,但有时当我编译和运行项目时它只是不起作用,然后如果我终止项目然后再次运行它,它就会起作用..在我看来它太奇怪了..有人有建议吗?

编辑:我按照这个问题的回答:JPanel 上的 KeyListener random unresponsive

我确实通过单击出现的按钮和空格键而不是在更新方法中使用的键得到响应。现在在我添加按钮后,有时当我运行应用程序时,我得到的只是一个灰色窗口,必须重新启动就像我链接的问题一样,它再次使其正常化了几次。

4

2 回答 2

1

尝试添加

setFocusable(true);

到您的 JPanel 的构造函数。

于 2013-05-03T20:43:46.370 回答
0

通过添加frame.revalidate();我的游戏循环来解决它。感谢所有的回答!

于 2013-05-03T21:29:14.230 回答