java - subir - Cargando un archivo.GIF animado del archivo JAR en ImageIcon
subir imagen netbeans (4)
Como este hilo se vinculó con un hilo más actual que tenía poco que ver con los GIF animados, pero se arrastró OT, pensé en agregar esta fuente trivial que "funciona para mí".
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);
}
}
Intento crear un ImageIcon a partir de un archivo .gif animado almacenado en un archivo jar.
ImageIcon imageIcon = new ImageIcon(ImageIO.read(MyClass.class.getClassLoader().getResourceAsStream("animated.gif")));
La imagen carga, pero solo el primer fotograma del gif animado. La animación no se reproduce
Si cargo el archivo .gif animado de un archivo en el sistema de archivos, todo funciona como se espera. La animación se reproduce a través de todos los cuadros. Entonces esto funciona:
ImageIcon imageIcon = new ImageIcon("/path/on/filesystem/animated.gif");
¿Cómo puedo cargar un gif animado en un ImageIcon desde un archivo jar?
EDITAR: Aquí hay un caso de prueba completo, ¿por qué esto no muestra la animación?
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();
}
}
}
Con suerte, no es demasiado tarde para esto.
Conseguí obtener el gif animado dentro de mi JPanel de esta manera:
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;
}
Algunos puntos de este enfoque:
1. El archivo de imagen está dentro del contenedor;
2. ImageIO.read () devuelve una Imagen Buffered, que no actualiza el ImageObserver;
3. Otra alternativa para encontrar imágenes que se incluyen en el archivo jar es pedirle al cargador de clases de Java, el código que cargó su programa, que obtenga los archivos. Sabe dónde están las cosas.
Así que al hacer esto pude obtener mi gif animado dentro de mi JPanel y funcionó como un amuleto.
Esto lee la animación gif de inputStream
InputStream in = ...;
Image image = Toolkit.getDefaultToolkit().createImage(org.apache.commons.io.IOUtils.toByteArray(in));
Tienes que usar getClass (). GetResource (imgName); para obtener una URL para el archivo de imagen. Mira este tutorial de Real''s HowTo.
EDITAR: una vez que se carga la imagen, debe establecer la propiedad ImageObserver para que se ejecute la animación.