java中给Jpanel添加键盘监听事件后,发现监听事件无效,找到一个解决办法,先点击tab键,之后你就会发现键盘能够监听了。(但是不知道为什么,先记录下来)
测试了一下,鼠标监听时,不会发生这种错误。
public class GamePane extends JPanel {
int length;
int[] snakex=new int[600];
int[] snakey=new int[600];
String fx;
boolean state=false;
public GamePane() {
init();
//获得焦点何键盘事件
setVisible(true);
this.setFocusable(true);//获得焦点事件
this.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
state=!state;
repaint();
}
});
this.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if(keyCode==KeyEvent.VK_UP){
state=!state;
System.out.println("改变");
repaint();
}
}
});
// this.addKeyListener(new MouseAdapter() {
// @Override
// public void mousePressed(MouseEvent e) {
// super.mousePressed(e);
// }
// // @Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
System.out.println(keyCode);
if(keyCode==KeyEvent.VK_UP){
state=!state;
System.out.println("改变");
repaint();
}
}
// });//获得键盘监听事件
}
public void init(){
length=3;
snakex[0]=100;snakey[0]=100;
snakex[1]=75;snakey[1]=100;
snakex[2]=50;snakey[2]=100;
fx="you";
}
//绘制面板,游戏中的所有东西,都用这个g来画
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);//这里的super是有作用的,起到一个清屏的作用
this.setBackground(Color.WHITE);
Data.guanggao.paintIcon(this,g,15,15);
g.fillRect(15,100,600,500);
//画蛇
if(fx.equals("you")) {
Data.head.paintIcon(this, g, snakex[0], snakey[0]);
}
// }else{
// 如果不同方向的头不一样,这里就可以设置
// }
for(int i=1;i<length;i++){
Data.body.paintIcon(this,g,snakex[i],snakey[i]);
}
if(state==false){
g.setColor(Color.RED);
g.setFont(new Font("黑体",Font.BOLD,40));
g.drawString("点击空格进行开始游戏",100,100);
}
// else {
// g.setColor(Color.BLACK);
// g.setFont(new Font("黑体",Font.BOLD,40));
// g.drawString("点击空格进行开始游戏",100,100);
// System.out.println(12);
// }
}
}