2012-07-25 13 views
7

Sto usando paintComponent() per dipingere un'immagine animata gif al backgound di JPanel. Mostra la gif ma non si anima. Io uso java 1.5 e so che posso usare l'etichetta con l'icona.Perché l'animazione gif non si anima quando lo si utilizza in paintComponent()?

Qualcuno sa perché e come risolverlo?

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

} 

Questa è l'immagine GIF.
enter image description here

Modificato: basta aggiungere immagine osservatore al metodo g2d.drawImage().

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

possibile duplicato di [Mostra un BG animato in Swing] (http://stackoverflow.com/questions/10836832/show-an-animated-bg-in-swing) –

risposta

9

Il motivo è che l'API Java ImageIO standard carica solo la prima immagine della gif. Come risolvere? Google per un Gif Loader per Java, che carica ogni immagine della gif. Quindi devi dipingere l'immagine giusta al momento giusto. Un modo alternativo sarebbe quello di avere diversi file png che rappresentano ogni volta un fotogramma dell'animazione.

Aggiornamento: Bene ... In realtà, dopo aver fatto qualche ricerca, sembra che il modo in cui lo hai fatto carichi effettivamente tutti i fotogrammi della gif animata. Il motivo è che il metodo ImageIcon getImage() restituisce sempre la prima immagine.

Per risolvere il problema, si può provare questo (non sono sicuro se funzionerà ...)

Invece di utilizzare Grahpics.drawImage(), utilizzare ImageIcon.paintIcon(). In questo modo:

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

Cool e LUL, lo stesso tempo troviamo il rispondi ma accetterò la tua risposta. – itro

+0

Come lo hai finalmente risolto? –

+0

Piccola correzione: l'ultimo 'questo' non ha bisogno di essere lì. – itro

4

L'osservatore di immagini si prenderà cura di esso. Dovresti solo passare l'osservatore allo g2d.drawImage(); come di seguito.

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

Nel mio caso 'questo' tasto riferimento a CirclePanel che si estende JPanel, può essere qualsiasi cosa, ad esempio se si utilizza gif come icona di un pulsante, è necessario utilizzare come immagine di osservatore.

+0

Questo era quello che pensavo, che l'ImageObserver avrebbe risolto il problema. Hai messo alla prova anche il mio suggerimento? Perché utilizza anche ImageObserver. –

Problemi correlati