JPanel 不响应 KeyListener 事件

问题描述 投票:0回答:5

我有一个

JFrame
的子类,它使用从
JPanel

扩展的类
public class HelloWorld extends JPanel implements KeyListener

我将

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

如何让它响应按键?

java swing netbeans keylistener
5个回答
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();
    }
}

12
投票

JPanel 默认情况下不可聚焦。 也就是说,它无法响应焦点相关事件,也就是说它无法响应按键事件。

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

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

此外,在这种情况下,

KeyListener
往往不可靠(由于焦点管理器的工作方式)。


1
投票

简单你必须添加

addKeylistener(new HelloWorld());

1
投票

将其添加到 MyFrame 方法中;

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

0
投票

首先,将

window.setVisible(true);
放在与窗口相关的所有其他代码的末尾总是一个好主意。

除此之外,要解决您的问题,您只需在 GamePanel 类中添加

setFocusable(true);
(您可以将其放置在
this.setPreferredSize(new Dimension(500, 500));
行上方。

© www.soinside.com 2019 - 2024. All rights reserved.