单击按钮后keylistener无法正常工作

我有一个keylistener附加到我的框架在java,我可以检测按键时按任何键,但奇怪的事情正在发生。 我的游戏是一个扫雷游戏,我有一个重启按钮,基本上清理板并重新启动它。 奇怪的是,当我用鼠标点击按钮时,一切都清理得很好并且电路板被提醒但是keylistener停止工作。 更奇怪的是,我有一个jmenuitem基本上自动点击按钮。 所以就像restartbutton.doclick()

如果我点击jmenuitem重新启动它重新启动精细清除一切,keylistener仍然起作用。 我甚至可以看到点击按钮。 任何想法为什么会发生这种情况?

谢谢

这是附在我的主框架上。 这是单击按钮后停止工作的监听器。

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){ } }); 

建议:

  • 你的问题是焦点问题,KeyListener停止工作,因为它正在侦听的容器已经失去了对JButton的关注。
  • 一种解决方案是通过在其上调用setFocusable(false)来使JButton无法获得焦点。
  • 但我建议你尽可能不使用KeyListener,而是使用键绑定,因为绑定你没有这个问题,而且它是一个更高级别的构造。

编辑
关于:

什么是将其更改为键绑定的最佳方法?

最好是通过Key Bindings教程并实现那里找到的建议。

这是焦点问题,您可以使用此代码再次获得焦点

getTopLevelAncestor().requestFocus();

根据这个类似问题的答案,我实现了KeyEventDispatcher,而不是使用默认的侦听器。 我相信这个function会相当全球化,所以你可能需要检查并确保正确的东西是可见的/集中的。

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

我能够通过将容器的setFocused属性设置为true来解决此问题:

 frame.setFocusable(true);