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

问题描述 投票:3回答:2

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

我已经阅读了一些关于swing计时器的内容,虽然我不确定如何实现它,因为我是一个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.
    }
}

有什么建议?

java user-interface sleep
2个回答
1
投票

你不能在Thread.sleep()中使用阻塞方法,如Thread.join()Swing EDT。当Swing EDT处理所有UI刷新事件时,这将冻结UI。

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


0
投票

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


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

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

从那以后,你需要使用javax.swing.Timer或类似的东西编写自己的动画师。

© www.soinside.com 2019 - 2024. All rights reserved.