Java 单击按钮后keylistener不工作

Java 单击按钮后keylistener不工作,java,swing,keylistener,Java,Swing,Keylistener,我有一个键监听器连接到我的java框架上,当我按下任何键时,我都能检测到按键,然而一件奇怪的事情正在发生。我的游戏是一个扫雷游戏,我有一个重启按钮,基本上可以清除棋盘并重新混音。奇怪的是,当我用鼠标点击按钮时,一切都很好地清除了,电路板被重新调整,但键盘监听器停止工作。更奇怪的是,我有一个jmenuitem,它基本上可以自动点击按钮。所以它就像restartbutton.doclick() 如果我单击jmenuitem重新启动,它将重新启动并清除所有内容,并且keylistener仍能正常工作。

我有一个键监听器连接到我的java框架上,当我按下任何键时,我都能检测到按键,然而一件奇怪的事情正在发生。我的游戏是一个扫雷游戏,我有一个重启按钮,基本上可以清除棋盘并重新混音。奇怪的是,当我用鼠标点击按钮时,一切都很好地清除了,电路板被重新调整,但键盘监听器停止工作。更奇怪的是,我有一个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的焦点
  • 一种解决方案是通过对JButton调用
    setFocusable(false)
    使其无法获得焦点
  • 但我建议您尽可能不要使用KeyListener,而是使用键绑定,因为绑定没有这个问题,而且它是一个更高级别的构造
编辑
关于:

将其更改为密钥绑定的最佳方式是什么


最好的方法是浏览并实施在那里找到的建议。

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

getTopLevel祖先().requestFocus()

基于对的回答,我实现了KeyEventDispatcher,而不是使用默认侦听器。我相信这个功能将是相当全球性的,所以你可能需要检查并确保正确的东西是可见的/集中的

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

如何添加动作侦听器?你能发一些代码吗?听起来你的重置方法是重置附加了动作侦听器的项,但很难说。不,它是焦点,纯粹而简单。框架工作时没有焦点,所以我不明白它如何成为焦点。@user541597:请参阅KeyListener教程和API。在这里,你会发现这是一个焦点问题。您的侦听容器必须具有焦点,否则密钥侦听器将无法工作。Period.attached是我的密钥侦听器代码,将其更改为密钥绑定的最佳方式是什么?即使使用密钥绑定,也必须使jbuttons不可聚焦,即使使用
somerootcomponent.getInputMap(JComponent.when_IN_FOCUSED_WINDOW)