2012-07-25 4 views
7

Ich benutze paintComponent(), um ein gif animiertes Bild am Backgound von JPanel zu malen. Es zeigt das gif aber nicht animieren. Ich benutze Java 1.5 und ich weiß, dass ich Label mit Icon verwenden kann.Warum GIF-Animation nicht animiert, wenn sie in paintComponent() verwendet wird?

Weiß jemand, warum und wie man es repariert?

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

} 

Dies ist das GIF-Bild.
enter image description here

Edited: nur Bild Beobachter zum g2d.drawImage() Methode hinzuzufügen.

+0

möglich Duplikat von [Zeige eine animierte BG in Swing] (http://stackoverflow.com/questions/10836832/show-ananimated-bg-in-swing) –

Antwort

9

Der Grund ist, dass die Standard Java ImageIO API nur das erste Bild des Gif lädt. Wie zu beheben? Google für einen Gif Loader für Java, der jedes Bild des Gifs lädt. Dann musst du das richtige Bild zur richtigen Zeit malen. Ein alternativer Weg wäre, verschiedene png-Dateien zu haben, die jeweils ein Bild der Animation darstellen.

Update: Nun ... Eigentlich, nach ein paar Nachforschungen, sieht es so aus, als ob Sie tatsächlich alle Bilder des animierten Gif geladen hätten. Der Grund dafür ist, dass die ImageIcon-Methode getImage() immer das erste Bild zurückgibt.

es zu beheben, können Sie versuchen, diese (ich bin nicht sicher, ob es funktionieren wird ...)

Statt Grahpics.drawImage() zu verwenden, verwenden ImageIcon.paintIcon(). Wie folgt aus:

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

Cool und LUL, die gleiche Zeit finden wir die antworte, aber ich werde deine Antwort akzeptieren. – itro

+0

Wie hast du es endlich gelöst? –

+0

Nur eine kleine Korrektur: das letzte 'dieses' musste nicht da sein. – itro

4

Bild Beobachter wird sich darum kümmern. Sie sollten einfach den Beobachter an die g2d.drawImage(); wie folgt übergeben.

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

In meinem Fall ‚this‘ auf CirclePanel beziehen, die JPanel erstreckt, kann es jedes Ding zum Beispiel, wenn Sie gif als Symbol für eine Schaltfläche verwenden, sollten Sie Taste als Bild Beobachter verwenden.

+0

Das war, was ich dachte, dass der ImageObserver es beheben würde. Hast du meinen Vorschlag auch getestet? Weil das auch den ImageObserver benutzt. –

Verwandte Themen