【问题标题】:how use animated gif as JFrame title bar icon如何使用动画 gif 作为 JFrame 标题栏图标
【发布时间】:2012-04-17 15:48:39
【问题描述】:

是否可以使用动画 .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 图标,但一切正常。

【问题讨论】:

    标签: java animation icons jframe titlebar


    【解决方案1】:

    我曾尝试通过将图标图像设置为动画 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 图标设置动画。我想这段代码可能不是“最佳实践”材料,但是,它可以工作。关于实现的附带说明,我创建了一个名为 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"))); 
    }};
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-23
      • 2011-09-18
      • 2023-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多