这是(简化的)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没有获得输入焦点?有什么方法可以迫使他们去吗?
答案 0 :(得分:2)
默认情况下,组件不可聚焦。所以你需要:
setFocusable( true );
在构造函数中。其他方法requestFocusInWindow()
仅适用于可见JFrame上的可见组件。从构造函数调用该方法将不执行任何操作。
与repaint()方法相同。该组件尚未可见,因此构造函数中不需要该语句。
没有生成任何KeyEvent。
您不应该使用KeyListener来侦听KeyEvents。相反,您应该使用Key Bindings。即使组件没有焦点,Key Bindings
也会有效。