我在我的JLabel中添加了一个gif,但它只能播放一次且不能继续播放,我该如何解决?

时间:2020-04-19 14:18:51

标签: java swing jlabel gif

FirestoreRecyclerAdapter

然后我将Label添加到我的面板中,它只能播放一次

1 个答案:

答案 0 :(得分:0)

如果您的gif未设置为循环播放,则正确解决方案是修改gif使其循环播放。

出于好奇,我模拟了这个示例。如果我想为gif设置动画而不依赖其动画设置怎么办?

import javax.swing.JFrame;
import javax.swing.Timer;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.FileImageInputStream;
import java.util.List;
import java.util.ArrayList;
import java.io.File;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.EventQueue;

public class GifLabel{    
    public static void startGui( List<ImageIcon> imgs){
        JFrame frame = new JFrame("animated gif");
        JLabel label = new JLabel( );
        frame.add(label);
        label.setIcon(imgs.get(0));
        Timer t = new Timer( 30, new ActionListener(){
              int i = 0;
              @Override
              public void actionPerformed( ActionEvent evt ){
                  label.setIcon ( imgs.get(i) );
                  i = (i+1)%imgs.size();
              }
          });
      frame.pack();
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setVisible(true);
      t.start();
    }

    public static void main(String[] args) throws Exception{
      ImageReader reader = ImageIO.getImageReadersBySuffix("GIF").next();
      reader.setInput( new FileImageInputStream( new File("images/jaina.gif")));
      int n = reader.getNumImages( true );
      List<ImageIcon> imgs = new ArrayList<>();
      for(int i = 0; i<n; i++){
          imgs.add( new ImageIcon(reader.read(i)) );
      }
      EventQueue.invokeLater( ()->{
          startGui(imgs);
      });
    }
}

这比确保GIF是正确的格式更加脆弱。同样,考虑原始new ImageIcon("...");处理所有内容,更多代码。