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 所说,您实际上在这里有一个 JPanel
、PlayGame
实例,但是 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
我正在尝试重新制作 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 所说,您实际上在这里有一个 JPanel
、PlayGame
实例,但是 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