【问题标题】:I added a gif to my JLabel but it only plays once and doesn't continue, how do i fix it?我在我的 JLabel 中添加了一个 gif,但它只播放一次并且无法继续,我该如何解决?
【发布时间】:2020-08-01 23:20:39
【问题描述】:
  JLabel two = new JLabel();
   ImageIcon jaina= new ImageIcon("images/jaina.gif");
  two.setBounds(0,0,300,300);
   two.setIcon(jaina);

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

【问题讨论】:

  • 如果您使用其他任何东西(例如浏览器)查看它会重复吗?
  • 不要使用 setBounds(…)。 Swing 旨在与Layout Managers 一起使用。
  • 我只是要提到 setBounds,如果您使用它,我怀疑您的布局有问题,但我们需要更多。如果没有 setBounds,这绝对可以工作。
  • 1) 为了尽快获得更好的帮助,edit 添加minimal reproducible exampleShort, Self Contained, Correct Example。在这种情况下,它应该只需要 20-30 行代码。 2) 例如,获取图像的一种方法是热链接到this Q&A 中看到的图像。例如。 This answer 指向嵌入在 this question 中的图像的热链接。 警告:在这种情况下,我怀疑它是一个编码为仅循环一次的 GIF,最好专门(上传和)链接到该 GIF。
  • 是的,原来它只循环一次,但如何保持循环

标签: java swing jlabel gif


【解决方案1】:

如果您的 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("..."); 处理所有事情,还有更多的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    • 2011-12-08
    • 2022-12-10
    • 2021-12-08
    • 1970-01-01
    • 2015-07-24
    相关资源
    最近更新 更多