Frage

Ich versuche, eine ImageIcon aus einem animierten GIF in einer JAR-Datei gespeichert zu erstellen.

ImageIcon imageIcon = new ImageIcon(ImageIO.read(MyClass.class.getClassLoader().getResourceAsStream("animated.gif")));

Die Bild Lasten, aber nur der erste Frame des animierten GIF. Die Animation wird nicht abgespielt.

Wenn ich die animierte GIF aus einer Datei auf dem Dateisystem geladen werden, funktioniert alles wie erwartet. Die Animation wird durch alle Frames. So funktioniert das:

ImageIcon imageIcon = new ImageIcon("/path/on/filesystem/animated.gif");

Wie kann ich ein animiertes Gif in eine ImageIcon aus einer JAR-Datei laden?

EDIT: Hier ist ein kompletter Testfall, warum nicht dieser Anzeige die Animation

import javax.imageio.ImageIO;
import javax.swing.*;

public class AnimationTest extends JFrame {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                AnimationTest test = new AnimationTest();
                test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                test.setVisible(true);
            }
        });
    }

    public AnimationTest() {
        super();
        try {
            JLabel label = new JLabel();
            ImageIcon imageIcon = new ImageIcon(ImageIO.read(AnimationTest.class.getClassLoader().getResourceAsStream("animated.gif")));
            label.setIcon(imageIcon);
            imageIcon.setImageObserver(label);
            add(label);
            pack();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
War es hilfreich?

Lösung

Dieses liest GIF-Animation von input

InputStream in = ...;
Image image = Toolkit.getDefaultToolkit().createImage(org.apache.commons.io.IOUtils.toByteArray(in));

Andere Tipps

Sie müssen verwenden getClass () getResource (ImgName). eine URL zur Bilddatei zu erhalten. Schauen Sie sich diesem Tutorial von Real HowTo.

EDIT: Nachdem das Bild geladen wird müssen Sie die Eigenschaft Imageobserver gesetzt, um die Animation zu bekommen auszuführen.

Da dieses Thema nur aus einem aktuellen Thread verlinkt, die wenig mit animierten GIFs zu tun hatten, bekam aber OT geschleppt, ich dachte, dass ich diese triviale Quelle hinzufügen würde, dass ‚funktioniert für mich.‘

import javax.swing.*;
import java.net.URL;

class AnimatedGifInLabel {

    public static void main(String[] args) throws Exception {
        final URL url = new URL("http://i.stack.imgur.com/OtTIY.gif");
        Runnable r = new Runnable() {
            public void run() {
                ImageIcon ii = new ImageIcon(url);
                JLabel label = new JLabel(ii);
                JOptionPane.showMessageDialog(null, label);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

Hoffentlich ist es nicht zu spät dafür.

ich es geschafft, die animierte GIF in meinem JPanel auf diese Weise zu erhalten:

private JPanel loadingPanel() {
    JPanel panel = new JPanel();
    BoxLayout layoutMgr = new BoxLayout(panel, BoxLayout.PAGE_AXIS);
    panel.setLayout(layoutMgr);

    ClassLoader cldr = this.getClass().getClassLoader();
    java.net.URL imageURL   = cldr.getResource("img/spinner.gif");
    ImageIcon imageIcon = new ImageIcon(imageURL);
    JLabel iconLabel = new JLabel();
    iconLabel.setIcon(imageIcon);
    imageIcon.setImageObserver(iconLabel);

    JLabel label = new JLabel("Loading...");
    panel.add(iconLabel);
    panel.add(label);
    return panel;
}

Einige Punkte dieses Ansatzes:
1. Die Bilddatei ist im Glas;
2. ImageIO.read () gibt einen BufferedImage, die nicht die Imageobserver nicht aktualisiert;
3. Eine weitere alternative Bilder zu finden, die in der JAR-Datei gebündelt werden, ist die Java-Class-Loader zu fragen, den Code, der das Programm geladen, um die Dateien zu erhalten. Es weiß, wo die Dinge sind.

So dies tun konnte ich meine animierten Gif in meinem JPanel bekommen und es hat funktioniert wie ein Charme.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top