2012-01-08 10 views
7

मेरे पास JPanelJViewport में जोड़ा गया है, और पैनल में इसमें कई अन्य पैनल जोड़े गए हैं। मैं ड्रैगिंग चयन को लागू करने की कोशिश कर रहा हूं, जहां आप माउस खींचकर एक से अधिक घटक चुन सकते हैं। मुझे सामना करने वाली एकमात्र समस्या यह है कि चयन आयताकार मुख्य JPanel में जोड़े गए घटकों के पीछे चित्रित किया जा रहा है। मैं उनके ऊपर कैसे पेंट कर सकता हूं?स्विंग में घटकों के शीर्ष पर चित्रकारी?

मेरे संरचना इस प्रकार है:
JFrame ->ContentPane ->JLayeredPane ->JScrollPane ->JPanel ->JPanel []। कॉलेज असाइनमेंट के लिए

डिजाइन मसौदा:
आप देख सकते हैं, आयत अन्य पैनलों के पीछे है।

Design draft for college assignment.

+2

+1: बहुत अच्छा लग रहा है! यह किस ओएस पर चल रहा है? या क्या देखो और महसूस किया जाता है? फ़ॉन्ट "उबंटू" जैसा दिखता है। –

+0

विंडोज़ पर इस समय, लेकिन जब मैं कर रहा हूं तो यह विंडोज और मैक पर समान दिखाई देगा। मैंने स्क्रैच से सभी घटकों को बनाया है, जो शायद इसके बारे में जाने का एक बेवकूफ तरीका है, लेकिन मुझे डिजाइन की स्वतंत्रता पसंद है। – rtheunissen

+0

फ़ॉन्ट गोथम है, लेकिन मुझे यकीन नहीं है कि मैं इसे रखूंगा। : पी – rtheunissen

उत्तर

8

यह वही है मैं पहले से ही (एक बहुत सरल स्तर पर स्पष्ट रूप से) कर रहा हूँ है, और स्विंग घटकों से जोड़ रहे है नीचे आयत पेंट करता है।

यह एक ऐसा मामला है जहां आपको पैनल की पेंट() विधि को ओवरराइड करना चाहिए, न कि पेंटकंपोनेंट() विधि। फिर कस्टम पेंटिंग किया जाएगा सभी बच्चे घटकों को चित्रित करने के बाद।

+0

जो मुझे सेंस +1 बनाता है – mKorbel

+0

मुझे यह जवाब भी नहीं मिला, मैं इसे जाने दूंगा। धन्यवाद – rtheunissen

+0

वापस रिपोर्ट करने के लिए इतना समय लगने के लिए खेद है। – rtheunissen

1

अपने वास्तविक कोड देखकर बिना, यह तुम गलत क्या कर रहे हैं कहना मुश्किल है। हालांकि, मैं अभी भी कह सकता हूं कि मैं क्या करूँगा:

एक जेननेल बनाएं जो पूरे क्षेत्र का प्रतिनिधित्व करता है जहां आप आकर्षित करना चाहते हैं, जिसमें - निश्चित रूप से - प्रत्येक घटक शामिल है।

@Override 
public void paintComponents(Graphics g) 
{ //     ^
    super.paintComponents(g); 

    // Draw your selection rectangle: 
    g.setColor(Color.RED); 
    g.drawRectangle(selectionRectangle); 
} 
+0

यही वह है जो मैं पहले से कर रहा हूं (जाहिर तौर पर एक बहुत ही सरल स्तर पर), और स्विंग इसमें जोड़े गए घटकों के नीचे आयताकार चित्रित करता है। – rtheunissen

+0

हम्म, फिर इसके बजाय पेंट कॉम्पोनेंट को ओवरराइड करने का प्रयास करें। –

+0

क्या यह पेंटकंपोनेंट्स का उपयोग करके काम करता था? –

4

लेयर्ड फलक का प्रयोग करें:

http://docs.oracle.com/javase/tutorial/uiswing/components/layeredpane.html

यह आपको अनुमति देता है
अवहेलना कि पैनल अपनी paintComponents(Graphics) इस तरह (संपादित, नोटिस s अब विधि नाम से अंतिम वर्ण है) ओवरलैपिंग घटकों को बनाने के लिए।

खींचें चित्र को संभालने के लिए एक गिलास फलक का उपयोग करें, और संभवतः घटनाओं के रूप में अच्छी तरह से:

http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html#glasspane

+0

ठीक है, इसलिए मेरी संरचना निम्नानुसार है: जेएफआरएम -> कंटेंटपेन -> लेयरपेन -> जेएसक्रॉलपेन -> जेपीनल -> जेपीनल []। मैंने प्रश्न में एक स्क्रीनशॉट जोड़ा है। – rtheunissen

+0

ओवरले स्क्रॉल करने में सक्षम होने के लिए आपको JSCrollPane के अंदर लेयरपेन को रखना होगा (यदि आप इसे चाहते हैं)। –

+0

मुझे लगता है कि मैं देखता हूं कि आपका क्या मतलब है। उदाहरण के लिए: 'JFrame' -> 'ContentPane' ->' JLayeredPane' -> 'JSCrollPane' -> ** JLayeredPane ** ->' जेपीनेल '->' जेपीनल '->' जेपीनल []' – rtheunissen

1

गर्म वास्तव में यकीन है कि आप वास्तव में क्या जरूरत है और अंतिम प्रभाव है, शायद वहाँ दो अन्य

को पेंटिंग तरीके है

1) GlassPane

2) Viewport

आप ca n दिखाई Rectanle

0

ठीक करने के लिए रखा है कि एक साथ, carrefully Insets, यह क्या मैं अंत में करने के लिए तय कर लिया है है:
मुझे यकीन है कि अगर यह यह करने के लिए सबसे अच्छा तरीका है नहीं कर रहा हूँ, लेकिन ऐसा लगता है ठीक काम करने के लिए।
नोट: MigLayout का उपयोग करना।

रंगीन ब्लॉक के नीचे JPanel के निर्माता में।

... 
this.add(new JPanel() { 

    @Override 
    public boolean isOpaque() { 
     return false; 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     if (dragShape != null) { 
      g.setColor(Colors.SECONDARY); 
      g.setStroke(new BasicStroke(2)); 
      g.draw(dragShape); 
     } 
    } 
    }, "pos 0 0, width 100%, height 100%", 0); 
    ... 
+0

यह भी देखें [अस्पष्टता] (http://java.sun.com/products/jfc/tsc/articles/painting/index.html#props)। – trashgod

0

स्विंग घटकों के शीर्ष पर कस्टम पेंटिंग JLayeredPane द्वारा सुविधा प्रदान की जाती है। टी his article एक अमूर्त बेस क्लास का वर्णन करता है जो विशिष्ट क्षेत्रों (जैसे चयन आयताकार या घटक सीमाओं) को अधिक लाभ प्रदान करता है।

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