JPanel 不响应 KeyListener 事件



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

public class HelloWorld extends JPanel implements KeyListener

我在帧app.add(helloWorld);中添加了一个对象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默认情况下不可聚焦。也就是说,它不能响应与焦点相关的事件,这意味着它不能响应关键事件。

我建议尝试将窗格上的Focusable设置为true,然后重试。请确保首先单击面板以确保其获得焦点。

不过,要明白,你会遇到奇怪的焦点遍历问题,因为当用户浏览表单时,面板现在将接收输入焦点,这使得焦点似乎在某个地方丢失了。

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

简单地说,你必须添加

addKeylistener(new HelloWorld());

将其添加到MyFrame方法中;

HelloWorld() helloWorld = new HelloWorld();
this.addKeyListener(helloWorld);