2012-07-25 26 views
7

Estoy usando paintComponent() para pintar una imagen animada gif en el fondo de JPanel. Muestra el gif pero no anima. Uso java 1.5 y sé que puedo usar la etiqueta con el ícono.¿Por qué la animación gif no se anima cuando se usa en paintComponent()?

¿Alguien sabe por qué y cómo solucionarlo?

private static class CirclePanel extends JPanel { 

    ImageIcon imageIcon = new ImageIcon(BarcodeModel.class.getResource("verify.gif")); 
    Point point = f.getLocation(); 
    protected void paintComponent(Graphics g) { 
     Graphics gc = g.create(); 
     Graphics2D g2d = (Graphics2D) g.create(); 
     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f)); 
     g2d.setColor(Color.BLUE); 
     g2d.drawImage(imageIcon.getImage(), getWidth()/2, getHeight()/2, null); 
     g2d.drawRect(0, 0, getWidth(), getHeight()); 
     g2d.setStroke(new BasicStroke(10f,BasicStroke.CAP_ROUND,BasicStroke.JOIN_MITER)); 
     g2d.setFont(g.getFont().deriveFont(Font.BOLD | Font.ITALIC,15f)); 
     g2d.drawString("Wait Please ...",getWidth()/2-imageIcon.getIconHeight()/3,getHeight()/2+imageIcon.getIconHeight()+15); 

     g2d.dispose(); 

} 

Esta es la imagen gif.
enter image description here

Editado: sólo tiene que añadir observador de imagen con el método g2d.drawImage().

g2d.drawImage(imageIcon.getImage(), getWidth()/2, getHeight()/2, this); 
+0

posible duplicado de [Mostrar un BG animado en Swing] (http://stackoverflow.com/questions/10836832/show-an-animated-bg-in-swing) –

Respuesta

9

La razón es que la API Java ImageIO estándar solo carga la primera imagen del gif. ¿Cómo solucionarlo? Google para un Gif Loader para Java, que carga cada imagen del gif. Luego tienes que pintar la imagen correcta en el momento adecuado. Una forma alternativa sería tener diferentes archivos png que representen cada vez un fotograma de la animación.

Actualización: Bueno ... En realidad, después de investigar un poco, parece que la forma en que lo hizo realmente carga todos los marcos del gif animado. El motivo es que el método ImageIcon getImage() siempre devuelve la primera imagen.

Para solucionarlo, puede probar esto (no estoy seguro de si funcionará ...)

En lugar de utilizar Grahpics.drawImage(), utilice ImageIcon.paintIcon(). De esta manera:

imageIcon.paintIcon(this, g2d, getWidth()/2 - imageIcon.getIconWidth()/2, getHeight()/2); 
+0

Cool y LUL, al mismo tiempo que encontramos el responde pero aceptaré tu respuesta. – itro

+0

¿Cómo finalmente lo resolvió? –

+0

Corrección pequeña: el último 'esto' no necesita estar allí. – itro

4

Image observer se ocupará de ello. Debería pasar al observador al g2d.drawImage(); como se muestra a continuación.

g2d.drawImage(imageIcon.getImage(), getWidth()/2, getHeight()/2, this); 

En 'esto' botón de referirse a CirclePanel que se extiende JPanel, que puede ser cualquier cosa, por ejemplo, si está utilizando gif como un icono de un botón, se debe utilizar como imagen de observador mi caso.

+0

Eso fue lo que pensé, que ImageObserver lo arreglaría. ¿Has probado mi sugerencia también? Porque eso también usa ImageObserver. –

Cuestiones relacionadas