2012-04-03 74 views
3

是否可以使用動畫.gif圖像作爲JFrame的圖標?如何使用動畫GIF作爲JFrame標題欄圖標

例如:

public class myFrame extends JFrame 
{ 
    java.net.URL imgURL = getCLass().getResource("/icons/AnimatedGif.gif"); 
    ImageIcon icon = new ImageIcon(imgURL); 

    this.setIconImage(icon.getImage()); 
    icon.setImageObserver(this); 

    ... 
} 

這種方法並沒有爲我工作。應用程序在使JFrame可見之前掛起。一切工作正常,但有一個常規的.gif圖標。

回答

4

我嘗試了一段時間,讓我的JFrame的圖標動畫,只需將圖標圖像設置爲動畫gif即可。我永遠無法得到那個工作。不過我已經想出了一個解決方法。沒有關於正確性或線程安全性的保證。

基本的想法是有一個單獨的線程來處理圖標動畫。這個線程的工作是不斷設置框架的圖標圖像。

這是一個演示幀:

import java.awt.EventQueue; 
import javax.swing.JFrame; 

public class FrameWithAnimatedIcon extends JFrame 
{ 
public static void main(String[] args) 
{ 
    final FrameWithAnimatedIcon frame = new FrameWithAnimatedIcon(); 
    EventQueue.invokeLater(new Runnable() 
    { 
     public void run() 
     { 
      try 
      { 
       frame.setVisible(true); 
      } catch(Exception e) 
      { 
       e.printStackTrace(); 
      } 
     } 
    }); 

    IconAnimator animator = new IconAnimator(frame, Images.images, 250); 
    animator.run(); 
} 

public FrameWithAnimatedIcon() 
{ 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(100, 100, 450, 300); 

} 
} 

這是圖標動畫類:

import java.awt.Image; 
import java.util.ArrayList; 
import javax.swing.JFrame; 

public class IconAnimator 
{ 

JFrame   frame = null; 
ArrayList<Image> images; 
long    msBetweenImages; 

public IconAnimator(JFrame frame, ArrayList<Image> images, long msBetweenImages) 
{ 
    this.frame = frame; 
    this.images = images; 
    this.msBetweenImages = msBetweenImages; 
} 

public void run() 
{ 
    while(true) 
    { 
     for(Image image : images) 
     { 
      try 
      { 
       frame.setIconImage(image); 

       Thread.sleep(msBetweenImages); 

      } catch(InterruptedException e) 
      { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      if(frame == null) 
      { 
       return; 
      } 
     } 
    } 
} 
}  

有了這個IconAnimator類,我可以給它的目標幀圖像的列表,並圖像之間的時間,它會爲JFrame圖標添加動畫。我想這個代碼可能不是「最佳實踐」的材料,但是,它的工作原理。關於實現的一個注意事項,我創建了一個名爲Images的獨立類,它將我的圖像加載到ArrayList中。每張圖片都是16x16。該類的列表聲明如下所示:

public static ArrayList<Image> images = new ArrayList<Image>(){{ 
    add(Toolkit.getDefaultToolkit().getImage(
     Images.class.getResource("/toolbarButtonGraphics/development/Bean16.gif"))); 

    add(Toolkit.getDefaultToolkit().getImage(
      Images.class.getResource ("/toolbarButtonGraphics/development/Application16.gif"))); 

    add(Toolkit.getDefaultToolkit().getImage(
      Images.class.getResource("/toolbarButtonGraphics/development/Applet16.gif"))); 

    add(Toolkit.getDefaultToolkit().getImage(
      Images.class.getResource("/toolbarButtonGraphics/development/WebComponent16.gif"))); 
}};