Repaint()不调用paintComponent()Java
我正试图改造Snake来改进我的编程,我已经读了好几个小时了,其他人也有同样的问题,但他们似乎都和我自己的代码不一样。这是我的相关代码:Repaint()不调用paintComponent()Java,java,paintcomponent,repaint,Java,Paintcomponent,Repaint,我正试图改造Snake来改进我的编程,我已经读了好几个小时了,其他人也有同样的问题,但他们似乎都和我自己的代码不一样。这是我的相关代码: package snake; import java.awt.*; import javax.swing.JFrame; import javax.swing.JPanel; public class PlayGame extends JPanel implements Runnable{ private JFrame jfr; priva
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);
}
}
我缺少什么?只需添加
jfr.setContentPane(这个)在你的onstructor
中,正如@Berger所说,你实际上有一个JPanel
,PlayGame
实例,但是你正在创建的JFrame
并不使用这个JPanel
实例,而是简单地在你的代码中添加一个名为jpn
的空JPanel
,您的jfr
没有任何内容
新的构造函数可以如下所示:
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
类本身,而不是该类中定义的JPanel
。您的PlayGame
实例从未显示在代码中,所以它的画显然是看不见的。哦,哇,我不敢相信我的脑袋没有把“扩展JPanel”和我的类获得JPanel的功能联系起来。谢谢