3

アニメーション化された.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

1 に答える 1

4

アイコン画像をアニメーションGIFに設定するだけで、しばらく前にJFrameのアイコンをアニメーション化してみました。私はそれを機能させることができませんでした。しかし、私は回避策を考え出しました。正確性やスレッドセーフについての保証はありません。

基本的な考え方は、アイコンアニメーションを処理する別のスレッドを用意することです。このスレッドの仕事は、フレームのアイコン画像を常に設定することです。

これはデモフレームです:

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アイコンをアニメーション化します。このコードはおそらく「ベストプラクティス」の資料ではないと思いますが、機能します。実装に関する補足として、画像をArrayListにロードするだけのImagesという別のクラスを作成しました。各画像は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"))); 
}};
于 2012-08-01T00:53:16.080 に答える