我嘗試了一段時間,讓我的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")));
}};