Repaint() 不调用 paintComponent() Java

Repaint() not calling paintComponent() Java

我正在尝试重新制作 Snake 以改进我的编程,几个小时以来我一直在阅读其他人遇到同样问题的信息,但是 none 他们中的一些人似乎与我自己的代码相似。这是我的相关代码:

package snake;

import java.awt.*;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class PlayGame extends JPanel implements Runnable{
    private JFrame jfr;
    private JPanel jpn;

    PickupBall b = new PickupBall();
    Snake bob = new Snake();

    public PlayGame(){
        jfr = new JFrame("Snake");            
        jfr.setSize(640,640);
        jfr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        jpn = new JPanel();
        jpn.setBackground(Color.WHITE);

        jfr.add(jpn);            
        jfr.setVisible(true);             
    }

    @Override
    public void run(){            
        while(true){                
            repaint();
        }
    }        

    @Override
    public void paintComponent(Graphics g){            
        super.paintComponent(g);            
        b.draw(g);
    }        

    public static void main(String[] args) {            
        PlayGame p = new PlayGame();  
        Thread t = new Thread(p);

        t.start();           

    }


 }

一切正常,while(true) 循环启动,但没有任何反应。

package snake;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;

public class PickupBall {
//constructor
public PickupBall(){
    xPos = (int) (((Math.random()*31)+1)*20);
    yPos = (int) (((Math.random()*31)+1)*20);        
}
//constants
public final int balletjeSides = 20;

//variables
public int xPos;
public int yPos;
//methods
public void draw(Graphics g){
    g.setColor(Color.RED);
    g.fillRoundRect(this.xPos, this.yPos, balletjeSides, balletjeSides, 5, 5);
}

}

我错过了什么?

只需在您的 onstructor 中添加 jfr.setContentPane(this);,正如@Berger 所说,您实际上在这里有一个 JPanelPlayGame 实例,但是 JFrame 你正在创建不使用这个 JPanel 实例,而是简单地添加一个空的 JPanel,在你的代码中称为 jpn,你的 jfr有什么内容。

新的 constructor 可能如下所示:

private JFrame jfr;
//private JPanel jpn;

PickupBall b = new PickupBall();
//Snake bob = new Snake();

public PlayGame() {
    jfr = new JFrame("Snake");
    jfr.setSize(640, 640);
    jfr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //jpn = new JPanel();
    this.setBackground(Color.WHITE);

    //jfr.add(jpn);
    jfr.setContentPane(this);
    jfr.setVisible(true);
}

如您所见,我注释掉了 jpn 变量,因为您想要使用的实际 JPanel(我的猜测)是 PlayGame class 本身,而不是在此 class.

中定义的 JPanel