2012-04-03 1 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. Я предполагаю, что этот код, вероятно, не является материалом «лучшей практики», однако он работает. Замечание о реализации, я сделал отдельный класс под названием «Изображения», который просто загружает мои изображения в 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"))); 
}};