Repaint()不调用paintComponent()Java

时间:2017-04-20 10:02:35

标签: 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;
    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);
}

}

我错过了什么?

1 个答案:

答案 0 :(得分:0)

只需在jfr.setContentPane(this);中添加onstructor,就像@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类本身,而不是在此课程中定义JPanel

相关问题