2012-10-06 27 views
6

पर एक ड्राइंग नहीं है जो मेरे पास एक कस्टम घटक है जो जेकंपोनेंट को बढ़ाता है, जो विधि पेंट कॉम्पोनेंट (ग्राफिक्स जी) को ओवरराइड करता है लेकिन जब मैं इसे अपने जेपीनल में जोड़ने की कोशिश करता हूं तो यह काम नहीं करता है, कुछ भी नहीं खींचा जाता है। - JPanel घटक में जोड़ा जा रहा है, लेकिन यह कितना बड़ा हैजेकंपोनेंट जेननेल

public class SimpleComponent extends JComponent{ 

int x, y, width, height; 

public SimpleComponent(int x, int y, int width, int height){ 
    this.x = x; 
    this.y = y; 
} 

@Override 
public void paintComponent(Graphics g){ 
    Graphics2D g2 = (Graphics2D) g; 
    g2.setColor(Color.BLACK); 
    g2.fillRect(x, y, width, height); 
} 
} 


public class TestFrame{ 
public static void main(String[] args){ 
    JFrame frame = new JFrame(); 
    JPanel panel = new JPanel(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    panel.setPreferredSize(new Dimension(400, 400)); 
    frame.add(panel); 
    frame.pack(); 
    frame.setResizable(false); 

    SimpleComponent comp = new SimpleComponent(10, 10, 100, 100); 
    panel.add(comp); 
    frame.setVisible(true); 
} 
} 

उत्तर

4

यह ठीक काम करता है: यहाँ मेरी कोड है? यदि आप इस चेक करते हैं के बाद जीयूआई प्रदान किया गया है, आप की संभावना पाएंगे कि आपके घटक के आकार 0 है, 0.

SimpleComponent comp = new SimpleComponent(10, 10, 100, 100); 
panel.add(comp); 
frame.setVisible(true); 

System.out.println(comp.getSize()); 

अपने JComponent getPreferredSize ओवरराइड और एक आयाम है कि बनाता है भावना वापसी होने पर विचार करें:

public Dimension getPreferredSize() { 
    return new Dimension(width, height); 
} 

यदि आप एक्स और वाई का उपयोग करना चाहते हैं, तो आप getLocation() को ओवरराइड करना चाहेंगे।

संपादित करें
आपको चौड़ाई और ऊंचाई फ़ील्ड सेट करने की भी आवश्यकता है!

public SimpleComponent(int x, int y, int width, int height) { 
    this.x = x; 
    this.y = y; 
    this.width = width; // *** added 
    this.height = height; // *** added 
} 
+0

यह वास्तव में अजीब है, विंडोज और मैक पर इस समस्या को दोहराया ive और चौड़ाई और ऊंचाई यह अभी भी काम नहीं किया भागों को स्थापित करने के लिए याद करने के बाद इसकी हमेशा ठीक उसी – lilroo

+0

आह, चौड़ाई और ऊंचाई शून्य – lilroo

+0

के लिए निर्धारित है, लेकिन जब मैंने विधि को ओवरराइड किया था तो प्रीपेरड साइज() यह काम करता था। – lilroo

-2

व्हाउआ! बिलकुल सही जवाब नहीं है!

पहला पूर्ण कार्डिनल SIN आपने यह सब किया है यह सब एक गैर-ईडीटी धागे में करना है !!! इसके बारे में यहां बताने के लिए कोई जगह नहीं है ... इसके बारे में जानने के लिए नेट पर केवल 30 बिलियन स्थान हैं।

एक बार यह सब कोड EDT (इवेंट डिस्पैच थ्रेड) में एक Runnable में निष्पादित हो रहा है, तो:

ओवरराइड करने के लिए preferredSize (आप अगर आप चाहते हैं कर सकते हैं, हालांकि) की जरूरत नहीं

आप करते ... लेकिन आपको इसे सेट करने की आवश्यकता है।

आप बिल्कुल सीधे आकार (height और width, या setSize()) सेट नहीं चाहिए!

तुम क्या कर करने के लिए जरूरत पाने के लिए है java.awt.Container, panel, अपने उदाहरण में, "खुद बाहर रखना" के लिए ... वहाँ एक विधि Container.doLayout() है, लेकिन इसे API दस्तावेज़ों में कहते हैं:

इस कंटेनर को इसके घटकों को रखने के कारण बनाता है। अधिकांश कार्यक्रमों को को इस विधि को सीधे कॉल नहीं करना चाहिए, लेकिन इसके बजाय वैध विधि को आमंत्रित करना चाहिए।

समाधान इसलिए है:

SimpleComponent comp = new SimpleComponent(10, 10, 100, 100); 
comp.setPreferredSize(new Dimension(90, 90)); 
panel.add(comp); 

// the key to unlocking the mystery 
panel.validate(); 

frame.setVisible(true); 

संयोग से, मेरे अनुभव से लाभ कृपया: मैं घंटे और घंटे बिताए हैं यह सब validate, invalidate, paintComponent, paint, आदि सामान समझने की कोशिश कर मेरे बाल बाहर फाड़ ... और मुझे अभी भी लगता है कि मैंने केवल सतह खरोंच की है।

+0

कृपया देखें http://stackoverflow.com/questions/10866762/use-of-overriding-getpreferredsize-instead-of-using-setpreferredsize-for-fix?rq=1 –

+0

ठीक धन्यवाद ... लेकिन अगर आप व्यक्ति थे जिन्होंने यहां मेरा जवाब घटाया जो इस प्रश्न के लिए भविष्य के आगंतुकों के लिए बहुत उपयोगी नहीं था: मेरा उत्तर स्वीकार्य उत्तर से कहीं ज्यादा बेहतर है, और 'सेट प्रीपेरर्ड साइज'/'getPreferredSize' के बारे में जानकारी उसमें बदलाव नहीं करती है। –

+0

ओह ... मुझे लगता है कि आप स्वीकार किए गए उत्तर का उत्तरदाता थे! लेकिन 214k के प्रतिनिधि के साथ आपको निश्चित रूप से पता होना चाहिए कि मैंने जो भी कहा है, वह सही है, और यह कि आपका जवाब सचमुच, उम, मैं इसे कैसे रखूं, सुधार के लिए जगह छोड़ देता है! –