单击按钮后keylistener不起作用
Posted
技术标签:
【中文标题】单击按钮后keylistener不起作用【英文标题】:keylistener not working after clicking button 【发布时间】: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。在那里你会看到它必须是一个焦点问题。您收听的容器必须具有焦点,否则关键侦听器将不起作用。期间。 【参考方案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);
【讨论】:
以上是关于单击按钮后keylistener不起作用的主要内容,如果未能解决你的问题,请参考以下文章
带有 keylisteners 的 Java swing gui 程序在 linux 中不起作用