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