【问题标题】:Java - How can I pause code without pausing a GIF animation in my GUI?Java - 如何在不暂停 GUI 中的 GIF 动画的情况下暂停代码?
【发布时间】:2019-03-29 23:21:46
【问题描述】:

目前我有一个带有按钮的游戏的开始菜单,该按钮在按下按钮后将我的菜单背景图像从 PNG 转换为 GIF。现在,我希望我的代码等到 GIF 动画结束。之后,它应该会正常继续(通过在实际游戏中打开一个新的 JFrame)。

我读过一些关于摇摆计时器的资料,虽然我不确定如何实现它,因为我是 Java 初学者。

private ImageIcon a = new ImageIcon("a.png");
private ImageIcon b = new ImageIcon("b.gif");

class AddInterestListener implements ActionListener {
    public void actionPerformed(ActionEvent event) {
        bgLabel.setIcon(b); //replace PNG with GIF

        //This here is where I want my delay to happen without freezing the GUI 

        JFrame game = new JFrame(); //Actual game frame starting etc.
    }
}

有什么建议吗?

【问题讨论】:

  • 您可以使用 ImageObserver。图像完成后,观察者可以打开框架。
  • 只是一个想法...我认为您可以启动一个将 PNG 更改为 GIF 的线程。然后使用类似 thread.join(2000) 的东西等到该任务完成。

标签: java user-interface sleep


【解决方案1】:

您不能在Swing EDT 中使用Thread.sleep()Thread.join() 之类的阻塞方法。这将冻结 UI,因为 Swing EDT 处理所有 UI 刷新事件。

您必须使用事件来实现这一点,第一个事件阻塞 UI,第二个解除阻塞。如果您知道 GIF 动画长度,您可以使用 SwingUtils.invokeLater() 运行异步线程,该线程将在固定延迟后触发事件。

【讨论】:

  • 我读过关于 invokeLater 因为你提到了它,但我无法让它工作。我认为这主要是因为我的英语不是那么好,而且当涉及到任何编程语言时,我都是一个绝对的初学者。我将如何实施事件来暂停我的代码? oracle网站上给出的例子让我很困惑。
【解决方案2】:

[Edit] 显然已经有了答案,我不知道该答案或我的答案是否适合您的软件。我可以肯定地说的一件事是,我的方法允许您使用自定义缩放算法等而不是内置算法(但您可能也不需要)。


Afaik 无法监控使用 SWING 显示的 GIF 的进度。您必须制作自己的 GIF 解码器/动画器,以便您“检测”何时 GIF 即将循环或结束(是的,动画 GIF 可以结束)。

为此,我使用了来自https://github.com/DhyanB/Open-Imaging 的第 3 方加载器来获取各个帧和时间信息。不能保证这仍然是我一年多前发现的最好的库。

从那时起,您需要使用javax.swing.Timer 或类似工具编写自己的动画师。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-30
    • 2021-12-21
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多