2012-01-12 9 views
5

मैं एक जावा शुरुआत करने वाला हूं और अपनी पहली परियोजना के लिए मैंने एक एकाधिकार खेल बनाना शुरू कर दिया।जावा ग्राफिक्स समस्याएं

मैं ग्राफिक्स विधि का उपयोग कर स्विंग में जीयूआई बना रहा हूं।

दो समस्याएं दिखाई दीं जिन्हें मुझे कोई जवाब नहीं मिला।

पहला ऐसा लगता है कि ऐसा लगता है कि मैं अपने जेननेल में पृष्ठभूमि रंग सेट नहीं कर सकता जिसे मैंने पहले उसी प्रोजेक्ट में एक और जेपीनल में उसी तरह किया था।

दूसरा एक है कि मैं मिलता है एक NullPointerException जबकि एक image.I जोड़ने की कोशिश कर एक try/catch के साथ इस त्रुटि को दूर करने में कामयाब रहे, लेकिन ऐसा लगता है कि ग्राफिक्स paint.Again नहीं होगा मैं लोड करने के लिए एक ही विधि का उपयोग किया है और पिछले जेपीनल में छवियां जोड़ें और यह काम किया।

मुझे यह उल्लेख करना चाहिए कि इस समय मेरे जेएफआरएएम में अलग-अलग वर्गों में 3 तत्व शामिल हैं और सीमावर्ती() के माध्यम से जोड़े गए हैं।

इस वर्ग कि समस्याएं पैदा कर रहा है के लिए कोड है:

public class MonopolyBoard extends JPanel{ 


    Image atlantic; 
    MonopolyBoard() { 
     this.setBorder(new EtchedBorder()); 

     this.setBackground(new Color((80), (180), (210))); //this code dosent work 

     //this throws exception without try catch 
     try{ 
     ImageIcon a = new ImageIcon(this.getClass().getResource("../Card/Atlantic Ave.jpg")); 
     atlantic = a.getImage(); 
     } 
     catch(NullPointerException e){} 
     } 

    public void paint(Graphics g){ 

      } 
      Graphics2D g2 = (Graphics2D) g; 
     //this code should draw the image but it dosent 
      g2.drawImage(atlantic, 100, 100, null); 
      g.drawImage(atlantic, 100, 100, this); 

    }; 
} 
+0

वहाँ 'कोशिश/catch' प्रयोग न करें। स्टैकट्रैक पोस्ट करें। –

+4

