दिलचस्प पोस्ट
क्या आप जावास्क्रिप्ट के साथ जीआईएफ एनिमेशन नियंत्रित कर सकते हैं? एंड्रॉइड पर डीबी कनेक्शन बंद करने के लिए कब? हर बार आपके ऑपरेशन के समाप्त होने या आपके ऐप के बाहर निकलने के बाद Android पर बूट पर एक सेवा शुरू करने की कोशिश कर रहा है क्या यह जीसीसी त्रुटि "… स्थानांतरित करने के लिए फिट करने के लिए छंटनी …" मतलब है? एंड्रॉइड ब्लूटूथ RFCOMM कनेक्शन को .connect () के तुरंत बाद मरने से कैसे रोकें? बड़े हिप को सही करने के क्या फायदे हैं? सेवा वर्ग से गतिविधि वर्ग विधि कॉलिंग क्यों विशेषता संदर्भ पायथन विरासत के साथ इस तरह काम करते हैं? ज़क्सिंग का उपयोग करते हुए QR कोड एन्कोडिंग और डिकोडिंग लिनक्स के लिए पायथन का उपयोग करके कुंजी प्रेस इवेंट का अनुकरण करना मेटायर कैसे प्राप्त करें। टेम्पलेट के लिए मूल्य वापस करने के लिए कॉल करें? कैसे समान _ टेक्स्ट काम करता है? एक ही समय में AVCaptureVideoDataOutput और AVCaptureMovieFileOutput का उपयोग कर सकते हैं? मैं स्विफ्ट में टाइप एरेज़ कैसे बढ़ा सकता हूं? एंड्रॉइड: Asynctask के साथ वेब से एक छवि लोड

स्विंग में एक एनिमेटेड बीजी दिखाएं

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

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

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

Solutions Collecting From Web of "स्विंग में एक एनिमेटेड बीजी दिखाएं"

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); //... 

मेरा स्विंग / एडब्ल्यूटी / जे 2 डी थोड़ी फजी हो सकती है, लेकिन यह विचार यह है कि चूंकि आपकी ImagePanel एक ImageObserver , इसलिए इसे सूचना के बारे में एसिंक्रोनस द्वारा सूचित किया जा सकता है। Component.imageUpdate() विधि को आवश्यकतानुसार पुनः repaint करना चाहिए।

संपादित करें:

जैसा कि टिप्पणियों में बताया गया है, तैयार करने के लिए prepareImage की आवश्यकता नहीं है – एक काम का उदाहरण नीचे शामिल है कुंजी यह है कि ओवरराइड ImageObserver विधि 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); } }); } } 

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

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

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

ज़ूमिंग स्टार्स जीआईएफ

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

मैं इस तरह से अपने जेपीएनएल के अंदर एनिमेटेड जीआईफ़ प्राप्त करने में कामयाब रहा हूं:

 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; } 

इस दृष्टिकोण के कुछ बिंदु:
1. छवि फ़ाइल जार के भीतर है;
2. ImageIO.read () एक BufferedImage देता है, जो ImageObserver को अपडेट नहीं करता है;
3. जार फ़ाइल में बंडल करने वाली छवियों को खोजने के लिए एक अन्य विकल्प है कि जावा क्लास लोडर, फाइल को पाने के लिए आपके प्रोग्राम को लोड किए गए कोड से पूछें। यह जानता है कि चीजें कहाँ हैं

इसलिए ऐसा करने से मैं अपने एनिमेटेड जीआईएफ़ को मेरे जेपीनल के अंदर ले गया और यह एक जादू की तरह काम किया।