2012-07-25 24 views
7

JPanel ürününün arka planında bir gif hareketli görüntüyü boyamak için paintComponent() kullanıyorum. Gif'i gösterir ancak animasyon vermez. Ben java 1.5 kullanıyorum ve etiketli ikon kullanabileceğimi biliyorum.Neden gif animasyonu paintComponent() içinde kullanıldığında canlandırılmıyor?

Herhangi bir vücut nedenini ve nasıl düzeltileceğini biliyor mu?

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

} 

Bu gif resimdir.
enter image description here

Düzenlendi: sadece g2d.drawImage() yöntemine görüntü gözlemci ekleyin.

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

olası bir kopyası [Swing'de hareketli bir BG Göster] (http://stackoverflow.com/questions/10836832/show-an-animated-bg-in-swing) –

cevap

9

Bunun nedeni, standart Java ImageIO API'sinin yalnızca gif'in ilk görüntüsünü yüklemesidir. Nasıl düzeltilir? Gif'in her bir görüntüsünü yükleyen Java için Gif Yükleyici için Google. O zaman doğru görüntüyü doğru zamanda çizmelisiniz. Alternatif bir yol, animasyonun her karesini her seferinde temsil eden farklı png dosyalarına sahip olmaktır.

Güncelleme: İyi ... Aslında, bazı araştırmalar yaptıktan sonra, yaptığınız gibi görünüyor aslında animasyonlu gifin tüm karelerini yükler. Bunun nedeni, ImageIcon'un getImage() yönteminin her zaman ilk resmi döndürmesidir.

düzeltmek için, yerine Grahpics.drawImage() kullanmanın (... işe eğer emin değilim)

bu deneyebilirsiniz, ImageIcon.paintIcon() kullanın. Bunun gibi:

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

Serin ve LUL, aynı zamanı bulduk cevap ama cevabını kabul edeceğim. – itro

+0

Nihayet nasıl çözdün? –

+0

Sadece küçük düzeltme: son 'bu' orada olmak için gerekli değildir. – itro

4

Görüntü gözlemcisi bununla ilgilenecektir. Gözlemciyi aşağıdaki gibi g2d.drawImage();'a bırakmalısınız. Benim durumumda görüntü gözlemci olarak 'bu' Eğer bir düğme için bir simge olarak gif kullanıyorsanız Jpanel uzanır CirclePanel bakın, örneğin herhangi bir şey olabilir, kullanmak gerekir düğmesini

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

.

+0

Bu, ImageObserver'ın bunu düzelteceğini düşündüğüm şeydi. Benim önerimi de test ettin mi? Çünkü bu ImageObserver kullanıyor. –