2012-03-22 9 views
5

मेरे पास यह विधि पेंट() है जो ग्राफिक्स 2 डी पैरामीटर प्राप्त करती है। अजीब बात यह है कि जब तक कोई System.out.println मौजूद नहीं होता है (जो मैं नीचे दिए गए ब्लॉक में टिप्पणी करता हूं), कैनवास कुछ भी नहीं खींचागा।कोड ग्राफ़ में System.out.println होने तक मेरा ग्राफिक्स कोड क्यों नहीं चलता है?

public class Map{ 

    public void paint(Graphics2D g){ 

     //fill background to black 
     g.setColor(Color.black); 
     g.fillRect(0, 0, TILE_SIZE*WIDTH, TILE_SIZE*HEIGHT); 

     //draw the tiles and buildings 

     for(int i=0;i<WIDTH;i++){ 
      for(int j=0;j<HEIGHT;j++){ 
       if(map[j][i] == CLEAR){ 
        //System.out.println(""); 
        g.setColor(Color.gray); 
        g.fillRect(i*TILE_SIZE, j*TILE_SIZE, TILE_SIZE, TILE_SIZE); 
        g.setColor(Color.red); 
        g.drawRect(i*TILE_SIZE, j*TILE_SIZE, TILE_SIZE, TILE_SIZE); 

       } 
      } 
     } 
    } 
} 

यहां मैं कैनवास पर आकर्षित करने और इसे फ्रेम में जोड़ने के लिए बफरस्ट्रेटी का उपयोग करता हूं। यह विधि क्लास मैप में है जिसे BufferStrategy से getDrawGraphics() विधि से ग्राफिक्स 2 डी पारित किया जाएगा (मुझे उम्मीद है कि कई लोग इस बात से परिचित हैं कि मैं क्या कर रहा हूं)।

public class MapTest extends Canvas{ 

    private Map map; 

    public MapTest(){ 

     Frame frame = new Frame("MAP"); 
     frame.add(this); 
     frame.setVisible(true); 

     createBufferStrategy(2); 
     strategy = getBufferStrategy(); 

     //draw the map 

     Graphics2D g = (Graphics2D) strategy.getDrawGraphics(); 
     //g.translate(100, 100); 
     map.paint(g); 

     g.dispose(); 
     strategy.show(); 

    } 
} 

यह कोड कैनवास वर्ग से है। जैसा कि आप देख सकते हैं कि पेंट() विधि कैनवास वर्ग से अलग है (जिसे मैं गेमटेस्ट नाम देता हूं)। इसलिए यदि मैं println कथन पर टिप्पणी करता हूं तो कैनवास में कोई ग्राफिक्स नहीं दिखाया जाता है, अन्यथा यह सही तरीके से प्रदर्शित होता है। कोई मुझे मदद कर सकता है???

+7

एक बात जो मेरे दिमाग में आती है वह यह है कि मुझे इसके बारे में इसी तरह के मुद्दे थे, और पता चला है कि 'System.out.println()' थ्रेड सिंक्रनाइज़ेशन का कारण बनता है। – everton

+0

मुझे पता है कि यह एक गंभीर मुद्दा है, और आपको कुछ उत्तरों की आवश्यकता है, लेकिन जब मैं आपका प्रश्न विषय पढ़ता हूं तो मैं एलओएल का विरोध नहीं कर सकता :) – dbrin

+2

यूप, थ्रेड सिंक्रनाइज़ेशन समस्या की तरह लगता है। मैं अनुमान लगा रहा हूं कि आप ईवेंट-प्रेषण धागे के अलावा किसी अन्य धागे से इसे बुला रहे हैं, जो इस प्रकार की अधिकांश बग का कारण है। विषय की एक अच्छी अच्छी चर्चा के लिए http://en.wikipedia.org/wiki/Event_dispatching_thread पर एक नज़र डालें। – GreyBeardedGeek

उत्तर

2

आपको इवेंट डिस्पैच थ्रेड (ईडीटी) पर स्विच करने के लिए स्विंग यूटिलिटीज का उपयोग करना चाहिए, नीचे देखें। एडब्ल्यूटी और स्विंग कक्षाओं के साथ लगभग सभी बातचीत के लिए यह आवश्यक है।

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

सूचना है कि यह एक स्विंग सहायक पुस्तकालय का उपयोग करता है, कि AWT के लिए ठीक होना चाहिए, लेकिन और भी बेहतर स्विंग का उपयोग शुरू करने के लिए है।

+0

आपके उत्तर के लिए धन्यवाद लेकिन यह अभी भी कुछ भी नहीं दिखा रहा है :(मुझे लगता है कि समस्या थ्रेड सिंक्रनाइज़ेशन की वजह से नहीं है। असल में मेरा कोड cokeandcode.com से ट्यूटोरियल पर आधारित है और साइट का कोड पूरी तरह से चलता है! (कोई invokeLater() सामान के साथ) –

+1

आप परीक्षण कर सकते हैं अगर यह स्विंग से 'जेपीनेल' का उपयोग करते समय ठीक से काम करता है। (क्या आपका नक्शा वर्ग जेपीनल का विस्तार करता है और जोड़ता है यह एक जेएफआरएएम के लिए)। जेपीनेल को डिफ़ॉल्ट रूप से डबल बफर किया जाता है और पेंट फ़ंक्शन संगत दिखता है। इस तरह आप देख सकते हैं कि समस्या BufferedStrategy में है या नहीं। – Thirler

+0

यह काम करता है !! मैं मानचित्र को जेपीनेल में बदलता हूं और इसे जेएफआरएएम में जोड़ता हूं और सभी BufferStrategy सामान को हटाएं और सब ठीक काम किया! तो समस्या BufferStrategy में सही है ?? लेकिन क्या गलत हो सकता है ?? क्यों BufferStrategy एक println()? –

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