java – 使用Swing动画进行计时
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 使用Swing动画进行计时,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1732字,纯文字阅读大概需要3分钟。
内容图文
我在Swing和角色动画方面遇到了一些问题,
我有一个带有键监听器的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();
}
这为我的角色设置了动画,但速度太快,以至于我们可以看到一个东西,我该怎么做才能观看动画?
解决方法:
Jonas已经给出了答案(使用Swing计时器),但是解释为什么你没有看到动画可能是有用的,以及为什么计时器是这个问题的最佳解决方案.
为什么我看不到不同的重绘
当您调用JComponent #repaint时,不重新绘制JComponent.相反,在EDT上安排重新绘制某个组件的异步请求.如果您调用许多重绘调用,Swing可能会决定对这些请求进行分组并仅重新绘制一次该组件.
我没有立即在Oracle文档中找到这方面的官方参考(Swing painting article似乎没有提到它).我发现这个的唯一地方是在this article的一张纸条中,但我很确定这是在某处记录的.
为什么使用Timer是最佳解决方案
对于动画,你基本上想说:
my character should move
x
pixels iny
milliseconds
最好是,您希望在屏幕上拥有流畅的动画,因此您需要经常重新绘制.如果你记住这一点
>所有与Swing组件的交互都应该在EDT上进行(事件调度线程,请参阅Concurrency in Swing文章了解更多信息)
>你永远不应该阻止EDT,因为这会冻结你的UI,这意味着你不能在EDT中“等待”,直到重绘完成或者重绘永远不会发生
>可以对重绘请求进行分组,因此调用重绘x次并不能保证您的绘制方法也会被调用x次
克服此限制的解决方案是使用Timer.使用相同的示例(在屏幕上移动字符),您可以使用计时器更新角色的位置并安排重新绘制.由于在EDT上触发了Timer代码,因此不违反Swing线程规则.
在组件的paintComponent方法中,然后在当前位置绘制字符.这可能是“先前的位置1”,或“先前的位置2”(或……),具体取决于在上一次绘制调用和当前绘制调用之间触发Timer的次数.这可以确保角色移动的速度与系统无关.只有动画的平滑度取决于您的系统(如:有多少重绘请求被分组).
Jonas已经链接的Swing Timer tutorial包含更多信息.
内容总结
以上是互联网集市为您收集整理的java – 使用Swing动画进行计时全部内容,希望文章能够帮你解决java – 使用Swing动画进行计时所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。