2011-03-24 5 views
6

अधिकांश जावा प्रोग्रामर जानते हैं कि स्विंग जीयूआई के अपडेट केवल एडब्ल्यूटी ईवेंट प्रेषण धागे पर ही किए जाने चाहिए और सिफारिश यह है कि लंबे समय से चलने वाली प्रक्रियाओं को "कार्यकर्ता" धागे पर निष्पादित किया जाना चाहिए, SwingUtilities.invokeAndWait() या SwingUtilities.invokeLater() का उपयोग कर थ्रेड प्रेषण धागे को भेजे गए अपडेट के साथ।वर्किंग थ्रेड में जावा स्विंग उपयोगकर्ता को अवरुद्ध करने के लिए पैटर्न

लंबी अवधि की प्रक्रिया पूरी होने पर उपयोगकर्ता को एप्लिकेशन के साथ आगे बढ़ने से कैसे रोकें? क्या आप नियंत्रण को भूरे रंग से बाहर करते हैं और फिर ऊपर वर्णित SwingUtilities कॉल का उपयोग करके कार्यकर्ता धागा को पुन: सक्षम करते हैं?

क्या कोई बेहतर वैकल्पिक पैटर्न है?

+1

उपयोगकर्ता को एप्लिकेशन का उपयोग करने से आपको प्रतिबंधित करने की आवश्यकता क्यों है?यदि संभव हो तो आप ऐसा करने से बचना चाहते हैं और उन्हें जारी रखने की अनुमति देते हैं। यदि आपको बिल्कुल एक मोडल संवाद के बारे में क्या करना है? आप नियंत्रण भी अक्षम कर सकते हैं। – justkt

+0

अच्छा सवाल। मुझे प्रोग्रेस मॉनिटर को छोड़कर कोई मानक जवाब नहीं पता है। – keuleJ

+0

@justkt: यदि लंबी चलती प्रक्रिया उस चीज़ को प्रभावित करती है जो दिखा रहा है, तो शायद मैं ऑपरेशन को रद्द करने के अलावा उपयोगकर्ता को कुछ और नहीं करना चाहूंगा। आमतौर पर मैं "रद्द करें" बटन को छोड़कर बटन, इत्यादि के साथ एक मोडल संवाद करता हूं, लेकिन मैं एक और सामान्य पैटर्न की उम्मीद कर रहा हूं। – Ralph

उत्तर

3

मैं 3 समाधान पर विचार करेंगे:

  • पैनल के घटकों को अक्षम: यह आम तौर पर है कि मुझे क्या करना। दुर्भाग्यवश, स्विंग पैनल और उसके सभी बच्चों को अक्षम करने का एक आसान तरीका प्रदान नहीं करती है, लेकिन रिकर्सन करना आसान है (इसके लिए this other SO answer देखें)। एक और समस्या यह है कि सक्षम और अक्षम होने पर कुछ स्विंग घटक समान दिखते हैं (उदाहरण के लिए जेएलआईस्ट)
  • कार्डलायआउट के साथ पैनल को छुपाएं: CardLayout वाले पैनल में, 2 घटक जोड़ें। पहला पैनल है जो घटकों को निष्क्रिय करने के लिए होस्ट करता है, और दूसरा एक पैनल है जो "लोडिंग" या "कृपया प्रतीक्षा करें" संदेश दिखा रहा है। एक JLabelGridbaglayout में एक चाल है। फिर, आपको बस एक से दूसरे में स्विच करना होगा। मैं इस तकनीक का उन स्थानों के लिए उपयोग करता हूं जहां गणना/अनुरोध का परिणाम प्रदर्शित होना है।
  • माउस के ईवेंट का उपयोग करने वाले पैनल के शीर्ष पर किसी प्रकार का घटक डालें: आप इसे LayeredPane के साथ स्वयं कर सकते हैं, या आप एक समर्पित उपयोगिता का उपयोग कर सकते हैं। JXLayer ऐसा कर सकता है (मैंने पढ़ा है कि जेएक्सलेयर जावा 7 में शामिल किया जाएगा, इसलिए यह इस तरह की समस्या का 'मानक' समाधान बन सकता है)।
0

एक तरीका मैंने इसे देखा है Jframe.setGlassPane() का उपयोग करना और एक घटक सेट करना जो सभी घटनाओं को खाता है। आप क्रिएटिव भी हो सकते हैं और अपने ग्लासपाइन में फ्लैशिंग रोटेटिंग-प्रतीक्षा गीफ का उपयोग कर सकते हैं। लेकिन ध्यान दें कि एक ग्लास फलक सेट करना आप सब कुछ नहीं हो सकता है। अधिक उन्नत आवश्यकताओं के लिए, आपको ईवेंट-कतारों के साथ खेलना पड़ सकता है।

2

कई तरीके हैं और इनमें से चयन, जो आपके जीयूआई के डिजाइन और लेआउट पर निर्भर करता है।

  • उपयोग एक प्रगति बार - पैनल या एक क्षेत्र है कि आप एक उपयोगकर्ता एक प्रगति बार के साथ छू नहीं करना चाहती बदलें। यह आपको उन घटनाओं से निपटने से रोक देगा जो आप अभी तक नहीं चाहते हैं, जबकि अभी भी उपयोगकर्ता को यह स्पष्ट कर रहा है कि पृष्ठभूमि में कुछ हो रहा है।
  • बटन अक्षम करें और प्रतीक्षा करें कर्सर - काम करने के दौरान सेटएनेबल (झूठी) का उपयोग करें और संभवतः कर्सर को प्रतीक्षा कर्सर में बदलें। यह फिर से यह स्पष्ट करता है कि एक विकल्प अभी तक अस्थायी अवधि के लिए उपलब्ध नहीं है।
  • घटनाओं का जवाब न दें या ग्लासपेन फेंक दें - यह कम उपयोगकर्ता-मित्र है क्योंकि यह एप्लिकेशन को उत्तरदायी नहीं दिखता है, हालांकि यह कुछ स्थितियों में स्वीकार्य हो सकता है।
संबंधित मुद्दे