В основном я создал прослушиватель клавиш, подключенный к моему 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);
Поскольку он не был регулярно работает я пытался что-то еще под названием 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();
}
};
Это также работает, но иногда, когда я скомпилировать и запустить проект это просто не работает, а потом он работает, если я прекратить проект, а затем запустить его снова .. его Су странно на мой взгляд .. Кто-нибудь есть предложения?
EDIT: Я последовал answear по этому вопросу: KeyListener on JPanel randomly unresponsive
Я получаю ответ от нажатия на кнопку, которая apears и пробел, но не ключи, которые используются в методе обновления .. А теперь после того как я добавлена кнопка иногда, когда я запускаю приложение, все, что я получаю, это серое окно, и вам нужно несколько раз перезапустить его, чтобы сделать его нормальным снова, как в вопросе, который я связал.
Вы пытались добавить свой KeyListener в свой кадр вместо своей панели? Не уверен, что это сработает, но стоит попробовать. – nullptr
. Вы видите странную ошибку, которая не возникает при каждом запуске программы, но происходит только с перерывами. Это говорит мне о том, что у вас может быть проблема с потоками Swing, что-то, так или иначе, ваш код может не подчиняться правилам Swing threading соответствующим образом. Вы позаботились, чтобы начать свой графический интерфейс в EDT, Swing Event Dispatch Thread? Можете ли вы создать и опубликовать [sscce] (http://sscce.org), который демонстрирует вашу проблему? –
@nullptr: У меня есть серьезные сомнения в вашей рекомендации. –