Keylistener не работает после нажатия кнопки - PullRequest
6 голосов
/ 10 ноября 2011

У меня есть кейлист, прикрепленный к моему фрейму в Java, я могу обнаружить нажатия клавиш, когда я нажимаю любую клавишу, однако происходит странная вещь. Моя игра - тральщик, у меня есть кнопка перезапуска, которая в основном очищает доску и напоминает о ней. Странно то, что когда я нажимаю кнопку мышью, все проясняется, и доска напоминает, но список ключей перестает работать. Даже незнакомец у меня есть jmenuitem, который в основном выполняет автоматическое нажатие кнопки. Так что это как restartbutton.doclick ()

Если я щелкну jmenuitem, чтобы перезапустить его, он перезапустится, прекрасно очистит все, и кейлистайнер все еще функционирует. Я даже вижу, как нажимается кнопка. Есть идеи, почему это может происходить?

Спасибо

это прикреплено к моей основной раме. это слушатель, который перестает работать после нажатия кнопки.

frame.addKeyListener(new KeyListener(){


       public void keyReleased(KeyEvent e){


       }

       public void keyPressed(KeyEvent e){

       System.out.println("hey");
       int keycode = e.getKeyCode();

       if(e.isControlDown() & keycode==KeyEvent.VK_C){

      balh blah balh
       }

       }

       public void keyTyped(KeyEvent e){


       }

       });

Ответы [ 4 ]

12 голосов
/ 10 ноября 2011

Предложения:

  • Ваша проблема в фокусе, когда KeyListener перестает работать, потому что слушаемый контейнер потерял фокус на JButton.
  • Одно из решений заключается в том, чтобы JButton не смог сфокусироваться, вызвав на него setFocusable(false).
  • Но я рекомендую вам вообще не использовать KeyListener, если это возможно, а привязки клавиш, поскольку с привязками у вас нет этой проблемы, а также это конструкция более высокого уровня.

Редактировать
Что касается:

Каков наилучший способ изменить это на привязку ключа?

Лучше всего изучить учебник Key Bindings и выполнить рекомендации, найденные там.

1 голос
/ 22 мая 2013

это проблема фокуса, вы можете использовать этот код, чтобы снова сфокусироваться

getTopLevelAncestor().requestFocus();

0 голосов
/ 04 августа 2017

Я смог решить эту проблему, установив для свойства setFocused контейнера значение true:

frame.setFocusable(true);
0 голосов
/ 14 октября 2013

Основываясь на ответе на этот похожий вопрос , я реализовал KeyEventDispatcher вместо использования прослушивателей по умолчанию. Я полагаю, что эта функция будет достаточно глобальной, поэтому вам, возможно, придется проверить и убедиться, что нужные вещи видны / сфокусированы.

    KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher( new KeyEventDispatcher() {
      public boolean dispatchKeyEvent(KeyEvent e) {
          if (e.getID() == KeyEvent.KEY_PRESSED) {
              System.out.println("tester");
          }
          return false;
      }
...