我在下面的这个主类创建了一个简单的JFrame和一个名为Screen的JPanel类的扩展,它是一个实现KeyListener的私有内部类。我有屏幕的构造函数将KeyListener添加到对象,并将自身作为参数。无论我尝试什么,它都会在我给它输入时拒绝调用KeyListener方法。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Main{
private JFrame window;
private Screen screen;
public static void main(String[] args){
Main driver = new Main();
}
public Main(){
window = new JFrame();
screen = new Screen();
window.add(screen);
window.setSize(500, 500);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setVisible(true);
}
private class Screen extends JPanel implements KeyListener{
public Screen(){
this.addKeyListener(this);
}
public void keyPressed(KeyEvent e) {
System.out.println("input received");
}
public void keyReleased(KeyEvent e) {
System.out.println("input received");
}
public void keyTyped(KeyEvent e){
}
}
}
感谢任何反馈。
答案 0 :(得分:2)
是的,这是一个非常常见的问题,它围绕着KeyListener
的工作原理。
KeyListener
仅在注册的组件具有焦点并且具有键盘焦点时才生成键事件。在比赛之前尝试使JPanel
具有可调焦性,这只会导致它看似随机工作,您应该使用Key Bindings API来代替,这是为了帮助解决这个问题({{1} }})