我试图重拍Snake来改进我的编程,我一直在阅读其他人有几个小时相同的问题,但似乎没有一个类似于我自己的代码。这是我的相关代码:
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);
}
}
我错过了什么?
答案 0 :(得分:0)
只需在jfr.setContentPane(this);
中添加onstructor
,就像@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
类本身,而不是在此课程中定义JPanel
。