目前我有一个带有按钮的游戏的开始菜单,按钮可以在按下按钮后将我的菜单背景图像从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.
}
}
有什么建议?
你不能在Thread.sleep()
中使用阻塞方法,如Thread.join()
或Swing EDT。当Swing EDT处理所有UI刷新事件时,这将冻结UI。
您必须使用事件实现此功能,第一个事件阻止UI再次阻止它。如果您知道GIF动画长度,则可以使用SwingUtils.invokeLater()
运行异步线程,这将在固定延迟后触发事件。
[编辑]显然已经有了答案,我不知道答案,或者我的答案是否适合您的软件。我可以肯定的一点是,我的方法允许您使用自定义缩放算法等而不是内置的(但您可能也不需要)。
Afaik无法监控使用SWING显示的GIF的进度。您必须制作自己的GIF解码器/动画师,以便在GIF即将循环或结束时“检测”(是动画GIF可以结束)。
为此,我使用了https://github.com/DhyanB/Open-Imaging的第三方加载器来获取各个帧和时序信息。不能保证这仍然是最好的图书馆,因为我在一年多前发现这一点。
从那以后,你需要使用javax.swing.Timer
或类似的东西编写自己的动画师。