目前,我有一个带有按钮的游戏开始菜单,按下按钮后,菜单背景图像从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.
}
}
有什么建议吗?
答案 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
或类似的语言编写自己的动画师。