基本上我已經創建了連接到我的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;
}
}
而且我ofcourse通過這樣做將關鍵聽衆添加到JPanel:
panel.addKeyListener(KeyBoardClasshere);
由於它不是定期的工作我嘗試別的東西叫做關鍵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();
}
};
這也適用,但有時當我編譯和運行項目它只是不工作,然後,如果我終止該項目,然後再運行它..它的工作在我oppinion洙奇怪..任何人有什麼建議?
編輯: 我跟着這個問題的answear:KeyListener on JPanel randomly unresponsive
我從點擊該apears按鈕和空格鍵,但不是在更新方法使用的密鑰得到迴應。而現在經過我有時當我運行應用程序時添加了按鈕,所有我得到的都是一個灰色的窗口,必須重新啓動它幾次才能使其恢復正常,就像在我鏈接的問題中一樣。
您是否嘗試將KeyListener添加到您的框架而不是面板?不知道這是否會奏效,但值得一試 – nullptr 2013-05-03 20:41:03
您會看到一個奇怪的錯誤,不會在每次運行程序時發生,但只會間歇性地發生。這表明你可能有一個Swing線程問題,在某處,你的代碼可能不適合適應Swing線程規則。您是否正在小心翼翼地在EDT上啓動您的GUI,即Swing Event Dispatch Thread?你能創建併發佈一個能夠證明你的問題的[sscce](http://sscce.org)嗎? – 2013-05-03 20:41:10
@nullptr:我對你的建議有強烈的懷疑。 – 2013-05-03 20:42:13