我有一个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);