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

时间:2019-03-29 14:49:16

标签: java user-interface sleep

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

尽管我不确定Java的初学者如何实现,但我已经阅读了一些有关swing定时器的内容。

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.
    }
}

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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


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

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

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