WebHU - Programozási kérdések és válaszok

Animált gif betöltése JAR fájlból az ImageIconba

Megpróbálok létrehozni egy ImageIcon-t egy jar fájlban tárolt animált gifből.

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

A kép betöltődik, de az animált gifnek csak az első képkockája. Az animáció nem játszódik le.

Ha betöltöm az animált gif-et egy fájlból a fájlrendszeren, minden a várt módon működik. Az animáció végigjátssza az összes képkockát. Tehát ez működik:

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

Hogyan tölthetek be egy animált gifet egy ImageIcon-ba jar fájlból?

EDIT: Itt egy teljes teszteset, miért nem jeleníti meg az animációt?

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();
        }
    }
}

Válaszok:


1

Ez beolvassa a gif animációt az inputStreamből

InputStream in = ...;
Image image = Toolkit.getDefaultToolkit().createImage(org.apache.commons.io.IOUtils.toByteArray(in));
28.06.2011
  • Ez a határozott válasz. Köszönjük, miután több órán át tanulmányozta ezt a kérdést. Ez megoldja az erőforrások Eclipse-ből és Maven-ből való betöltésével kapcsolatos problémát is a JAR-okban. Nagyon köszönöm! 22.11.2013

  • 2

    A getClass().getResource(imgName); hogy megkapja a képfájl URL-címét. Tekintse meg ezt az oktatóanyagot a Real's HowTo-ból.

    SZERKESZTÉS: A kép betöltése után állítsa be az ImageObserver tulajdonságot az animáció futtatásához.

    29.09.2008
  • A png képeket jól töltöm be a jar fájlból a kód első szakaszával. És a gif betöltődik – csak nem animált. 29.09.2008
  • az ImageObserver beállítása az én esetemben nem segített. Úgy tűnik, hogy az ImageIO nem olvassa megfelelően az animált gifet. Ha más konstruktort használok az ImageIconhoz, akkor működik. Frissítettem a kérdést egy teljes kódpéldával. Szüksége lesz egy animated.gif fájlra az osztályútban. 29.09.2008

  • 3

    Mivel ezt a szálat csak egy aktuálisabb szálról linkelték, aminek nem sok köze volt az animált GIF-ekhez, de OT elhúzták, ezért gondoltam, hogy hozzáadom ezt a triviális forrást, amely "nekem működik".

    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);
        }
    }
    
    26.03.2011
  • ha valaki azon töprengett, hogyan lehet egyszerűen betölteni a képet fájlból, a következőképpen: url = new URL(file, localhost, resources/image.gif); 04.05.2013

  • 4

    Remélhetőleg még nem késő ehhez.

    Az animált gifet a következőképpen sikerült bevinnem a JPanel-embe:

    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;
    }
    

    Ennek a megközelítésnek néhány pontja:
    1. A képfájl a jar-ben van;
    2. Az ImageIO.read() egy BufferedImage-et ad vissza, amely nem frissíti az ImageObservert;
    3. Egy másik alternatíva a kereséshez A jar fájlba csomagolt képeknek meg kell kérniük a Java osztálybetöltőt, a programját betöltött kódot, hogy szerezze be a fájlokat. Tudja, hol vannak a dolgok.

    Így ezzel be tudtam helyezni az animált gifemet a JPanel-embe, és úgy működött, mint egy varázslat.

    01.03.2013
    Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..