java swing 动画_Java在Swing中显示动画BG

本文介绍了如何在Java Swing中使用ImageIcon显示动画。通过使用Toolkit创建Image并结合ImagePanel,可以实现在组件上异步加载和更新图像,从而达到动画效果。示例代码展示了一个简单的例子,创建了一个包含按钮的面板,并在背景中显示从URL加载的图像。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

小编典典

使用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()方法应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);

}

});

}

}

2020-03-05

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值