Я добавил gif к своему JLabel, но он проигрывается только один раз и не продолжается. Как это исправить? - PullRequest
0 голосов
/ 19 апреля 2020
  JLabel two = new JLabel();
   ImageIcon jaina= new ImageIcon("images/jaina.gif");
  two.setBounds(0,0,300,300);
   two.setIcon(jaina);

Затем я добавил ярлык на панель, он воспроизводится только один раз

1 Ответ

0 голосов
/ 19 апреля 2020

Если ваш gif не установлен в l oop, правильное решение состоит в том, чтобы изменить gif таким образом, чтобы он был l oop.

Из любопытства я издевался над этим пример. Что делать, если я хочу анимировать 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);
      });
    }
}

Это гораздо больше, чем просто agile, чем просто убедиться, что GIF-файл является правильным форматом. Также гораздо больше кода, учитывая, что оригинал new ImageIcon("..."); обрабатывает все.

...