【问题标题】:How to use a delay in a swing application如何在摇摆应用程序中使用延迟
【发布时间】:2010-05-05 17:52:21
【问题描述】:

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

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

Delay(milli)   

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

等等。

gui 本身和它背后的所有逻辑都可以工作。只是这一次依赖于颜色变化,没有。我读过,swing 不是线程安全的,但我发现的所有示例都向我展示了如何启动另一个线程(例如在后台),但从未停止当前的 swing-gui 线程。

编辑:

应用程序应该如下工作:

  1. 配置文件已读取,jframe 已设置。
  2. 有人问了一些简单的问题
  3. 打开一个对话框,解释动画。
  4. 在用户单击“确定”后,动画 - 一些颜色闪烁 - 开始。颜色和变色之间的延迟取决于配置
  5. 打开另一个对话框,程序继续 -> jframe 内的新 jpanel、按钮等。

网上说不行的就是换色之间的延迟。我现在明白为什么它不起作用并且我正在尝试构建一个计时器,它激活一个动作列表,然后改变颜色并停止计时器......对于一个简单的延迟来说似乎工作量很大......而且我有重新组织应用程序中的整个动画。

【问题讨论】:

  • 你想要达到的究竟是什么?

标签: java swing multithreading


【解决方案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”的动画和倒计时使用类似的方法。

【讨论】:

  • 不同页面之间的延迟正是我所需要的。我认为时序框架将解决我的问题。明天需要去看看。谢谢。
  • 计时框架被其作者留下为“正在进行的工作”,并且从那时起一直处于休眠状态(至少 2 年)。一个更好的替代方案(也是开源的)是 trident (kenai.com/projects/trident),也是由“Swing 大师”编写的。
【解决方案2】:

您不想停止 GUI 线程,即使您想要闪烁效果。这是因为其他基本操作,例如当 GUI 被其他窗口隐藏时重新绘制,将被停止。看看Timer。它将允许您在某个时间间隔内触发一个事件,并且您可以在 GUI 线程中的 actionPerformed 方法中处理它。

【讨论】:

    【解决方案3】:

    您将希望使用javax.swing.Timer 类,而使用java.util.Timer 类。 当您需要一般时间时,首选后者。UI 更新/更改首选前者。

    http://java.sun.com/docs/books/tutorial/uiswing/misc/timer.html

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

    【讨论】:

      【解决方案4】:

      在另一个线程上执行计时器,当计时器关闭时,它可以为动画发送更新消息以绘制下一帧。

      另一个考虑因素是延迟本身。不要选择固定的延迟间隔。旧游戏曾经这样做,它们在更快的计算机上变得无法播放。相反,较新的游戏所做的是使用当前 CPU 的速度来计算它们在运行时每秒需要多少更新事件,称之为“延迟因素”,并在程序启动时设置。 .计时器使用延迟因子,因此动画即使在不同时钟速度的机器上也能正确显示。

      【讨论】:

      • 这不是游戏。我只需要做一些不同的 gui 更改,这些更改必须在配置的时间跨度内发生,并且在单个步骤之间配置延迟。用户需要在没有交互的情况下观看动画。动画结束后恢复交互。现在我正在尝试从 akf 实现 Timer,但这需要一些时间,因为我基本上必须更改动画周围的所有内容才能使其工作..还有两种不同的延迟......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-23
      • 1970-01-01
      • 1970-01-01
      • 2012-02-29
      相关资源
      最近更新 更多