2011-01-21 7 views
6

में तत्काल लेआउट और पेंट को बल दें, मैं स्विंग में एक लेआउट को मजबूर नहीं कर सकता। मेरे पास JComponentJLayeredPane में जोड़ा गया है और मैंने JComponent पर सीमा निर्धारित की है। फिर, मैं तुरंत सब कुछ फिर से खींचना चाहता हूं - invalidate() की तरह "कृपया इस एप को करें", लेकिन सिंक्रनाइज़ और तत्काल। कोई मदद? मुझे ऐसा करने का सही तरीका नहीं दिख रहा है, और invalidate(), validate(), repaint(), doLayout(), etc के बारे में मेरी सभी पढ़ाई सिर्फ मुझे और भ्रमित कर रही है!स्विंग

उत्तर

0

प्रदर्शन को अपडेट करने के लिए स्विंग प्राप्त करने का सबसे विश्वसनीय तरीका SwingUtilities.invokeLater का उपयोग करना है। आपके मामले में, ऐसा लगता है जैसे

SwingUtilities.invokeLater(new Runnable { 
          public void run() { 
           somecomponent.repaint(); 
          } 
          }); 

मुझे पता है 'invokelater' बिल्कुल नहीं लग रहा है जैसे कि यह कुछ भी तत्काल करता है कुछ ऐसा दिखाई देगा, लेकिन व्यवहार में, घटनाओं को इस तरह से तैनात बस जैसे बुला लिए बहुत जल्दी से तुलना पर अमल करते हैं सीधे somecomponent.repaint()। यदि आपको पूरी तरह से जीयूआई अपडेट करने के लिए अपना कंट्रोल कोड इंतजार करना है, तो invokeAndWait भी है, लेकिन मेरा अनुभव यह है कि यह शायद ही कभी आवश्यक है।

यह भी देखें: document on event dispatch स्विंग में।

+0

दुर्भाग्यवश उनमें से कोई भी मेरे प्रभाव के लिए काम नहीं करेगा:/मुझे तुरंत होने के लिए जीयूआई अपडेट की आवश्यकता है, लंबित घटनाओं के संसाधित होने के बाद नहीं। यह मेरे डिजाइन में एक दोष के कारण है कि मुझे इस तरह की ज़रूरत है, लेकिन दुर्भाग्यवश इसे बदलकर मुझे लगभग दो सप्ताह वापस सेट कर दिया जाएगा और मेरे पास कल डिलीवर करने योग्य है:/ – Hamy

+0

ठीक है इसे आजमाएं: invokeAndWait का उपयोग करें, फिर रननेबल कॉल पेंट के अंदर तुरंत बाहरी कंटेनर। मुझे लगता है कि यह स्विंग का उपयोग कर जितना करीब हो सकता है - अगर मैं गलत नहीं हूं तो यह पिछले कॉल को 'पेंटेंट' करने के लिए ओवरराइड करेगा। – phooji

+0

दुर्भाग्य से यह काम नहीं किया। InvokeAndWait को कॉल करने के लिए आपको एक नया थ्रेड बनाना होगा। मेरे पास इस पेंटिंग के तुरंत बाद एक * बहुत धीमी घटना हो रही है, और यह चलने योग्य होने से पहले निष्पादन शुरू होता है, जिसके परिणामस्वरूप जीयूआई फ्रीजिंग के बिना इस पेंट कॉल को अभी तक किया गया है – Hamy

2

this के अनुसार (चित्र "सिंक्रोनस पेंटिंग" शीर्षक वाला अनुभाग देखें) पेंट तुरंत() विधि को काम करना चाहिए।

+1

मैंने यह कोशिश की है - myComponent.paintImedimedi (myComponent.getBounds)। कोई भाग्य नहीं :(मुझे लगता है कि ऐसा इसलिए हो सकता है क्योंकि सीमा को बदलने के लिए ऑब्जेक्ट – Hamy

+0

पेंट के प्रत्येक पक्ष पर कुछ अतिरिक्त पिक्सेल का उपयोग करके सीमा के कारण एक नया लेआउट पास होना आवश्यक है। तुरंत जाने का रास्ता हो सकता है, लेकिन आपको अभी भी इसे एक पोस्ट के रूप में पोस्ट करने की आवश्यकता है InvokeLater या invokeAndWait का उपयोग कर घटना, मुझे लगता है। – phooji

+0

@ हैमी क्या आपने इसे मूल घटक पर कॉल करने का प्रयास किया है, जो लेआउट परिवर्तन की अनुमति दे सकता है। – Jonathan