multithreading - Java JProgressBar does not show up by setVisible(true) -


मेरे पास नीचे की तरह एक विधि है।

प्रोग्रेसवंडो एक उप वर्ग है JFrame वाले JProgressBar

addProgress () JProgressBar में एक मान बढ़ाता है।

यदि मैं इस विधि को किसी अन्य वर्ग में एक विधि से कहते हैं, तो प्रोग्रेसवंडो का एक फ्रेम दिखाई देगा लेकिन JProgressBar और कुछ JLabels < / कोड> फ्रेम के अंदर वे अंतिम पंक्ति ( System.out.println ("finish") ) के बाद दिखाई देते हैं।

अगर मैं इस पद्धति को इस विधि से युक्त वर्ग में एक मुख्य विधि में कॉल करता हूं, तब हर घटक (बार, लेबल ...) तुरंत दिखाई देता है।

मैं विंडो को सही ढंग से दिखाने के लिए क्या कर सकता हूं?

  स्थिर शून्य खोज () {प्रगति विंडो विंडो = नई प्रगतिविंडो (); window.setVisible (सही); निष्पादक सेवा निष्पादन = निष्पादक। एनएफ़फिक्सथाथपूल (रनटाइम .getRuntime)। उपलब्ध प्रोसेसर ()); संग्रह के & lt; प्रतिदेय & LT; शून्य & gt; & gt; प्रक्रियाओं = नई लिंक्डलिस्ट & lt; & gt; (); {Int i = 0; i & lt; 100; i ++) {processes.add (नया कॉल करने योग्य & lt; शून्य & gt; () {@ ओवरराइड पब्लिक व्हॉइड कॉल) अपवाद {progressWindow.addProgress (); // वेतन वृद्धि की प्रगति मान रिटर्न रिक्त ;}}); } {Execs.invokeAll (प्रक्रियाओं) का प्रयास करें; } पकड़ (अपवाद ई) {e.printStackTrace (); } अंत में {execs.shutdown (); } System.out.println ("समाप्त");  

मुख्य समस्या यह है कि आप खोज कॉल करने लगते हैं इवेंट डिस्पैचिंग थ्रेड के संदर्भ से।

समस्या तब होती है क्योंकि आप execs.invokeAll का उपयोग कर रहे हैं, जब तक कि सभी कॉलबल्स चलने समाप्त नहीं हो जाते

इसका मतलब यह है कि ईडीटी घटना पंक्ति में नई घटनाओं को संसाधित करने में असमर्थ है, जिसमें पुन: पेंट इवेंट शामिल हैं, यही कारण है कि आपका UI अभी भी एक स्टैंड पर आ रहा है ...

उन मुद्दों की संख्या जिनसे आप सामना कर रहे हैं ...

  1. आपको ईडीटी के अलावा किसी भी थ्रेड से यूआई घटक को अपडेट / संशोधित नहीं करना चाहिए
  2. आपको ईडीटी को ब्लॉक करना चाहिए किसी भी कारण से
  3. आपको पता लगाना है कि खोज कब पूर्ण हो गई है, तो आपको किसी प्रकार की घटना की सूचना की आवश्यकता है ...

हमारी पहली चीज़ खोज के पूरा होने के बारे में सूचित करने का कुछ तरीका है, इसका मतलब है कि आप खोज पर भरोसा नहीं कर सकते हैं जब खोज I पूर्ण है ...

  सार्वजनिक इंटरफ़ेस SearchListener {सार्वजनिक शून्य खोज} (); }  

इसके बाद हमें एक इंटरमीडिटी खोज विधि की आवश्यकता है जो यूआई बनाता है और यह सुनिश्चित करता है कि खोज अपने ही थ्रेड के भीतर शुरू की गई है .. ।

<पूर्व> स्थिर शून्य खोज (अंतिम खोज लिस्टनर श्रोता) {अंतिम प्रगति खिड़की खिड़की = नई प्रगतिविंडो (); window.setVisible (सही); थ्रेड टी = नया थ्रेड (नया रननाबल) {@ ओवरराइड पब्लिक वायड रन () (खोज (श्रोता, विंडो);}}); t.start (); }

फिर खोज पूर्ण होने पर अधिसूचना प्रदान करने के लिए हमें SearchListener इंटरफ़ेस का उपयोग करने के लिए मूल खोज विधि को संशोधित करने की आवश्यकता है। ।

<पूर्व> स्थिर शून्य खोज (अंतिम खोजलेखक श्रोता, अंतिम प्रगतिविंडो विंडो) {निष्पादक सेवा execs = निष्पादक। NewfixedThreadPool (रनटाइम .getRuntime)। उपलब्ध प्रोसेसर ()); संग्रह के & lt; प्रतिदेय & LT; शून्य & gt; & gt; प्रक्रियाओं = नई लिंक्डलिस्ट & lt; & gt; (); के लिए (इंट I = 0; i & lt; 100; i ++) {processes.add (नया कॉल करने योग्य & lt; शून्य & gt; () {@ ओवरराइड पब्लिक व्हॉइड कॉल) अपवाद फेंकता है {// इस पद्धति को यह सुनिश्चित करने की आवश्यकता है कि // यूआई के लिए करता है, यह एडीटी के संदर्भ के भीतर से किया जाता है; प्रगति; विन्डो.दिप प्रगति (); वापसी नल;}}); } {Execs.invokeAll (प्रक्रियाओं) का प्रयास करें; } पकड़ (अपवाद ई) {e.printStackTrace (); } अंत में {execs.shutdown (); } System.out.println ("समाप्त"); SwingUtilities.invokeLater (नई रननाबल) {@Override सार्वजनिक शून्य चला () {listener.searchCompleted ();}}); }

अब, addprogress के लिए स्रोत कोड के बिना , मुझे उपयोग करने का मोहक हो सकता है

  processes.add (नया कॉल करने योग्य & lt ; शून्य & gt; () {@ ओवरराइड पब्लिक व्हॉइड कॉल ()) अपवाद फेंकता {SwingUtilities.invokeLater (नई रननाबल) {@Override सार्वजनिक शून्य चला () {progressWindow.addProgress ();}}); वापसी नल;}}); }  

इसके बजाय ...

अधिक जानकारी के लिए एक नज़र डालें


Comments

Popular posts from this blog

sqlite3 - UPDATE a table from the SELECT of another one -

c# - Showing a SelectedItem's Property -

javascript - Render HTML after each iteration in loop -