在Swing中显示animationBG

一个animation(循环)GIF可以显示在JLabel或HTML(格式化的文本组件,如JEditorPane ),并被看作循环。

但是要加载一个图像作为容器的背景,我通常会使用ImageIO.read()Toolkit.getImage() (后者当我怀念上一个千年时)。 加载图像的方法都不是循环图像,通常只是第一帧。

如何加载animation图像的背景?

使用ImageIcon可能是最直接的事情。 请记住几件事情:

  • ImageIcon(URL)本身使用Toolkit.getImage(URL) 。 您可能更喜欢使用Toolkit.createImage(URL)getImage()可能使用caching或共享的图像数据。

  • ImageIcon利用MediaTracker来有效地等待图像完全加载。

所以,你的问题可能不是使用ToolkitImageIO是一个不同的野兽),而是你没有渲染一个完全加载的图像的事实。 一个有趣的尝试将是:

 Image image = f.getToolkit().createImage(url); //... ImagePanel imagePanel = new ImagePanel(image); imagePanel.prepareImage(image, imagePanel); //... 

我的Swing / AWT / J2D可能有点模糊,但是这个想法是因为你的ImagePanel是一个ImageObserver ,它可以被asynchronous地通知图像信息。 Component.imageUpdate()方法应根据需要调用repaint

编辑:

正如在评论中指出的那样, prepareImage调用不是必需的 – 下面是一个工作示例。 关键是重写的paintComponent方法调用Graphics.drawImage ,它提供了ImageObserver钩子。 imageUpdate方法(在java.awt.Component实现)将不断地调用ImageObserver.FRAMEBITS标志。

 import java.awt.EventQueue; import java.awt.Graphics; import java.awt.GridLayout; import java.awt.Image; import java.awt.image.ImageObserver; import java.net.MalformedURLException; import java.net.URL; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; public class ImagePanel extends JPanel { private final Image image; public ImagePanel(Image image) { super(); this.image = image; } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(this.image, 0, 0, getWidth(), getHeight(), this); } public static void main(String[] args) throws MalformedURLException { final URL url = new URL("http://pscode.org/media/starzoom-thumb.gif"); EventQueue.invokeLater(new Runnable() { @Override public void run() { JFrame f = new JFrame("Image"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setLocationByPlatform(true); Image image = f.getToolkit().createImage(url); ImagePanel imagePanel = new ImagePanel(image); imagePanel.setLayout(new GridLayout(5, 10, 10, 10)); imagePanel.setBorder(new EmptyBorder(20, 20, 20, 20)); for (int ii = 1; ii < 51; ii++) { imagePanel.add(new JButton("" + ii)); } f.setContentPane(imagePanel); f.pack(); f.setVisible(true); } }); } } 

为了获得一个骑自行车(animation)GIF的自定义绘画,一个窍门是加载它使用ImageIcon 。 虽然从问题中列出的两种方法之一返回的图像是静态的,但是从ImageIcon获得的ImageIcon是animation的。

下面的代码将添加50个button,然后紧接在“缩放星号”的框架之后,将GIF 1animation为BG。 ImagePanel会将图像拉伸到面板的大小。

  1. 它基于这个图像。

缩放星星GIF

 import java.awt.*; import javax.swing.*; import javax.swing.border.EmptyBorder; import java.net.URL; class ImagePanel extends JPanel { private Image image; ImagePanel(Image image) { this.image = image; } @Override public void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(image,0,0,getWidth(),getHeight(),this); } public static void main(String[] args) throws Exception { URL url = new URL("http://i.stack.imgur.com/iQFxo.gif"); final Image image = new ImageIcon(url).getImage(); SwingUtilities.invokeLater(new Runnable() { public void run() { JFrame f = new JFrame("Image"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setLocationByPlatform(true); ImagePanel imagePanel = new ImagePanel(image); imagePanel.setLayout(new GridLayout(5,10,10,10)); imagePanel.setBorder(new EmptyBorder(20,20,20,20)); for (int ii=1; ii<51; ii++) { imagePanel.add(new JButton("" + ii)); } f.setContentPane(imagePanel); f.pack(); f.setVisible(true); } }); } } 

我设法得到我的JPanel里面的animationgif:

 private JPanel loadingPanel() { JPanel panel = new JPanel(); BoxLayout layoutMgr = new BoxLayout(panel, BoxLayout.PAGE_AXIS); panel.setLayout(layoutMgr); ClassLoader cldr = this.getClass().getClassLoader(); java.net.URL imageURL = cldr.getResource("img/spinner.gif"); ImageIcon imageIcon = new ImageIcon(imageURL); JLabel iconLabel = new JLabel(); iconLabel.setIcon(imageIcon); imageIcon.setImageObserver(iconLabel); JLabel label = new JLabel("Loading..."); panel.add(iconLabel); panel.add(label); return panel; } 

这种方法的一些观点:
1.图像文件在jar中;
2. ImageIO.read()返回一个BufferedImage,它不更新ImageObserver;
3.查找捆绑在jar文件中的图像的另一种方法是,请求Java类加载器(加载程序的代码)获取文件。 它知道事情在哪里。

所以通过这样做,我可以在我的JPanel中获得我的animationgif,它的function就像一个魅力。