"स्विंग प्रोग्रामों को 'पेंट()' ओवरराइड करने के बजाय 'paintComponent()' ओवरराइड करना चाहिए। "- [एडब्ल्यूटी और स्विंग में चित्रकारी: पेंट विधि] (http://java.sun.com/products/jfc/tsc/ लेख/चित्रकला/index.html # कॉलबैक)। – trashgod

+0

"यह कोशिश किए बिना अपवाद फेंकता है" - यह गलत है। यदि ब्लॉक अपवाद फेंकता है, तो यह कोशिश/पकड़ के बावजूद करता है। आपका प्रयास/पकड़ ब्लॉक क्या है अपवाद _hide_ है। जो बदले में, डीबग करना असंभव बनाता है। आपको _why_ को समझने की आवश्यकता है कि अपवाद फेंक दिया गया है, इसे गलीचा के नीचे छुपाएं। – Mat

उत्तर

1

जब तक आप पकड़ ब्लॉक के अंदर स्टैकट्रैक प्रिंट नहीं करते हैं तब तक आपको पता नहीं चलेगा। यदि कन्स्ट्रक्टर, new ImageIcon(), अपवाद फेंक नहीं रहा है और इसके बजाय एक शून्य ऑब्जेक्ट लौटा रहा है, तो अगली पंक्ति, a.getImage(), निश्चित रूप से एनपीई का कारण बन जाएगी क्योंकि आप एक शून्य ऑब्जेक्ट पर कोई विधि नहीं कॉल कर सकते हैं।

इस

//this throws exception without try catch   
try 
{   
    ImageIcon a = new ImageIcon(this.getClass().getResource("../Card/AtlanticAve.jpg")); 
    atlantic = a.getImage();   
}   
catch(NullPointerException e){} 

के बजाय

लाइन

// the next line may be wrapped incorrectly due to MarkDown 
ImageIcon a = new ImageIcon(this.getClass().getResource("../Card/AtlanticAve.jpg")); 

मूल रूप से प्रयास करें इस

// the next line may be wrapped incorrectly due to MarkDown 
ImageIcon a = new ImageIcon(this.getClass().getResource("../Card/AtlanticAve.jpg")); 
if (a == null) 
{ 
    System.out.println("Can not find AtlanticAve.jpg"); 
    return; 
} 
    atlantic = a.getImage();   

, तुम क्या निर्माता के कारण हो सकता है, तो ImageIcon एक वापस जाने के लिए देखकर शुरू करने की आवश्यकता शून्य वस्तु। यह आपको सही रास्ते पर ले जाएगा। यह असफल getResource() कॉल के कारण कुछ हो सकता है। पता लगाने का एक आसान तरीका उपर्युक्त रेखा को इसके हिस्सों में अलग करना होगा और उन्हें अपना स्वयं का परिणाम चर देना होगा। यह गन्दा और अचूक है लेकिन इस तरह समस्या निवारण कभी-कभी होता है।

// using _var_ because I'm too lazy to look up the return types of the methods 
var x1 = this.getClass().getResource("../Card/AtlanticAve.jpg"); 
if (x1 == null) 
{ 
    System.out.println("Can't find my resource"); 
} 

आप तस्वीर

+0

का आह्वान करके सभी बच्चों को दोबारा हटा देगा। मैंने छवि समस्या को हल करने में कामयाब रहा है, ऐसा लगता है कि मैंने छवि को सही पैकेज में रखा है, अब मेरी एकमात्र समस्या शेष है, पृष्ठभूमि को सेट क्यों किया जा रहा है? – user1146440

1

मैं बहुत अपने कोड के साथ उलझन में हूँ, लेकिन मुझे लगता है कि समस्या यह है कि अपने पैनल ड्राइंग नहीं है !, अपने पेंट विधि यह होना चाहिए है

@Override 
public void paintComponent(Graphics g){ 
    Graphics2D g2 = (Graphics2D) g; 
    //this code should draw the image but it dosent 
    g2.drawImage(atlantic, 100, 100, null); 
    g.drawImage(atlantic, 100, 100, this); 
} 
+0

क्या आप ग्रहण का उपयोग करते हैं? यदि आपको नहीं करना चाहिए, तो आपको कई समस्याएं होने से रोकना चाहिए :) मज़े करो! –

+0

मैं नेटबीन्स का उपयोग करता हूं और यह मेरा बुरा था कि यह सही पैकेज में छवि को निष्क्रिय कर रहा था, इसलिए मैं अपवाद क्यों प्राप्त कर रहा था अब मेरे पास एकमात्र समस्या यह है कि जेपीनेल आइसेंट सेटिंग की पृष्ठभूमि – user1146440

+0

एकमात्र कारण है जिसे मैं कर सकता हूं देखें कि मैंने जो जवाब पोस्ट किया है, वह है कि आपके पेंट विधि में कुछ भी नहीं कहा जा रहा है। ऊपर दिए गए उत्तर को –

1

पृष्ठभूमि रंग सेट करना कोई असर नहीं होता है क्योंकि आप रंग ओवरराइड() मिलता है। पेंट पृष्ठभूमि को चित्रित करने के लिए ज़िम्मेदार है।

आप अपने रंग विधि में पृष्ठभूमि पेंट करने के लिए की जरूरत है:

public void paint(Graphics g){ 
    // paint the background 
    g.fill(); // not sure about the parameters 
    // paint your image 
    g.drawImage(...); 
} 
+0

Thanx यह समस्या थी – user1146440

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