2012-05-04 11 views
6

मैं लंबे समय तक डाउनलोड होने पर अपने फ्रेम के निचले बाएं कोने में एक अनिश्चित जेपी प्रोग्रेसबार एनिमेट करना चाहता हूं।बेसिक इंडेटर्मिनेट जेपी प्रोग्रेस बार उपयोग

मैंने कई ट्यूटोरियल देखे हैं, जिनमें से कोई भी मुझे स्पष्ट नहीं है। पृष्ठभूमि में फ़ाइल डाउनलोड होने पर मैं बस इसे एनिमेट करना चाहता हूं। प्रत्येक तरीके से मैंने कोशिश की है, यह के बाद प्रगति पट्टी को एनिमेट नहीं करता है डाउनलोड डाउनलोड हो जाता है।

मुझे यह जानने में मदद चाहिए कि मेरा डाउनलोड() कॉल कहां रखा जाए।

class MyFunClass extends JFrame { 
    JProgressBar progressBar = new JProgressBar(); 

    public void buttonClicked() { 
    progressBar.setVisible(true); 
    progressBar.setIndeterminate(true); 

    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
     progressBar.setIndeterminate(true); 
     progressBar.setVisible(true); 

     // Do I do my download() in here?? 

    }}); 

    // Do download() here??? 
    progressBar.setVisible(false); 
    } 
} 

अग्रिम धन्यवाद!



समाधान

संपादित करें: जो लोग भविष्य में मेरे लिए एक समान मुद्दा है के लिए, यह एक बुनियादी समस्या के लिए बुनियादी उपाय है। यह मेरा कोड शब्दशः नहीं है, लेकिन एक सामान्य स्केच है। buttonClicked() के अंदर:

public void buttonClicked() { 
    class MyWorker extends SwingWorker(String, Object) { 
    protected String doInBackground() { 
     progressBar.setVisible(true); 
     progressBar.setIndeterminate(true); 

     // Do my downloading code 
     return "Done." 
    } 

    protected void done() { 
     progressBar.setVisible(false) 
    } 
    } 

    new MyWorker().execute(); 

} 
+0

आप http://docs.oracle.com/javase/tutorial/uiswing/components/progress.html पर एक नज़र भले ही यह जटिल लगता लेना चाहिए। आपको क्या करना है एक और थ्रेड (पृष्ठभूमि कार्यकर्ता) में डाउनलोड चलाएं। फिर मुख्य (gui) धागा प्रगतिबार एनीमेशन करता है। जिस तरह से आप इसे कर रहे हैं वास्तव में दूसरी तरफ है। – user845279

+1

कृपया कुछ समस्याएं ठीक करने के लिए मेरे उत्तर में ** संपादित करें ** ** देखें। –

उत्तर

9

आपके मौजूदा कोड एक पृष्ठभूमि धागे की कोई रचना से पता चलता है, बल्कि यह आपको स्विंग धागे पर कोड कतार की कोशिश कर रहा से पता चलता स्विंग धागा जिसके लिए कोई मतलब नहीं है के भीतर से यह समस्या (हालांकि कभी-कभी ऐसा होता है जब आप ऐसा करना चाहते हैं, लेकिन फिर, यहां नहीं)। सफल होने के लिए एकमात्र तरीका पृष्ठभूमि धागे का उपयोग करना है। मानक ओरेकल JProgressBar tutorial और Concurrency in Swing इस सब के माध्यम से चला जाता है।

मूल बात यह है कि आपको स्विंग थ्रेड से जेपी प्रोग्रेसबार अपडेट करना होगा, जो पृष्ठभूमि थ्रेड में आपकी लंबी चल रही प्रक्रिया करेगा, जैसे कि स्विंगवर्कर ऑब्जेक्ट द्वारा प्रदान किया गया। यहां सभी की समीक्षा करने के लिए हमारे पास बहुत सारे विवरण हैं, और इसलिए मैं जो कुछ कर सकता हूं वह एक लिंक प्रदान करता है, लेकिन ट्यूटोरियल की समीक्षा करने के बाद हम विवरणों को समझने में आपकी सहायता करने में प्रसन्न होंगे। ट्यूटोरियल की जांच करें और यदि आप अभी भी अटक गए हैं तो अपने विशिष्ट प्रश्नों के साथ वापस आएं।

