2012-05-31 14 views
9

में एनिमेटेड बीजी दिखाएं एक एनिमेटेड (साइकलिंग) जीआईएफ JLabel या एचटीएमएल में प्रदर्शित किया जा सकता है (प्रारूपित पाठ घटकों जैसे JEditorPane) और चक्र में देखा जा सकता है।स्विंग

लेकिन एक कंटेनर की पृष्ठभूमि के रूप पेंट करने के लिए एक छवि लोड करने के लिए, मैं आम तौर पर प्रयोग करेंगे या तो ImageIO.read() या Toolkit.getImage() (उत्तरार्द्ध जब मैं पिछले सहस्राब्दी के लिए उदासीन महसूस कर रहा हूँ)। साइक्लिंग छवि में छवि परिणामों को लोड करने की कोई भी विधि नहीं, यह आमतौर पर केवल पहला फ्रेम होता है।

पृष्ठभूमि के लिए एनिमेटेड छवि कैसे लोड करें?

उत्तर

10

का उपयोग 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); 
      } 
     }); 
    } 
} 
+0

ग्रेट कैच। 'Toolkit.createImage (URL) 'का परीक्षण' नई छवि आइकन (यूआरएल) के लिए प्रत्यक्ष 'ड्रॉप-इन' प्रतिस्थापन के रूप में किया गया है .getImage()' और छवि भी साइकिल चलती है। ध्यान दें कि मैंने 'तैयार छवि' को कॉल करने के लिए परेशान नहीं किया था। –

+0

मैं कल अपनी प्रतिक्रिया संपादित करूंगा, लेकिन मैंने यह भी देखा कि मैंने जो परीक्षण बनाया है (आपके कोड का एक संशोधित संस्करण) को तैयार करने की आवश्यकता नहीं है IMage कॉल। मेरा मानना ​​है कि Graphics.drawImage पर कॉल ImageObserver हुक प्रदान करता है ... – kschneid

+0

अभी केवल संपादन को देखा गया है। मैंने सोचा कि यह मेरा पहला कैननिकल क्यू एंड ए हो सकता है, लेकिन यह पता चला कि आपका जवाब बेहतर है! मुझे यकीन नहीं है कि किसी भी व्यक्ति को अधिक जानकारी के साथ ढूंढने में परेशान होना या परेशान होना है या नहीं। (कुछ क्षणों को और अधिक समझता है ..) ठीक है, मैं खुश हूं। आपके उत्तर के लिए धन्यवाद। :) –

14

कस्टम चित्रकला के लिए एक साइकिल चालन (एनिमेटेड) GIF प्राप्त करने के लिए, एक चाल एक ImageIcon का उपयोग कर इसे लोड करने के लिए है। हालांकि प्रश्न में सूचीबद्ध दो विधियों में से किसी एक छवि से लौटाई गई छवि स्थिर है, ImageIcon से प्राप्त एक एनिमेटेड है।

नीचे दिए गए कोड में 'ज़ूमिंग सितारों' एनिमेटेड जीआईएफ के बीजी के रूप में फ्रेम के बाद 50 बटन जोड़े जाएंगे। ImagePanel छवि को पैनल के आकार में खींच देगा।

  1. यह इस छवि पर आधारित है।

Zooming Stars GIF

import java.awt.*; 
import javax.swing.*; 
import javax.swing.border.EmptyBorder; 
import java.net.URL; 

class ImagePanel extends JPanel { 

    private Image image; 

    ImagePanel(Image image) { 
     this.image = image; 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawImage(image,0,0,getWidth(),getHeight(),this); 
    } 

    public static void main(String[] args) throws Exception { 
     URL url = new URL("http://i.stack.imgur.com/iQFxo.gif"); 
     final Image image = new ImageIcon(url).getImage(); 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       JFrame f = new JFrame("Image"); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       f.setLocationByPlatform(true); 

       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); 
      } 
     }); 
    } 
} 
+0

एक [एसएससीसीई] पोस्ट करने के लिए (http://sscce.org/) – mKorbel

+0

इस साफ एसएससीसीई के लिए धन्यवाद, मुझे पता नहीं था कि ImageIcon एक .gif की एनीमेशन प्रदर्शित करने में सक्षम था। मैं बहस कर रहा था कि मुझे अपने जीयूआई में एक एनिमेटेड तस्वीर जोड़नी चाहिए और अब मुझे पता है कि अगर मैं इसे जोड़ना चाहता हूं तो यह आसान होगा। – WilliamShatner

1

मैं अपने JPanel के अंदर इस तरह ऐनिमेटेड gif पाने में कामयाब रहे
1. छवि फ़ाइल जार के भीतर है;
2. ImageIO.read() एक BufferedImage देता है, जो ImageObserver अद्यतन नहीं करता है;
3. जार फ़ाइल में बंडल की गई छवियों को ढूंढने का एक और विकल्प जावा क्लास लोडर से पूछना है, जो कोड आपके प्रोग्राम को लोड करता है, फाइलें प्राप्त करने के लिए। यह जानता है कि चीजें कहां हैं।

तो ऐसा करके मैं अपने जेपीनेल के अंदर अपना एनिमेटेड gif प्राप्त करने में सक्षम था और यह एक आकर्षण की तरह काम करता था।