使用
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://pspre.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); } }); }}


