Java KeyListener不在JPanel中工作?
我试图在java类中使用KeyListener,但由于某些奇怪的原因,它不接受输入。我最近遇到了这个问题,在它完美运行之前,有些东西改变了,现在它不接受任何输入。以下是我的代码摘录:Java KeyListener不在JPanel中工作?,java,keylistener,Java,Keylistener,我试图在java类中使用KeyListener,但由于某些奇怪的原因,它不接受输入。我最近遇到了这个问题,在它完美运行之前,有些东西改变了,现在它不接受任何输入。以下是我的代码摘录: public class SquarePanel extends JPanel implements Runnable, KeyListener, MouseListener ... public SquarePanel { this.setFocusable(true); this.request
public class SquarePanel extends JPanel implements Runnable, KeyListener, MouseListener
...
public SquarePanel {
this.setFocusable(true);
this.requestFocusInWindow();
addKeyListener(this);
然后,我继续按下override键:
@Override
public void keyPressed(KeyEvent e)
{
System.out.println("SOMETHING");
}
但什么也没发生。我做错什么了吗
(旁注:我认为我的程序没有收到焦点,这就是问题所在,因为当我使用isFocusOwner()
时,它显示为false。如果是这种情况,我该如何修复它?)
我认为我的程序没有得到关注,这就是问题所在
这是KeyListener不工作时的常见问题
this.requestFocusInWindow();
上述语句仅在GUI当前可见时有效。由于您正在面板构造函数中执行该语句,因此它将无效。组件必须显示在可见的GUI上,以便组件请求焦点
您必须在GUI可见后请求焦点
或者,另一种选择是使用
你为什么要用键盘监听器?Swing被设计为与一起使用。可能是因为您在构造函数中请求焦点,而这是在它实际添加到任何窗口之前。检查
requestFocusInWindow()
的返回值,看看它是否成功。我不相信是这种情况,因为我在this.setFocusable
之前添加了System.out.println(this.isVisible())
,并输出了true。另外,我没有使用键绑定,因为我没有受过教育:p谢谢你的帮助link@aprogrammer,我说GUI,而不是面板,必须是可见的。默认情况下,所有swing组件都是可见的,除了像JFrame、JDialog、JWindow这样的顶级容器。好吧,我尝试了键绑定,这就是我在构造函数中放入的内容:AbstractAction test=new AbstractAction(){public void actionPerformed(ActionEvent e){System.out.println(“它起作用了!”;};getInputMap().put(KeyStroke.getKeyStroke(“I”),“test”);getActionMap().put(“test”,test)代码>并且什么也没有发生面板仍然没有焦点(除非你像我上面建议的那样修复了问题)。您使用了错误的InputMap。默认的InputMap用于组件具有焦点时。您需要使用另外两个InputMap中的一个。如果其他两个InputMap都不工作,那么您需要确保面板具有焦点,因为您可能没有向面板添加任何子组件,在这种情况下,您可以返回使用默认InputMap。我不能给出确切的答案,因为我没有关于您的GUI外观的详细信息。