में तत्काल लेआउट और पेंट को बल दें, मैं स्विंग में एक लेआउट को मजबूर नहीं कर सकता। मेरे पास JComponent
JLayeredPane
में जोड़ा गया है और मैंने JComponent
पर सीमा निर्धारित की है। फिर, मैं तुरंत सब कुछ फिर से खींचना चाहता हूं - invalidate()
की तरह "कृपया इस एप को करें", लेकिन सिंक्रनाइज़ और तत्काल। कोई मदद? मुझे ऐसा करने का सही तरीका नहीं दिख रहा है, और invalidate(), validate(), repaint(), doLayout(), etc
के बारे में मेरी सभी पढ़ाई सिर्फ मुझे और भ्रमित कर रही है!स्विंग
स्विंग
उत्तर
प्रदर्शन को अपडेट करने के लिए स्विंग प्राप्त करने का सबसे विश्वसनीय तरीका SwingUtilities.invokeLater
का उपयोग करना है। आपके मामले में, ऐसा लगता है जैसे
SwingUtilities.invokeLater(new Runnable {
public void run() {
somecomponent.repaint();
}
});
मुझे पता है 'invokelater' बिल्कुल नहीं लग रहा है जैसे कि यह कुछ भी तत्काल करता है कुछ ऐसा दिखाई देगा, लेकिन व्यवहार में, घटनाओं को इस तरह से तैनात बस जैसे बुला लिए बहुत जल्दी से तुलना पर अमल करते हैं सीधे somecomponent.repaint()
। यदि आपको पूरी तरह से जीयूआई अपडेट करने के लिए अपना कंट्रोल कोड इंतजार करना है, तो invokeAndWait
भी है, लेकिन मेरा अनुभव यह है कि यह शायद ही कभी आवश्यक है।
यह भी देखें: document on event dispatch स्विंग में।
this के अनुसार (चित्र "सिंक्रोनस पेंटिंग" शीर्षक वाला अनुभाग देखें) पेंट तुरंत() विधि को काम करना चाहिए।
मैंने यह कोशिश की है - myComponent.paintImedimedi (myComponent.getBounds)। कोई भाग्य नहीं :(मुझे लगता है कि ऐसा इसलिए हो सकता है क्योंकि सीमा को बदलने के लिए ऑब्जेक्ट – Hamy
पेंट के प्रत्येक पक्ष पर कुछ अतिरिक्त पिक्सेल का उपयोग करके सीमा के कारण एक नया लेआउट पास होना आवश्यक है। तुरंत जाने का रास्ता हो सकता है, लेकिन आपको अभी भी इसे एक पोस्ट के रूप में पोस्ट करने की आवश्यकता है InvokeLater या invokeAndWait का उपयोग कर घटना, मुझे लगता है। – phooji
@ हैमी क्या आपने इसे मूल घटक पर कॉल करने का प्रयास किया है, जो लेआउट परिवर्तन की अनुमति दे सकता है। – Jonathan
दुर्भाग्यवश उनमें से कोई भी मेरे प्रभाव के लिए काम नहीं करेगा:/मुझे तुरंत होने के लिए जीयूआई अपडेट की आवश्यकता है, लंबित घटनाओं के संसाधित होने के बाद नहीं। यह मेरे डिजाइन में एक दोष के कारण है कि मुझे इस तरह की ज़रूरत है, लेकिन दुर्भाग्यवश इसे बदलकर मुझे लगभग दो सप्ताह वापस सेट कर दिया जाएगा और मेरे पास कल डिलीवर करने योग्य है:/ – Hamy
ठीक है इसे आजमाएं: invokeAndWait का उपयोग करें, फिर रननेबल कॉल पेंट के अंदर तुरंत बाहरी कंटेनर। मुझे लगता है कि यह स्विंग का उपयोग कर जितना करीब हो सकता है - अगर मैं गलत नहीं हूं तो यह पिछले कॉल को 'पेंटेंट' करने के लिए ओवरराइड करेगा। – phooji
दुर्भाग्य से यह काम नहीं किया। InvokeAndWait को कॉल करने के लिए आपको एक नया थ्रेड बनाना होगा। मेरे पास इस पेंटिंग के तुरंत बाद एक * बहुत धीमी घटना हो रही है, और यह चलने योग्य होने से पहले निष्पादन शुरू होता है, जिसके परिणामस्वरूप जीयूआई फ्रीजिंग के बिना इस पेंट कॉल को अभी तक किया गया है – Hamy