2012-04-03 12 views
3

Ist es möglich, ein animiertes GIF-Bild als Symbol eines JFrame zu verwenden?Wie funktioniert das animierte GIF als JFrame-Titelleistensymbol?

Beispiel:

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); 

    ... 
} 

Diese Methode hat sich für mich nicht funktioniert. Die Anwendung hängt, bevor der JFrame sichtbar gemacht wird. Alles funktioniert jedoch gut mit einem regulären GIF-Symbol.

Antwort

4

Ich habe vor einiger Zeit versucht, das Symbol meines JFrames animiert zu haben, indem ich das Symbolbild auf ein animiertes GIF gestellt habe. Ich könnte das nie zur Arbeit bringen. Ich habe mir allerdings eine Arbeit ausgedacht. Keine Garantie für Korrektheit oder Fadensicherheit.

Die Grundidee besteht darin, einen separaten Thread für die Symbolanimation zu verwenden. Die Aufgabe dieses Threads besteht darin, das Symbolbild des Frames ständig festzulegen.

Dies ist ein Demo-Rahmen:

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); 

} 
} 

Dies ist das Symbol Animator Klasse:

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; 
      } 
     } 
    } 
} 
}  

Mit dieser IconAnimator Klasse, ich habe es den Zielrahmen eine Liste der Bilder geben kann, und die Zeit zwischen den Bildern und animiert das JFrame-Symbol. Ich stelle mir vor, dass dieser Code wahrscheinlich kein "best practices" Material ist, aber es funktioniert. Eine Randnotiz zur Implementierung, ich habe eine separate Klasse namens Images, die nur meine Bilder in eine ArrayList lädt. Jedes Bild ist 16x16. Die Listendeklaration dieser Klasse sieht folgendermaßen aus:

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"))); 
}}; 
Verwandte Themen