java中给Jpanel添加键盘监听事件时,发现监听事件无效,一个解决方法

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);
//        }
    }
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值