无法在JFrame中获取输入焦点

时间:2016-10-31 20:11:50

标签: 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.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);
  }

}

我遇到了让关键事件发挥作用的问题,并意识到我的面板没有开始输入焦点,因此没有生成任何KeyEvent。

我已尝试过grabFocus(),requestFocusInWindow(),requestFocus()等,但hasFocus()始终返回false。

为什么我的JPanels没有获得输入焦点?有什么方法可以迫使他们去吗?

1 个答案:

答案 0 :(得分:2)

默认情况下,组件不可聚焦。所以你需要:

setFocusable( true );

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

与repaint()方法相同。该组件尚未可见,因此构造函数中不需要该语句。

  

没有生成任何KeyEvent。

您不应该使用KeyListener来侦听KeyEvents。相反,您应该使用Key Bindings。即使组件没有焦点,Key Bindings也会有效。