Java 如何使用swing和clojure制作动画?

Java 如何使用swing和clojure制作动画?,java,swing,animation,clojure,Java,Swing,Animation,Clojure,我正试图在棋盘上制作一个棋子的动画。首先,我创建了一个java.util.Timer对象,该对象“scheduleAtFixedRate”一个作为代理函数实现的TimerTask。因此,我保留了一个要移动的工件的记录(工件移动记录),并且在适当的时候(当用户使用鼠标移动工件时),应该测试TimerTask代理函数,如果记录不是零,则执行工件移动功能。工件移动功能只是根据预先计算的矢量更新工件的x和y坐标。我在工件移动记录上放了一块AddWatch,所以当它改变时,它应该重新绘制电路板(画布)。绘

我正试图在棋盘上制作一个棋子的动画。首先,我创建了一个java.util.Timer对象,该对象“scheduleAtFixedRate”一个作为代理函数实现的TimerTask。因此,我保留了一个要移动的工件的记录(工件移动记录),并且在适当的时候(当用户使用鼠标移动工件时),应该测试TimerTask代理函数,如果记录不是零,则执行工件移动功能。工件移动功能只是根据预先计算的矢量更新工件的x和y坐标。我在工件移动记录上放了一块AddWatch,所以当它改变时,它应该重新绘制电路板(画布)。绘制方法测试此工件的移动记录是否为零以绘制它


问题是动画没有出现。这首曲子只是跳向命运,没有中间的动静。动画方案存在一些问题,有更好的方法吗

Swing不会自动制作动画,不管你是否有计时器。如果你想为运动设置动画,你需要一次移动一段距离,并在每次移动时重新绘制画布,这样就可以说运动产生了错觉。

JDK中有一个动画演示。它使用awt,但它应该给你一些想法


jdk1.6.0_20\demo\applets\Animator

您可以使用Trident库:

对Swing组件的更新应该在事件调度线程(EDT)上完成。因此,您应该使用Swing定时器,因为定时器触发时执行的任何代码都将在EDT上执行

你所要做的就是设置棋子的位置,它会自动重新绘制自己


有关更多信息,请阅读Swing教程中的部分。

另一个想法可能是从Processing.org查看处理可视化框架。它是一种简单但功能强大且有良好文档记录的动画和可视化编程语言。API非常简单,有一个非常透明的Clojure包装,名为。

这正是我正在做的,当工件移动时,画布的重新绘制方法通过add-watch调用。应该尝试一下,Clojure和swing对我来说似乎很难。你是对的,移动现在可以工作了,但仍然不够平滑,请进一步检查swing计时器。谢谢您的回答。您不必使用Swing定时器来设置组件的动画。您可以使用您想要的任何实用程序设置计时器,然后使用SwingUtilities.invokeLater(或invokeAndWait)将执行传递给EDT。