【问题标题】:keylistener not working after clicking button单击按钮后keylistener不起作用
【发布时间】:2011-12-25 20:03:39
【问题描述】:

我在 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){


       }

       });

【问题讨论】:

  • 如何添加动作监听器?你能发布一些代码吗?听起来您的重置方法正在重置附加了动作侦听器的项目,但很难说。
  • 不,是专注,纯粹而简单。
  • 框架在工作时没有焦点,所以我不明白它是如何成为焦点的。
  • @user541597:请参阅 KeyListener 教程和 API。在那里你会看到它必须是一个焦点问题。您收听的容器必须具有焦点,否则关键侦听器将不起作用。期间。

标签: java swing keylistener


【解决方案1】:

建议:

  • 您的问题是焦点问题,KeyListener 停止工作,因为它正在侦听的容器失去了对 JButton 的焦点。
  • 一种解决方案是通过调用 setFocusable(false) 使 JButton 无法获得焦点。
  • 但我建议您尽可能不要使用 KeyListener,而应使用键绑定,因为使用绑定不会出现此问题,而且它是更高级别的构造。

编辑
关于:

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

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

【讨论】:

  • 附加的是我的关键侦听器代码将其更改为键绑定的最佳方法是什么?
  • 即使你使用键绑定,你仍然必须使 jbuttons 不可聚焦,即使使用somerootcomponent.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
【解决方案2】:

这是焦点问题,你可以用这段代码重新给焦点

getTopLevelAncestor().requestFocus();

【讨论】:

    【解决方案3】:

    根据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;
          }
    

    【讨论】:

      【解决方案4】:

      我可以通过将容器的setFocused 属性设置为true 来解决这个问题:

      frame.setFocusable(true);
      

      【讨论】:

        猜你喜欢
        • 2015-07-23
        • 2021-02-08
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        • 2018-05-02
        相关资源
        最近更新 更多