JPanel不响应KeyListener事件

时间:2012-07-14 21:01:58

标签: java swing netbeans keylistener

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

扩展的类
public class HelloWorld extends JPanel implements KeyListener

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

如何让它响应按键?

4 个答案:

答案 0 :(得分:16)

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

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();
    }
}

答案 1 :(得分:10)

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

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

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

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

答案 2 :(得分:0)

简单你必须添加

addKeylistener(new HelloWorld());

答案 3 :(得分:0)

将其添加到MyFrame方法中;

this.addKeyListener(helloWorld);