2012-04-03 75 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"))); 
}};