Java KeyListener不在JPanel中工作?

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

我试图在java类中使用KeyListener,但由于某些奇怪的原因,它不接受输入。我最近遇到了这个问题,在它完美运行之前,有些东西改变了,现在它不接受任何输入。以下是我的代码摘录:

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外观的详细信息。