का उपयोग 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);
//...
मेरे घुमाओ/AWT/J2D थोड़ा फजी हो सकता है लेकिन विचार है कि के बाद से अपने ImagePanel
एक ImageObserver
है, यह छवि के बारे में जानकारी एसिंक्रोनस रूप से अधिसूचित किया जा सकता है। Component.imageUpdate()
विधि को आवश्यकतानुसार repaint
का आह्वान करना चाहिए।
संपादित करें:
टिप्पणी में बताया गया है, prepareImage
करने के लिए कॉल की आवश्यकता नहीं है - एक काम उदाहरण नीचे शामिल है। कुंजी यह है कि ओवरराइड paintComponent
विधि Graphics.drawImage
को आमंत्रित करती है, जो ImageObserver
हुक प्रदान करती है। imageUpdate
विधि (java.awt.Component
में लागू) लगातार ImageObserver.FRAMEBITS
ध्वज सेट के साथ लागू किया जाएगा।
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;
}
इस दृष्टिकोण से कुछ अंक:
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);
}
});
}
}
ग्रेट कैच। 'Toolkit.createImage (URL) 'का परीक्षण' नई छवि आइकन (यूआरएल) के लिए प्रत्यक्ष 'ड्रॉप-इन' प्रतिस्थापन के रूप में किया गया है .getImage()' और छवि भी साइकिल चलती है। ध्यान दें कि मैंने 'तैयार छवि' को कॉल करने के लिए परेशान नहीं किया था। –
मैं कल अपनी प्रतिक्रिया संपादित करूंगा, लेकिन मैंने यह भी देखा कि मैंने जो परीक्षण बनाया है (आपके कोड का एक संशोधित संस्करण) को तैयार करने की आवश्यकता नहीं है IMage कॉल। मेरा मानना है कि Graphics.drawImage पर कॉल ImageObserver हुक प्रदान करता है ... – kschneid
अभी केवल संपादन को देखा गया है। मैंने सोचा कि यह मेरा पहला कैननिकल क्यू एंड ए हो सकता है, लेकिन यह पता चला कि आपका जवाब बेहतर है! मुझे यकीन नहीं है कि किसी भी व्यक्ति को अधिक जानकारी के साथ ढूंढने में परेशान होना या परेशान होना है या नहीं। (कुछ क्षणों को और अधिक समझता है ..) ठीक है, मैं खुश हूं। आपके उत्तर के लिए धन्यवाद। :) –