2013-05-03 2 views
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; 
   } 
} 

И я 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 и пробел, но не ключи, которые используются в методе обновления .. А теперь после того как я добавлена ​​кнопка иногда, когда я запускаю приложение, все, что я получаю, это серое окно, и вам нужно несколько раз перезапустить его, чтобы сделать его нормальным снова, как в вопросе, который я связал.

+0

Вы пытались добавить свой KeyListener в свой кадр вместо своей панели? Не уверен, что это сработает, но стоит попробовать. – nullptr

+1

. Вы видите странную ошибку, которая не возникает при каждом запуске программы, но происходит только с перерывами. Это говорит мне о том, что у вас может быть проблема с потоками Swing, что-то, так или иначе, ваш код может не подчиняться правилам Swing threading соответствующим образом. Вы позаботились, чтобы начать свой графический интерфейс в EDT, Swing Event Dispatch Thread? Можете ли вы создать и опубликовать [sscce] (http://sscce.org), который демонстрирует вашу проблему? –

+0

@nullptr: У меня есть серьезные сомнения в вашей рекомендации. –

ответ

1

Попробуйте добавить

setFocusable(true); 

конструктору ваших JPanel'S.

+0

У меня уже есть это в моем конструкторе .. И у меня есть "requestFocusInWindow();" – Rakso

0

Решил, добавив frame.revalidate(); в свою игру. Спасибо за все благодарности!

+0

Это не пахнет мне. Сожалею. –

+0

@HovercraftFullOfEels Ну, добавив это, он начал правильно работать – Rakso

+3

Я не сомневаюсь в этом, но он пахнет как клоч, который скрывает более пагубную проблему, в основном кудге, чтобы скрыть проблему с потоками. Если я прав, то мы обязательно увидим вас снова для другой проблемы, которая периодически возникает с вашим графическим интерфейсом. Надеюсь, я ошибаюсь. –

Смежные вопросы