JPanel不响应KeyListener事件

我有一个JFrame的子类,它使用从JPanel扩展的类

 public class HelloWorld extends JPanel implements KeyListener 

我在框架中添加了一个HelloWorld对象 – app.add(helloWorld); 。 现在,当我按下任何键盘键时,不会调用KeyListener方法,并且似乎helloWorld没有窗口焦点。 我也尝试过调用helloWorld.requestFocusInWindow(); 但仍然没有回应。

如何使其响应按键?

您是否设置了HelloWorld面板的KeyListener是该面板本身? 此外,您可能需要将该面板设置为可聚焦。 我通过这段代码对它进行了测试,它似乎可以正常工作

 class HelloWorld extends JPanel implements KeyListener{ public void keyTyped(KeyEvent e) { System.out.println("keyTyped: "+e); } public void keyPressed(KeyEvent e) { System.out.println("keyPressed: "+e); } public void keyReleased(KeyEvent e) { System.out.println("keyReleased: "+e); } } class MyFrame extends JFrame { public MyFrame() { setDefaultCloseOperation(EXIT_ON_CLOSE); setSize(200,200); HelloWorld helloWorld=new HelloWorld(); helloWorld.addKeyListener(helloWorld); helloWorld.setFocusable(true); add(helloWorld); setVisible(true); } public static void main(String[] args) { new MyFrame(); } } 

默认情况下,JPanel不可聚焦。 也就是说,它无法响应与焦点相关的事件,这意味着它无法响应关键事件。

我建议尝试将窗格上的setFocusable设置为true并再次尝试。 确保首先单击面板以确保它获得焦点。

但是要明白,你会得到奇怪的焦点遍历问题,因为当用户浏览你的表单时,面板现在会收到输入焦点,使得焦点在某些地方似乎已经丢失了。

此外, KeyListener在这种情况下往往不可靠(由于焦点管理器的工作方式)。

简单你必须添加

 addKeylistener(new HelloWorld());