java贪吃蛇小游戏中有个repaint()方法没有调用paintComponent()方法

java中的repaint()的方法没有调用paintComponent方法,测了一下其他都正常,就是真的没有调用,我是java初学者,找了个贪吃蛇游戏准备写写的,结果卡这里卡了几个小时了,求解

这是启动类

package Demo;

import javax.swing.*;

public class MySnake {
    public static void main(String[] args) {
        JFrame jFrame = new JFrame();
        //界面位置
        jFrame.setBounds(700,100 ,700,900);
        jFrame.add(new MyPanel() );
        //设置不允许拖拽+
        jFrame.setResizable(false);//为啥还是能拖拽
        jFrame.add(new MyPanel());

        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //显示
        jFrame.setVisible(true);

    }
}


这个是出问题的类

package Demo;

import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.*;

public class MyPanel extends JPanel implements KeyListener {
    int len;
    ImageIcon right ;
    ImageIcon body ;
    ImageIcon left;
    ImageIcon top;
    ImageIcon down;


    int [] snakeX ;//蛇的容器x坐标和y坐标
    int [] snakeY ;
    boolean isStart = false;
    public MyPanel() {
        //以下为图片的绝对路径
        String pathRight = Thread.currentThread().getContextClassLoader().
                getResource("picture/right.png").getPath();
        String pathBody = Thread.currentThread().getContextClassLoader().
                getResource("picture/body.png").getPath();
        String pathLeft = Thread.currentThread().getContextClassLoader().
                getResource("picture/left.png").getPath();
        String pathTop = Thread.currentThread().getContextClassLoader().
                getResource("picture/top.png").getPath();
        String pathDown = Thread.currentThread().getContextClassLoader().
                getResource("picture/bottom.png").getPath();

        this.right = new ImageIcon(pathRight);
        this.body = new ImageIcon(pathBody);
        this.left = new ImageIcon(pathLeft);
        this.top = new ImageIcon(pathTop);
        this.down = new ImageIcon(pathDown);

        len = 3;//蛇的初始长度为3
       snakeX = new int[1008];
       snakeY = new int[1008];
       snakeX[0] = 100;
       snakeY[0] = 100;
       snakeX[1] = 75;
       snakeY[1] = 100;
       snakeX[2] = 50;
       snakeY[2] = 100;
       this.setFocusable(true);//键盘事件
       this.addKeyListener(this);//用来监听键盘事件
    }

    @Override
    protected void paintComponent(Graphics g) {

        super.paintComponent(g);
        System.out.println("ssss");
        this.setBackground(Color.red);
        g.fillRect(0,0,700,900);
        //利用枚举类型来控制蛇头方向
            //right.paintIcon(this,g,snakeX[0],snakeY[0]);
        Direction direction = Direction.LEFT;
        switch (direction) {
            case TOP:
                top.paintIcon(this,g,snakeX[0],snakeY[0]);
                break;
            case DOWN:
                down.paintIcon(this,g,snakeX[0],snakeY[0]);
                break;
            case LEFT:
                left.paintIcon(this,g,snakeX[0],snakeY[0]);
                break;
            case RIGHT:
                right.paintIcon(this,g,snakeX[0],snakeY[0]);
                break;
        }

        for (int i = 1; i < len; i++) {
            body.paintIcon(this,g,snakeX[i],snakeY[i]);


        }


       if(!isStart) {
           //设置画笔颜色
           g.setColor(Color.white);
           //设置字体
           Font f = new Font("华文行楷",Font.BOLD,50);
           g.setFont(f);
           //输出提示信息
           g.drawString("请按空格键表示开始游戏!",50,450);
       }
        System.out.println("=========================");


    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();
        if (keyCode == 32) {
         isStart = !isStart;
         this.repaint();
        }
        System.out.println(isStart);
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }
}


原因是你在MySnake中add了两次MyPanel。把你后面那个add去掉就好了

  • 这篇博客: 利用Java的事件驱动程序做的一些习题(一)中的 paintComponent方法的实现 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  •  protected void paintComponent(Graphics g) {
            super.paintComponent(g);
                if(i%2==0){
                    g.drawString(message1,getWidth()/2,getHeight()/2);
                }
                else{
                    g.drawString(message2,getWidth()/2,getHeight()/2);
                }
            }

    因为paintComponent方法写在内部类里面,所以是共享私有成员变量的,每次点击,i自增,paintComponent方法利用取余的方式,自动切换所绘制的字符串。

    因为希望在屏幕上绘制字符串,所以内部类继承了JPanel

     static class ChangeMessage extends JPanel{}.....

    完成以上工作后,在主类里面对这个内部类进行实例化,增加到frame里面即可。

你的问题是paintCompont方法中的打印没有被执行还是其他什么问题