java repaint()和初始化对象

java repaint()和初始化对象,java,object,animation,paint,instantiation,Java,Object,Animation,Paint,Instantiation,我有一个类,应该使用paintComponent和repaint()模拟烟花动画。我检测到的问题是“烟花”是新初始化的 每次调用该方法时,烟花的ProjectleTime字段都会重置为零(如构造函数中指定的)。哪里是实例化焰火对象的适当位置,以便适当增加ProjectleTime字段?(在本班或另一班) 见代码: public class FireworkComponent extends JComponent { private static final long serialVersion

我有一个类,应该使用paintComponent和repaint()模拟烟花动画。我检测到的问题是“烟花”是新初始化的 每次调用该方法时,烟花的ProjectleTime字段都会重置为零(如构造函数中指定的)。哪里是实例化焰火对象的适当位置,以便适当增加ProjectleTime字段?(在本班或另一班) 见代码:

public class FireworkComponent extends JComponent {

private static final long serialVersionUID = 6733926341300224321L;
private double time;

public FireworkComponent(){
time=0;
}
@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);

    g.translate(0, this.getHeight());

    Firework f= new Firework(this.getWidth()/2,0,73,90,Color.red,5);
    f.addFirework(75,35,Color.BLUE,6);
    f.addFirework(75, 155, Color.green, 6);

    time+=.1;

    Point point=f.addTime(.1);
    g.fillOval(point.x, (-point.y),15,15);

    try{
        Thread.sleep(500);
        System.out.println("sleep");
    }
    catch (InterruptedException e){
        e.printStackTrace();
    }

    this.repaint();
}
}

首先,从paintComponent()方法中去掉Thread.sleep()

然后,您需要定义随时间变化的焰火组件的属性


最后,您将使用Swing计时器来安排焰火的动画。每次计时器启动时,您都会更新组件属性,然后对组件调用repaint()

首先从paintComponent()方法中去掉Thread.sleep()

然后,您需要定义随时间变化的焰火组件的属性

最后,您将使用Swing计时器来安排焰火的动画。每次计时器启动时,您都会更新组件属性,然后对组件调用repaint()

  • 不要添加
    Firework f=新的烟花(this.getWidth()/2,0,73,90,Color.red,5)内部绘制图形2D,您必须在

  • 不要使用
    Thread.sleep(int)延迟绘制,对于Graphics2D,存在
    javax.swing.Timer
    ,但您必须使用计时器初始化
    paintComponent()
    ,而不是停止在油漆主体内部涂漆

  • 不确定是否以某种方式工作
    Point=f.addTime(.1)

编辑

有动画吗

  • 不要添加
    Firework f=新的烟花(this.getWidth()/2,0,73,90,Color.red,5)内部绘制图形2D,您必须在

  • 不要使用
    Thread.sleep(int)延迟绘制,对于Graphics2D,存在
    javax.swing.Timer
    ,但您必须使用计时器初始化
    paintComponent()
    ,而不是停止在油漆主体内部涂漆

  • 不确定是否以某种方式工作
    Point=f.addTime(.1)

编辑


对于动画,将
烟花
存储为类级属性,并在
烟花组件
构造函数中实例化。

烟花
存储为类级属性,并在
烟花组件
构造函数中实例化。

在我看来,代码不会编译。请考虑在将来发布一个,并且请使用常见的缩进代码形式,而不是MISH MASH。不要用一个用于绘制GUI的方法调用<代码>睡眠()/代码>!相反,创建一个Swing
计时器,定期调用
repaint()
。不要在主Swing线程、EDT上调用
Thread.sleep(…)
,也不要在paint或paintComponent中调用
Thread.sleep(…)
,除非您希望图形完全停止。编辑:太晚了!在我看来,代码似乎无法编译。请考虑在将来发布一个,并且请使用常见的缩进代码形式,而不是MISH MASH。不要用一个用于绘制GUI的方法调用<代码>睡眠()/代码>!相反,创建一个Swing
计时器,定期调用
repaint()
。不要在主Swing线程、EDT上调用
Thread.sleep(…)
,也不要在paint或paintComponent中调用
Thread.sleep(…)
,除非您希望图形完全停止。编辑:太晚了!当你说“prepare before”时,你的意思是在另一个类中还是在这个类的构造函数中?@trs请看我的编辑,这将是基础,准备好的对象通过使用javax.swing.Timer在屏幕上移动,带着它,否则你的动画将冻结或挂在屏幕上“在另一个类中还是在这个类的构造函数中?”两者都可以,重要的是不要用循环的方法(比如
paintComponent()
)再次创建它们。当你说“prepare before”是指在另一个类中还是在这个类的构造函数中?@trs请看我的编辑,这将是基础,准备好的对象通过javax.swing.Timer在屏幕上移动,如果不这样做,你的动画将被冻结或挂在屏幕上“在另一个类中或在这个类的构造函数中”,这两种方法都可以工作,重要的是不要再次创建它们&再次使用循环的方法(如
paintComponent()
)。