当我调用repaint()方法时,屏幕上没有显示任何内容

时间:2014-04-05 16:49:06

标签: java swing arraylist paintcomponent repaint

这可能是一个常见的问题,但可能在每种情况下都是独一无二的。

这是我在代码中调用.repaint()的地方:

timer = new Timer(5, new ActionListener() {
        double t = 0;
        public void actionPerformed(ActionEvent e) {

            ArrayList<Particle> fireworks = manager.getFireworks(t/1000);
            showFireworks(fireworks,t/1000);
            t = t + timer.getDelay();
            for (Particle projectile : fireworks) {
                canvas = new FireworksDisplay(projectile);
                canvas.repaint();
                add(canvas);
            }
        }
    });

它正在创建一个烟花粒子的ArrayList(它正常工作,因为我测试了在控制台窗口中打印(x,y)位置并且它很好)。 我希望我的程序在屏幕上为我的ArrayList列表的每个成员绘制一些小粒子

这是我的DrawPanel

    private class FireworksDisplay extends JPanel {
    private Color colour;
    private int xPos;
    private int yPos;
    private int size;
    public FireworksDisplay(Particle particle) {
        super();
        String string = particle.getColour();
        string = string.toLowerCase();
        switch(string) {
        case "blue":    this.colour = Color.blue;
                        break;
        case "red":     this.colour = Color.red;
                        break;
        case "green":   this.colour = Color.green;
                        break;
        case "orange":  this.colour = Color.orange;
                        break;
        case "cyan":    this.colour = Color.cyan;
                        break;
        case "magenta": this.colour = Color.magenta;
                        break;
        case "yellow":  this.colour = Color.yellow;
                        break;
        case "pink":    this.colour = Color.pink;
                        break;
        default:        this.colour = Color.white;
                        break;
        }
        double[] positions = particle.getPosition();
        this.xPos = (int) (getWidth()*positions[0]*(50) + tubeImage.getSize().width/2);
        this.yPos = (int) (getHeight()*positions[1]*(50) + tubeImage.getSize().height - 100);

        this.size = particle.getRenderSize();

    }
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(colour);
        g.fillOval(xPos, yPos, size, size);
    }
}

出于某种原因,即使我画的所有其他时间都成功,它也不会在画面上画画。

我发布的代码中是否存在问题,或者您认为其他地方出现了问题?

1 个答案:

答案 0 :(得分:1)

请记住,您需要在实例化后调用Timer的{​​{1}}方法。

此外,每次start()触发时,您都会添加新的JPanel。您可能希望重写代码,以便简单地绘制新的Timer