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

时间:2011-11-10 02:29:06

标签: java swing keylistener

我在java中有一个keylistener附加到我的框架,当我按任意键时我可以检测到按键,但是发生了一件奇怪的事情。我的游戏是一个扫雷游戏,我有一个重启按钮,基本上清理板并重新调整它。奇怪的是,当我用鼠标点击按钮时,一切都清晰,并且电路板被重新启动但是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){


       }

       });

4 个答案:

答案 0 :(得分:12)

建议:

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

修改
关于:

  

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

最好是通过Key Bindings tutorial并实施在那里找到的建议。

答案 1 :(得分:1)

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

getTopLevelAncestor().requestFocus();

答案 2 :(得分:0)

根据this similar question的答案,我实现了KeyEventDispatcher,而不是使用默认的侦听器。我相信这个功能相当全球化,所以你可能需要检查并确保正确的东西是可见的/专注的。

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

答案 3 :(得分:0)

I was able to solve this problem by setting the setFocused property of the container to be true:

frame.setFocusable(true);