2012-07-18 34 views
5

पर क्लिक किया गया है मुझे अपने जेबटन एक्शनलिस्टर के साथ समस्या है। मेरे पास एक अन्य वर्ग में परिभाषित किया गया है() विधि जिसे मेरी जीयूआई में परिवर्तन की श्रृंखला बनाता है।जेबटन एक्शन लिस्टनर - जेबीटन के बाद जीयूआई अपडेट

public void doTheCleaning(){ 
    //change image icon 
    //had thread.sleep here 
    //insert to text area 
    //had thread.sleep here 
    //etc 
} 

फिर एक और कक्षा में, मैं कक्षा मेरी doTheCleaning() विधि युक्त instantiated और मेरे ActionListener मेरी jbutton इस तरह लिखा के लिए मेरे actionperformed() विधि के साथ लिखा था:

public void actionPerformed(ActionEvent e){ 
    //some code 
    //newClass.doTheCleaning(); 
} 

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

जब मैं जेबटन पर क्लिक करता हूं तो इन परिवर्तनों की आवश्यकता होने पर मुझे यह कैसे प्राप्त हो सकता है?

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

+0

क्या आपका मतलब है कि आपके पास लेबल और टेक्स्टरेस में कई बदलाव हैं और आप चाहते हैं कि उपयोगकर्ता प्रत्येक चरण को देखकर एक-एक करके हो? – darrenp

+0

आसान पढ़ने के लिए, कृपया वर्तनी नियमों के साथ चिपके रहें (वाक्य में पहला अक्षर पूंजीकृत होना चाहिए :-) – kleopatra

+2

अपने जीयूआई कोड के अंदर 'थ्रेड.sleep (...)' जैसे कॉल का उपयोग न करें। इसके बजाय इस उद्देश्य के लिए [javax.swing.TImer] (http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html) का उपयोग करें, हो सकता है कि आप अपनी सामग्री को ईडीटी - इवेंट डिस्पैच थ्रेड पर अपडेट न करें , यह आपकी मदद कर सकता है :-) –

उत्तर

12

EDT के भीतर कोई गहन परिचालन न करें, अन्यथा जीयूआई उत्तरदायी नहीं होगा और आपको जीयूआई अपडेट नहीं दिखाई दे सकते हैं। सबसे अच्छा विकल्प का उपयोग कर सकते SwingWorker है:

  • अवहेलना doInBackground(), और इस विधि के अंदर किसी भी लंबी कार्यवाही डाल इतना है कि यह EDT के बजाय एक अलग थ्रेड पर चलाया जाएगा।

  • किसी भी जीयूआई निर्माण या doInBackground() भीतर जीयूआई घटकों के राज्यों को बदलने के लिए, publish(V... chunks) का उपयोग process(List<V> chunks) को डेटा भेजने के। आपको process(List<V> chunks) ओवरराइड करने की आवश्यकता है। यह भी ध्यान रखें कि process(List<V> chunks)EDT पर निष्पादित किया गया है।

  • doInBackground() रिटर्न के बाद, done()EDT पर निष्पादित करता है और आप किसी भी जीयूआई अद्यतन के लिए इसका इस्तेमाल करने की यह ओवरराइड कर सकते हैं। आप get() का उपयोग करके doInBackground() से लौटाए गए मान को भी पुनर्प्राप्त कर सकते हैं।

  • ध्यान दें कि SwingWorker<T,V>generic है, और आपको प्रकार निर्दिष्ट करने की आवश्यकता है। TdoInBackground() और get() से लौटा ऑब्जेक्ट का प्रकार है, जबकि V पर publish(V... chunks) के माध्यम से आपके द्वारा पारित तत्वों का प्रकार है।

  • execute() विधि स्विंग कार्यकर्ता को पहले doInBackground() का आह्वान करके स्विंग कार्यकर्ता शुरू करती है।

इस पर और अधिक के लिए, कृपया Concurrency in Swing पढ़ें।

+1

यह एक अच्छा स्पष्टीकरण है :-) –

+5

सहमत, 1+। मैंने इसे [स्विंग ट्यूटोरियल में Concurrency] जोड़ने के लिए भी संपादित किया है (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html) लिंक। –

+0

@ होवरक्राफ्टफुलऑफेल धन्यवाद। –

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

  • कोई संबंधित समस्या नहीं^_^