9

我有一个JFrame使用扩展自的类的子类JPanel

public class HelloWorld extends JPanel implements KeyListener

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

我怎样才能让它响应按键?

4

4 回答 4

19

您是否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();
    }
}
于 2012-07-14T21:31:22.693 回答
12

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

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

但是请理解,您会遇到奇怪的焦点遍历问题,因为面板现在将在用户浏览您的表单时接收输入焦点,使得焦点似乎在某些地方丢失了。

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

于 2012-07-14T21:17:39.283 回答
1

很简单,你必须添加

addKeylistener(new HelloWorld());
于 2014-02-18T09:57:23.960 回答
1

在 MyFrame 方法中添加它;

this.addKeyListener(helloWorld);
于 2020-07-17T22:11:36.253 回答