netbeans JPanel不响应KeyListener事件

qvsjd97n  于 2022-11-10  发布在  其他
关注(0)|答案(4)|浏览(149)

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

public class HelloWorld extends JPanel implements KeyListener

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

c2e8gylq

c2e8gylq1#

您是否将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();
    }
}
50pmv0ei

50pmv0ei2#

JPanel默认情况下不是Focusable,即不能响应焦点相关事件,也就是说不能响应keyevent。
我会建议尝试将窗格上的setFocusable设置为true,然后再试一次。确保先单击面板,以确保它接收到焦点。
但是,您会遇到奇怪的焦点遍历问题,因为当用户在表单中导航时,面板现在将接收输入焦点,使焦点看起来像是在某个地方丢失了。
此外,KeyListener在这种情况下往往是不可靠的(由于焦点管理器的工作方式)。

3wabscal

3wabscal3#

简单你必须添加

addKeylistener(new HelloWorld());
66bbxpm5

66bbxpm54#

将其添加到MyFrame方法中;

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

相关问题