Java 使用Swing动画计时
我在摇摆和设置角色动画方面有一些问题, 我有一个带有键侦听器的JFrame,当用户按下时,它在这里调用我的JPanel方法Java 使用Swing动画计时,java,swing,animation,timer,Java,Swing,Animation,Timer,我在摇摆和设置角色动画方面有一些问题, 我有一个带有键侦听器的JFrame,当用户按下时,它在这里调用我的JPanel方法 for(int i=1;i<4;i++) { pY+=16; g.drawImage(perso,pX,pY,pX+50,pY+50,0+50*i,0,50+50*i,50,this this.repaint(); } 对于(int i=1;i您可以使用摆动计时器并定期更新动画。请参阅
for(int i=1;i<4;i++)
{
pY+=16;
g.drawImage(perso,pX,pY,pX+50,pY+50,0+50*i,0,50+50*i,50,this
this.repaint();
}
对于(int i=1;i您可以使用摆动计时器并定期更新动画。请参阅
不要扩展JFrame
,创建JFrame
作为局部变量
不要使用keylister
,而是使用KeyBindings
不要直接绘制到JFrame
,使用drawImage()
绘制到JLabel
或JComponent/JPanel
这动画我的角色,但如此之快,我们可以看到一个东西,我怎么做,以查看动画
另一个关于KeyListener
的问题是,您必须设置两个KeyEvents
之间的延迟。Jonas已经给出了答案(使用摆动计时器),但是解释为什么您没有看到动画,以及为什么计时器是解决此问题的最佳解决方案,可能会很有用
为什么我看不到不同的重新绘制
调用JComponent#repaint
时,不会重新绘制JComponent
。相反,在EDT上会安排一个异步请求来重新绘制某个组件。如果调用多个repaint
调用,Swing可能会决定对这些请求进行分组,并只重新绘制一次组件
我没有立即在Oracle文档中找到这方面的官方参考(似乎没有提及)。我唯一发现这一点的地方是在中的一个注释中,但我非常确定这是在某个地方记录的
为什么使用计时器
是最佳解决方案
对于动画,您基本上希望说:
我的角色应该在y
毫秒内移动x
像素
最好是,你们希望在屏幕上有一个平滑的动画,所以你们需要经常重新绘制
- 与Swing组件的所有交互都应该在EDT上进行(事件调度线程,有关更多信息,请参阅文章)
- 您不应该阻止EDT,因为这将冻结您的UI,这意味着您不能在EDT中“等待”,直到重新绘制完成,否则重新绘制将永远不会发生
- 重新绘制请求可以分组,因此调用Repaint
x
times不能保证您的paint
方法也被调用x
times
克服此限制的解决方案是使用定时器
。在相同的示例中(在屏幕上移动字符),您可以使用定时器
更新字符的位置并计划重新绘制。由于定时器
代码是在EDT上触发的,因此您不会违反Swing线程规则
在组件的paintComponent
方法中,然后在当前位置绘制角色。这可能是“前一位置+1”或“前一位置+2”(或…)取决于在上一次绘制
调用和当前的绘制
调用之间触发计时器
的次数。这可确保角色移动的速度与系统无关。只有动画的平滑度取决于您的系统(如:有多少重新绘制请求被分组)
Jonas已经链接到的包含更多信息。感谢您提供的详细信息,这对我非常有用,我将尝试使用计时器then@mKorbel谢谢。不幸的是,它似乎没有得到很多选票:-(