Java 无法在JFrame中获取输入焦点

Java 无法在JFrame中获取输入焦点,java,swing,jpanel,focus,Java,Swing,Jpanel,Focus,以下是(简化的)JPanel类: import java.awt.Graphics; import javax.swing.JPanel; @SuppressWarnings("serial") public class Preface extends JPanel{ public Preface(){ this.addKeyListener(new Controls()); this.requestFocusInWindow(); System.out.pr

以下是(简化的)JPanel类:

import java.awt.Graphics;
import javax.swing.JPanel;


@SuppressWarnings("serial")
public class Preface extends JPanel{


  public Preface(){
    this.addKeyListener(new Controls());
    this.requestFocusInWindow();
    System.out.println(this.hasFocus());//false
    this.repaint();
  }

  public void paintComponent(Graphics g){
    super.paintComponent(g); 

    g.drawImage(Tetris.getTexture("PrefacePoster.jpg"), 0, 0, 420, 556, null);
  }

}
我在让关键事件正常工作时遇到了问题,并意识到我的面板一开始没有获得输入焦点,因此没有生成任何关键事件

我尝试过grabFocus()、requestFocusInWindow()、requestFocus()等,但是hasFocus()总是返回false


为什么我的JPanel没有获得输入焦点?有什么办法可以强迫他们吗?

默认情况下,组件不可聚焦。因此,您需要:

setFocusable( true );
在构造函数中。其他方法
requestFocusInWindow()
仅适用于可见JFrame上的可见组件。从构造函数调用该方法将不会起任何作用

repaint()方法也是如此。组件还不可见,因此构造函数中不需要该语句

不生成任何关键事件


您不应该使用KeyListener来侦听KeyEvents。相反,您应该使用<代码>键绑定将工作,即使组件没有焦点。

默认情况下,组件不可聚焦。因此,您需要:

setFocusable( true );
在构造函数中。其他方法
requestFocusInWindow()
仅适用于可见JFrame上的可见组件。从构造函数调用该方法将不会起任何作用

repaint()方法也是如此。组件还不可见,因此构造函数中不需要该语句

不生成任何关键事件


您不应该使用KeyListener来侦听KeyEvents。相反,您应该使用<代码>键绑定即使组件没有焦点也可以工作。

谢谢,这就解决了问题。我将requestFocusInWindow()移出构造函数,并添加了对setFocusable()的调用。就键绑定而言,我实际上已经尝试过这些方法来解决同样的问题,但没有成功。再次感谢。谢谢,这解决了问题。我将requestFocusInWindow()移出构造函数,并添加了对setFocusable()的调用。就键绑定而言,我实际上已经尝试过这些方法来解决同样的问题,但没有成功。再次感谢。