如何在挥杆应用程序中使用延迟

时间:2010-05-05 17:52:21

标签: java swing multithreading

我正在构建一个swing应用程序。在某些时候,我必须开始一个“动画”:

...
jpanel1.setBackground(Color.Black);

Delay(milli)   

jpanel1.setBackground(Color.White);
...

等等。

gui本身及其背后的所有逻辑都起作用。正是这个时间依赖于颜色变化而不是。我已经读过,swing不是线程安全的,但是我发现的所有例子都向我展示了如何启动另一个线程(例如在后台),但从未如何停止当前的swing-gui线程。

修改

应用程序的工作方式如下:

  1. 读取配置文件,设置jframe。
  2. 提出了一些简单的问题
  3. 打开一个对话框,解释动画。
  4. 在用户点击“确定”之后,动画 - 一些颜色闪烁 - 开始。颜色和颜色变化之间的延迟取决于配置
  5. 打开另一个对话框,程序继续 - > jframe内部的新jpanel,按钮等。
  6. 不起作用的在线事物是颜色变化之间的延迟。我现在明白为什么它不起作用我正在尝试构建一个计时器,它激活一个动作单元,然后改变颜色并停止计时器......它似乎只是为了一个简单的延迟而工作......我有重新组织应用程序中的整个动画。

4 个答案:

答案 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

您可能还想查看https://timingframework.dev.java.net/

答案 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的速度来确定它们在运行时需要多少次更新事件,将其称为“延迟因子”,并在程序启动时设置。 。计时器使用延迟因子,因此动画甚至可以在不同时钟速度的机器上正确显示。