加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 在Swing中显示动画BG

发布时间:2020-12-15 00:48:30 所属栏目:Java 来源:网络整理
导读:动画(循环)GIF可以显示在JLabel或 HTML(格式化的文本组件,如JEditorPane)中,并被看到循环. 但是要加载一个图像作为容器的背景来绘制,我通常会使用ImageIO.read()或Toolkit.getImage()(当我在过去的一千年感觉到怀旧的时候).既不加载图像的方法也不会产生循环
动画(循环)GIF可以显示在JLabel或 HTML(格式化的文本组件,如JEditorPane)中,并被看到循环.

但是要加载一个图像作为容器的背景来绘制,我通常会使用ImageIO.read()或Toolkit.getImage()(当我在过去的一千年感觉到怀旧的时候).既不加载图像的方法也不会产生循环图像,通常只是第一帧.

如何加载背景的动画图像?

解决方法

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

ImageIcon(URL)本身使用Toolkit.getImage(URL).您可能更喜欢使用Toolkit.createImage(URL) – getImage()可能会使用缓存或共享的图像数据.
> ImageIcon利用MediaTracker有效地等待图像被完全加载.

所以,你的问题可能不是使用Toolkit(ImageIO是一个不同的野兽),而是事实上你没有渲染一个完整的图像.尝试一件有趣的事情是:

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

我的Swing / AWT / J2D可能有点模糊,但是想法是,由于您的ImagePanel是ImageObserver,因此可以异步通知图像信息. Component.imageUpdate()方法应根据需要调用重绘.

编辑:

如注释所述,不需要调用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,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));
                imagePanel.setBorder(new EmptyBorder(20,20,20));
                for (int ii = 1; ii < 51; ii++) {
                    imagePanel.add(new JButton("" + ii));
                }

                f.setContentPane(imagePanel);
                f.pack();
                f.setVisible(true);
            }
        });
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读