Java - 如何在不暂停 GUI 中的 GIF 动画的情况下暂停代码



目前我有一个带有按钮的游戏的开始菜单,该按钮在按下按钮后将我的菜单背景图像从 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.
    }
}

有什么建议吗?

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

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

[编辑] 显然已经有一个答案,我不知道这个答案,或者我的答案是否适合你的软件。我可以肯定的一件事是,我的方法允许您使用自定义缩放算法等而不是内置算法(但您可能也不需要它(。


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

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

从那里开始,您需要使用javax.swing.Timer或类似方法编写自己的动画师。

最新更新