संपादित करें 1
आप राज्य:

मैं सिर्फ buttonClicked() फ़ंक्शन के भीतर एक नया धागा वस्तु बना सकते हैं?

हाँ, आप buttonClicked()विधि के अंदर एक SwingWorker वस्तु बना सकते हैं और वहाँ यह निष्पादित कर सकते हैं।

बात यह है कि मेरे पास मेरी एपीआई और लाइब्रेरी है जो मैं जीयूआई विकसित कर रहा हूं, और यह एक थ्रेड में फ़ंक्शन कॉल को लपेटने के लिए एक लंबे समय तक काम करने की तरह लगता है।

क्षमा करें, लेकिन मुझे नहीं पता कि आप यहां क्या कह रहे हैं या आप क्या सोचते हैं थ्रेडिंग का कारण होगा। buttonClicked() विधि ईडीटी पर चलाना चाहिए और पृष्ठभूमि धागे में नहीं होना चाहिए।

यह भी ध्यान दें कि मेरे अधिकांश जटिल स्विंग जीयूआई में, मैं अक्सर अपनी फ़ाइल को एक अलग (मॉडल) ऑब्जेक्ट में डाउनलोड करता हूं और जीयूआई ऑब्जेक्ट (दृश्य) से एक अलग ऑब्जेक्ट (नियंत्रण) में अपने स्विंगवर्कर को बना देता हूं। ऐसा करने के लिए यह अधिक जटिल लग सकता है, लेकिन यह लॉट मेरे प्रोग्राम को डीबग, बनाए रखने और बढ़ाने के लिए आसान है, जब मैं इसे इस तरह से करता हूं, खासकर जब मैं इंटरफेस का उपयोग करता हूं ताकि मुझे सभी प्रोग्राम घटकों का परीक्षण करने की अनुमति मिल सके। अलगाव।

संपादित 2
अपने समाधान पोस्ट करने के लिए कुछ सुधार। आप पोस्ट:

public void buttonClicked() { 
    class MyWorker extends SwingWorker(String, Object) { 
    protected String runInBackground() { 
     progressBar.setVisible(true); 
     progressBar.setIndeterminate(true); 

     // ... 

जो समस्याओं

  • यह doInBackground(), नहीं runInBackground()
  • है, लेकिन अधिक महत्वपूर्ण बात, आप एक पृष्ठभूमि धागा भीतर से स्विंग कॉल कर रहे हैं, कुछ ऐसा है जो कभी नहीं किया जाना चाहिए (है जब तक कि कॉल थ्रेड सुरक्षित न हो, और फिर भी ...)।

तो इसे बदल:

public void buttonClicked() { 
    progressBar.setVisible(true); 
    progressBar.setIndeterminate(true); 
    class MyWorker extends SwingWorker<String, Void> { 
    protected String doInBackground() { 

     // ... 
+0

क्या मैं बस बटनक्लिड() फ़ंक्शन के भीतर एक नया थ्रेड ऑब्जेक्ट बना सकता हूं? बात यह है कि मेरे पास मेरी एपीआई और लाइब्रेरी है जो मैं जीयूआई विकसित कर रहा हूं, और यह थ्रेड में फ़ंक्शन कॉल को लपेटने के लिए एक लंबे समय तक काम करने की तरह लगता है। –

+0

@ बीवीबी .: कृपया ऊपर दिए गए मेरे उत्तर में संपादन 1 देखें। –

+0

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

संबंधित मुद्दे