java - Swing invokeLater never shows up, invokeAndWait throws error. What can I do? -
मैं इस कोड है:
try {SwingUtilities.invokeAndWait (नई Runnable () { सार्वजनिक शून्य चला () {try {dialog.handle डाउनलोड करें};} पकड़ (IOException io) {io.printStackTrace ();}}}); } पकड़ (अपवाद io) {io.printStackTrace (); } में हैंडल डाउनलोड करें
मैं एक इनपुटस्ट्रीम पढ़ रहा हूं, एक प्रगति पट्टी के मान की गणना कर रहा हूं, और उसे उस पर सेट कर रहा हूं। तो, जब मैं एक बटन क्लिक करें, एक नया JFrame खुल जाता है और सब सामान मैंने ऊपर लिखा है।
अगर मैं ( dialog.handleDownload
अपने आप में है कोई SwingUtilities विधि में ), ऑपरेशन समाप्त होने तक यह फ्रीज हो जाता है। अगर मैं इसे invokeLater
में जोड़ देता हूं तो यह बहुत तेजी से बंद हो जाता है (मैं कुछ भी नहीं देख सकता, और ऑपरेशन समाप्त नहीं हुआ है)। अगर मैं इसे invokeAndWait
में जोड़ता हूं तो मुझे invokeAndWait
प्राप्त होता है, जिसे इवेंट डिस्पैचर थ्रेड त्रुटि से नहीं कहा जा सकता। मुझे क्या करना चाहिए?
ऐसा लगता है कि आप इसका उपयोग कर सकते हैं यह आपको एक पृष्ठभूमि के थैले के लिए महंगी ऑपरेशन को स्थगित करने की अनुमति देता है (अपना जीयूआई प्रतिसादिता रखता है) और जब ऑपरेशन समाप्त हो जाता है, तो GUI को कुछ सामान करते हैं।
संपादित करें: उदाहरण < / p>
यहां है थोड़ा और अधिक जटिल उदाहरण से पता चलता है कि कैसे SwingWorker की मूल बातें, लेकिन यह भी प्रकाशित करने के लिए कैसे / प्रक्रिया मध्यवर्ती परिणाम।
public static void (String [] args उपयोग करने के लिए ) {अंतिम अंतराल आकार = 1024 * 1024; // 1 MiB // simulates एक 1 MiB फ़ाइल अंतिम InputStream = नया InputStream () {int read = 0; सार्वजनिक int पढ़ने () IOException फेंकता {if (read == SIZE) {return -1; } और (यदि (% 200 == 0 पढ़ें) {try {थ्रेड.sleep (1); } पकड़ (बाधित ईक्सेप्शन ई) {}} ++ पढ़ें; वापसी 5; }}}; अंतिम JProgressBar प्रगति = नया JProgressBar (0, SIZE); अंतिम जेबटन बटन = नया जेबटन ("प्रारंभ"); button.addActionListener (नई ActionListener () {@Override सार्वजनिक शून्य actionPerformed (ActionEvent ई) {button.setText ( "कार्य ..."); SwingWorker & LT; बाइट [], पूर्णांक & gt; कार्यकर्ता = नए SwingWorker & LT; बाइट [], पूर्णांक & gt; () {@Override संरक्षित बाइट [] doInBackground () फेंकता अपवाद {ByteArrayOutputStream baos = नए ByteArrayOutputStream (); बाइट [] शौकीन = नए बाइट [1024]; (-1 पढ़ int के लिए =, (पढ़ = in.read (शौकीन !)) = -1;) {baos.write (शौकीन, 0, पढ़ें); प्रकाशित (पढ़ें);} वापसी baos.toByteArray (); पूर्णांक & gt;} @Override शून्य प्रक्रिया (सूची के & lt संरक्षित हिस्सा) {int कुल = 0; के लिए (पूर्णांक मात्रा: भाग) {कुल + = amtRead;} Progress.setValue (progress.getValue () + कुल); } @ ओवरराइड सुरक्षित शून्य किया () {try {बाइट [] डेटा = get (); बटन .सेट टेक्स्ट ("पढ़ें" + डेटा। लैंप + "बाइट्स"); } पकड़ (अपवाद ई) {e.printStackTrace (); }}}; worker.execute (); }}); जेफ्रेम फ्रेम = नया जेफ्राम (); Frame.setLayout (नया बॉर्डर लेआउट ()); फ्रेम.एड (बटन, बॉर्डर लेआउट। नॉर्थ); फ्रेम। जोड़ें (प्रगति, बॉर्डर लेआउट। SOTH); frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); frame.pack (); frame.setVisible (सही); }
संपादित करें: उदाहरण के लिए एक प्रगति पट्टी को चलाने के लिए बदल दिया जैसा कि कोई डाउनलोड हो रहा था।
Comments
Post a Comment