簡體   English   中英

關鍵偵聽器和關鍵綁定不適用於每個編譯

[英]Key listener and key bindings doesnt work every compile

基本上,我已經創建了一個連接到我的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類中添加了此內容,並在update方法中注釋了關鍵偵聽器:

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隨機無響應

我確實從單擊apears和空格鍵的按鈕中獲得了響應,但是沒有單擊更新方法中使用的鍵。它幾次使其恢復正常,就像我鏈接的問題一樣。

嘗試添加

setFocusable(true);

到您的JPanel的構造函數。

通過添加frame.revalidate();解決它 在我的游戲循環中。 感謝您的所有回應!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM