2010-08-08 10 views
5

मेरे पास एक जेएफआरएएम के लिए एक सीधा बफरस्ट्रेटी है (मैंने जो सोचा था) है। यह बहुत की तरह बनाई गई है:"बफर नहीं बनाया गया है" ... बफर बनाने के दौरान

java.lang.IllegalStateException:

// Buffer 
    container.createBufferStrategy(2);   
    strategy = container.getBufferStrategy(); 

हालांकि, कभी कभी मैं निम्न त्रुटि (जो अपमानजनक आइटम के रूप में पिछले टुकड़ा की पहली पंक्ति के लिए अंक) प्राप्त बफ़र

यह त्रुटि असाधारण है क्योंकि यह आता है और जाता है - कभी-कभी यह ट्रिगर होता है, कभी-कभी नहीं। मैं संदिग्ध इसका मतलब है कि यह एक थ्रेडिंग समस्या है। क्या किसी के पास कोई संकेत है कि यहां क्या हो रहा है? मैं एक नुकसान में थोड़ा सा हूं, क्योंकि मैं पहले से ही ऐसा करने की कोशिश कर रहा हूं जो जावा कहता है कि वह मुझे करना चाहता है!

संपादित करें: पूर्ण ट्रेस: ​​

Exception in thread "main" java.lang.IllegalStateException: Buffers have not been created 
     at sun.awt.windows.WComponentPeer.getBackBuffer(WComponentPeer.java:877) 
     at java.awt.Component$FlipBufferStrategy.getBackBuffer(Component.java:3815) 
     at java.awt.Component$FlipBufferStrategy.updateInternalBuffers(Component.java:3800) 
     at java.awt.Component$FlipBufferStrategy.createBuffers(Component.java:3791) 
     at java.awt.Component$FlipBufferStrategy.<init>(Component.java:3730) 
     at java.awt.Component$FlipSubRegionBufferStrategy.<init>(Component.java:4253) 
     at java.awt.Component.createBufferStrategy(Component.java:3612) 
     at java.awt.Window.createBufferStrategy(Window.java:3015) 
     at java.awt.Component.createBufferStrategy(Component.java:3536) 
     at java.awt.Window.createBufferStrategy(Window.java:2990) 
+0

कृपया अपने प्रश्न के लिए एक पूर्ण स्टैक ट्रेस जोड़ने - यह * जो * विधि आईएसई फेंक है जानते हुए भी मदद करनी चाहिए। मैंने जेआर स्रोतों को देखा (1.7) लेकिन उस अपवाद के लिए संभावित स्रोत नहीं मिला। –

+0

क्या वाकई यह पूरा स्टैक ट्रेस है? हम सबूत ढूंढ रहे हैं कि आप ईडीटी से कॉल कर रहे हैं। आगे बढ़ें और * पूर्ण * स्टैक ट्रेस दिखाएं। –

+0

@ केविन दिवस, 'थ्रेड में अपवाद "मुख्य" सुझाव देता है कि यह ईडीटी से नहीं है। – finnw

उत्तर

1

घुमाओ घटकों डबल डिफ़ॉल्ट रूप से बफ़र हैं, इसलिए एक BufferStrategy के साथ चारों ओर खेलने के लिए कोई जरूरत नहीं है।

हालांकि जब आपको यादृच्छिक त्रुटियां मिलती हैं तो आमतौर पर क्योंकि ईडीटी पर कोड निष्पादित नहीं होता है। अधिक जानकारी के लिए Concurrency पर स्विंग ट्यूटोरियल से अनुभाग पढ़ें।

+0

मैं ग्राफिक्स को मैन्युअल रूप से अद्यतन करना पसंद करता हूं, इसलिए वास्तविक बफरस्ट्रेटी ऑब्जेक्ट तक पहुंच प्राप्त करने से यह बहुत सरल हो जाता है - ग्राफिक्स में आइटमों का एक भार खींचें, फिर केवल एक बार जब मैं करूँ तो रणनीति। शो() को कॉल करें। अगर यह चीजों को करने का एक भयानक तरीका है तो मुझे सही करो! मैं निश्चित रूप से Concurrency पर थोड़ा और पढ़ा होगा। –

+2

मैंने सोचा कि मेरे सुझाव ने BufferedStrategy का उपयोग करने की मेरी राय दिखायी है जो मुझे विश्वास है कि एडब्ल्यूटी का उपयोग करते समय सहायक हो सकता है लेकिन जैसा कि मैंने बताया है स्विंग अलग है। ट्यूटोरियल में "कस्टम पेंटिंग" पर एक अनुभाग भी है जिसे आपको देखना चाहिए – camickr

3

जब आप createBufferStrategy पर कॉल करते हैं तो फ्रेम को प्रदर्शित करने की आवश्यकता होती है। साथ ही कैमिकर ने बताया है कि आपको इसे ईडीटी से कॉल करने की आवश्यकता है।

एक तरीका यह सुनिश्चित करने के लिए JFrame का विस्तार करने और addNotify ओवरराइड करने के लिए है:

class MyFrame extends JFrame { 
    public void addNotify() { 
     super.addNotify(); 
     // Buffer 
     createBufferStrategy(2);   
     strategy = getBufferStrategy(); 
    } 
}