我试图向JLabel显示GIF文件。没问题我加载GIF并将其设置为标签的图标。但现在我真的需要知道什么时候结束,因为它必须作为一个过场动画。我已经尝试过这个(GameScene是一个自定义对象,但我知道setIcon有效,相信我):
private GameScene scene;
private ImageIcon _temp;
private ImageIcon toplay;
private Thread anim;
public Cutscene(ImageIcon gif, GameScene scene, int length){
this._temp = scene.getIcon();
this.toplay = gif;
this.scene = scene;
anim = new Thread(){
@Override
public void run(){
scene.setIcon(gif);
scene.repaint();
try {
Thread.sleep(length);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
}
private void _s(){
scene.setSolidColor(false);
scene.setIcon(toplay);
scene.repaint();
}
public void play(){
_s();
anim.start();
}
public void await(){
try {
anim.join();
scene.setIcon(_temp);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
现在,无论如何我可以实现这一目标,只需让整个程序在给定的时间内休眠,然后继续使用其余的代码并完全不绘制GIF文件?
答案 0 :(得分:2)
这是一个非常简单的例子,它只适用于非循环的GIF,如果你的gif重复,你必须测试FRAMEBITS
的请求之间的时间,并尝试确定你是否能够检测到循环的点。
public class MonitoringLabel extends JLabel {
public MonitoringLabel(Icon image) {
super(image);
}
public void addActionListener(ActionListener listener) {
listenerList.add(ActionListener.class, listener);
}
public void removeActionListener(ActionListener listener) {
listenerList.remove(ActionListener.class, listener);
}
protected void fireActionPerformed() {
ActionListener[] listeners = listenerList.getListeners(ActionListener.class);
if (listeners.length > 0) {
ActionEvent evt = new ActionEvent(this, 0, "stopped");
for (ActionListener listener : listeners) {
listener.actionPerformed(evt);
}
}
}
@Override
public boolean imageUpdate(Image img, int infoflags, int x, int y, int w, int h) {
boolean finished = super.imageUpdate(img, infoflags, x, y, w, h);
if (!finished) {
fireActionPerformed();
}
return finished;
}
}
上面的类提供了一个ActionListener
,当图像"完成"加载(当它们在要播放的动画中没有新帧时触发 - 重复的GIF永远不会返回false
)
如果需要,您可以使用不同的侦听器界面,我只是将它作为示例放在一起。
我选择覆盖imageUpdate
的原因是因为JLabel
在绘制图片时已经充当图片的ImageObserver
,这样我们就可以使用JLabel
的强大功能{1}}无需手动绘制一个gif的烦恼...是的我已经完成了它,它的痛苦
答案 1 :(得分:0)
是否有可能使GIF不重复用于制作它的程序?大多数制作GIF图像的照片编辑器都可以让您重复或不重复。
如果我理解你的问题,你似乎只想让gif玩一次?
如果是剪辑场景,为什么不让节目在那段时间内睡觉?