[英]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.