我正在构建一个swing应用程序。在某些时候,我必须开始一个“动画”:
...
jpanel1.setBackground(Color.Black);
Delay(milli)
jpanel1.setBackground(Color.White);
...
等等。
gui本身及其背后的所有逻辑都起作用。正是这个时间依赖于颜色变化而不是。我已经读过,swing不是线程安全的,但是我发现的所有例子都向我展示了如何启动另一个线程(例如在后台),但从未如何停止当前的swing-gui线程。
修改
应用程序的工作方式如下:
不起作用的在线事物是颜色变化之间的延迟。我现在明白为什么它不起作用我正在尝试构建一个计时器,它激活一个动作单元,然后改变颜色并停止计时器......它似乎只是为了一个简单的延迟而工作......我有重新组织应用程序中的整个动画。
答案 0 :(得分:1)
即使您想要闪烁效果,也不想停止GUI线程。这是因为其他基本操作,例如当GUI被其他窗口隐藏时重新绘制,将会停止。看看Timer
。它允许您在一个时间间隔内触发一个事件,您可以在GUI线程中使用actionPerformed
方法处理该事件。
答案 1 :(得分:1)
您需要使用javax.swing.Timer
课程和不 java.util.Timer
课程。
当您需要一般计时时,后者是首选,前者是UI更新/更改的首选。
请参阅http://java.sun.com/docs/books/tutorial/uiswing/misc/timer.html
答案 2 :(得分:1)
看看:https://timingframework.dev.java.net/
以及http://filthyrichclients.org/
中的样本它们提供了一些关于动画如何工作和使用Timer框架的非常好的信息。你会很好地理解它是如何工作的。
在阅读完这些内容后,我在这里用Swing做了一个示例动画:
count down demo app http://img580.imageshack.us/img580/742/capturadepantalla201004wd.png 以blog.stackoverflow.com页面为特色的Java应用程序(点击图片查看演示视频)
但我甚至不确定你想要达到的是什么。
修改强>
我读到时间框架,以便更好地理解所有内容,但实际上并没有使用它(创建没有线性时间的动画很有用 - 也就是说,没有像我一样的每一秒,但像1,5这样的东西,3秒,2秒)
我在上面的演示中使用的代码是完全这个:
final Timer imageTimer = new Timer();
imageTimer.schedule( new TimerTask() {
public void run() {
changeImage();
}
}, 0, 10000 ); //<-- every 10 seconds.
“stackoverflowing”和倒计时的动画使用类似的方法。
答案 3 :(得分:0)
在另一个线程上执行计时器,当计时器关闭时,它可以发送动画的更新消息以绘制下一帧。
另一个考虑因素是延迟本身。不要选择固定的延迟间隔。旧游戏曾经这样做,它们在更快的计算机上变得无法播放。相反,较新的游戏所做的是使用当前CPU的速度来确定它们在运行时需要多少次更新事件,将其称为“延迟因子”,并在程序启动时设置。 。计时器使用延迟因子,因此动画甚至可以在不同时钟速度的机器上正确显示。