を使用するImageIcon
ことは、おそらく最も簡単なことです。次の点に注意してください。
したがって、問題はToolkit
( ImageIO
is a different beast) の使用ではなく、完全にロードされた画像をレンダリングしていないという事実かもしれません。試してみる興味深いことの1つは次のとおりです。
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://i.stack.imgur.com/iQFxo.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);
}
});
}
}