2011-01-09 13 views
5

मेरे पास एक फ्रेम के अंदर एक जेपीनल है। जेपीनेल की सामग्री प्रत्येक कॉल के साथ paintComponent (जिसे repaint() द्वारा बुलाया जाता है) के साथ अद्यतन किया जाना चाहिए, लेकिन जब मैं इसे नीचे करता हूं, तो मुझे बस एक सफेद खिड़की दिखाई देती है। (कृपया घायल खरोज बहाना, ग्रहण टैब के साथ अजीब सामान के सभी प्रकार है।)फ्रेम के अंदर एक जेपीनल को दोबारा लगाने के लिए

private static void handleGUI() 
{  
    JFrame frame = new JFrame("Animation"); 
    frame.setPreferredSize(new Dimension(100, 100)); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    Board b = new Board(); 

    frame.getContentPane().add(b); 

    frame.pack(); 
    frame.setVisible(true); 

    while(true) 
    { 
     System.out.println("Repainting panel"); 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
     } 
     b.repaint(); 
    } 
} 

public class Board extends JPanel 
{ 
public Board() { t=0; } 

    private int t; 

public void paintComponent(Graphics g) 
{ 
    super.paintComponent(g); 

    ++t; 

    /* Variables snipped */ 

    g.setColor(Color.white); 
    g.drawOval(0, 0, width, height); 

    BufferedImage image = ImageIO.read(new File(imagePath)); 
    g.drawImage(image, x(t), y(t)); 
    /* There's some more image and rectangle drawing ahead */ 
} 

}

+2

असल में, ग्रहण टैब के साथ सभी प्रकार की अच्छी चीजें करता है। :-) अपने स्रोत को स्वचालित रूप से प्रारूपित करने के लिए बस CTRL-SHIFT-F दबाएं। यह आपके लिए एक सतत स्वरूपण और इंडेंटेशन का उत्पादन करेगा, जो आपको स्वयं करने के बोझ से मुक्त करेगा। – harschware

+0

एक्स (0), वाई (0) के लिए मूल्य क्या हैं? छवि आपके पैनल के बाहर हो सकती है। क्या आप इसे डीबगर में चलाते हैं? अगर आपकी छवि नहीं मिली है तो कोड जीयूआई थ्रेड में अपवाद फेंक सकता है। – josefx

उत्तर

6

आपको अपने कोड के साथ कई समस्याएं हैं, एक का उल्लेख ऊपर किया गया है (1+ प्रतिनिधि - हालांकि यह मुझे लगता है कि अगर आपके पास अब आपके पेंट में कोड है तो कॉम्पोनेंट विधि जो ड्राइंग करता है), आपकी पेंट कॉम्पोनेंट विधि त्रुटिपूर्ण है, लेकिन केवल इतना ही नहीं, आपके पास स्विंग मुख्य थ्रेड, ईडीटी में थोड़ी देर (सत्य) लूप और थ्रेड स्लीप है, जो स्विंग और आपके पूरे जीयूआई को सोने के लिए रखेगी। इसके बजाय एक स्विंग टाइमर का उपयोग करने के लिए बेहतर है। इसके अलावा, आप राज्य,

JPanel की सामग्री (जो रीपेंट द्वारा कहा जाता है()) paintComponent की प्रत्येक कॉल,

आपको लगता है कि आप डाल करने के लिए चाहते हैं के साथ अद्यतन करने की अपेक्षा की जाती है पेंट कॉम्पोनेंट विधि के अंदर प्रोग्राम तर्क? यह आमतौर पर तब तक डूब जाता है जब प्रोग्रामर के पास इस विधि को बुलाए जाने के संबंध में पूर्ण नियंत्रण नहीं होता है। इसे तब कहा जा सकता है जब आप पश्चाताप करते हैं (लेकिन हमेशा नहीं), और ओएस से संदेशों के कारण बुलाया जा सकता है जब आप इसे कॉल करने की अपेक्षा नहीं करते हैं।

इसके अलावा, आप कभी भी पेंट कॉम्पोनेंट विधि के अंदर एक फ़ाइल नहीं पढ़ना चाहते हैं क्योंकि इससे आपकी पेंटिंग को एक गलियारे में धीमा कर दिया जाएगा। यदि छवि किसी भी महत्वपूर्ण है

1) 1000 की अवधि के साथ एक स्विंग टाइमर बनाएँ, और उसके ActionListener के actionPerformed विधि, अपनी छवि में पढ़ा में (एक पृष्ठभूमि सूत्र में अधिमानतः:

मैं इन परिवर्तनों की सलाह देते हैं आकार) और छवि को एक वर्ग फ़ील्ड में पढ़ा है, जिसे छवि कहा जाता है।

2) उसी टाइमर की कार्रवाई में समर्थित विधि, वृद्धि टी।

3) छवि पढ़ने के बाद, ड्राइंग जेपीनेल पर दोबारा कॉल करें और चित्रकारी जेपीनल छवि को चित्रित करने के लिए छवि चर का उपयोग करें। सावधान रहें यदि आप छवि में पढ़ने के लिए पृष्ठभूमि थ्रेड का उपयोग कर रहे हैं, क्योंकि आपको यह थ्रेड जीयूआई को सूचित करने की आवश्यकता होगी जब छवि पूरी तरह से पढ़ी जा रही है। यदि ऐसा करने के लिए स्विंगवर्कर का उपयोग करना है, तो आप एक PropertyChangeListener जोड़ सकते हैं जो सुनता है SwingWorker के राज्य मूल्य पर और ट्रिगर्स जब यह StateValue में बदल जाता है। किया गया।

यदि इनमें से कोई अस्पष्ट या भ्रमित नहीं है, तो कृपया स्पष्टीकरण के लिए पूछें।

संपादित करें: यदि छवियां बहुत बड़ी नहीं हैं, तो आप उन्हें एक ही समय में पढ़ना चाहेंगे, या एक समूह की आवश्यकता होने पर बैच पढ़ना चाहें। उन्हें उपयोग करने से पहले छवियों में पढ़ने की कोई पूर्ण आवश्यकता नहीं है।

1

अपने paintComponent सिर्फ super.paintComponent कहता है। तो जेपीनेल इसे स्वयं पेंट करते समय, जो हल्के भूरे, या सफेद या हल्के भूरे या कुछ आपके दिखने और महसूस के आधार पर होगा।

+0

शायद यह सफ़ेद है क्योंकि नींद में जाने पर उसका ऐप लॉक हो गया और सभी पश्चाताप खत्म नहीं हुआ। – harschware

2

धागा नींद मत बनाओ। पुनर्विचार घटनाओं को बंद करने के लिए एक स्विंग टाइमर का उपयोग करें।