2012-04-10 12 views
8

मैं अपने व्यूपोर्ट में एक छवि प्रदर्शित करने के लिए स्क्रॉलपैन का उपयोग करना चाहता हूं, और छवि पर ग्रिड (या बॉक्स, या किसी अन्य प्रकार का पंजीकरण/स्थान मार्कर) ओवरले भी लेना चाहता हूं। स्क्रॉल करते समय मुझे स्थिर रहने के लिए ओवरले की आवश्यकता होती है (जिसका अर्थ है कि छवि ओवरले के नीचे "चलती है)। मैं एक चिकनी गति प्रदान करने के लिए व्यूपोर्ट में दृश्य को स्क्रॉल कर रहा हूं, और ओवरले व्यूपोर्ट के भीतर किसी निश्चित स्थान का संदर्भ प्रदान करना है। संकल्पनात्मक रूप से, व्यूपोर्ट में एक बड़े मानचित्र स्क्रॉलिंग के बारे में सोचें, और व्यूपोर्ट में एक आयताकार है जो स्थानांतरित नहीं होता है (व्यूपोर्ट के सापेक्ष) जो उस क्षेत्र को चिह्नित करता है जिसे कुछ उपयोगकर्ता क्रिया के आधार पर ज़ूम किया जा सकता है।जावा: स्क्रॉलपेन व्यूपोर्ट पर गैर-स्क्रॉलिंग ओवरले कैसे आकर्षित करें?

मुझे लगता है कि (लेकिन अभी तक पुष्टि नहीं हुई है) कि स्क्रॉलपेन कार्यान्वयन कुशलता से दृश्य को प्रतिपादित करता है (बैकिंग स्टोर से, प्रत्येक नए आंशिक एक्सपोजर के लिए पूरे व्यू (या यहां तक ​​कि व्यूपोर्ट) को पुन: पेश नहीं करना) और इसलिए पसंद करेंगे पेंट() विधि को ओवरराइड नहीं करना है।

मैंने लेयरपेन को देखा है, और इसे महारत हासिल नहीं करते हुए, ऐसा लगता है कि यह एक क्रूर बल दृष्टिकोण है। स्क्रॉलपेन स्प्लिटपेन का एक घटक है और इसे स्थानांतरित/आकार बदल दिया जाएगा। मुझे उम्मीद है कि मुझे पूर्ण स्थिति का उपयोग करके व्यूपोर्ट और लेयरपेन के बीच सही रिश्ते को मैन्युअल रूप से बनाए रखना होगा। मैं जीयूआई डिजाइन & कार्यान्वयन में एक विशेषज्ञ से बहुत दूर हूं और मुझे यकीन है कि मुझे स्पष्ट रूप से अस्पष्ट और सुरुचिपूर्ण से लेकर संभावनाएं हैं जो एक अनुभवी व्यक्ति को पता चलेगा।

मैं किसी भी सुझाव के लिए खुला हूं, न केवल जिस मार्ग को मैंने शुरू किया है। क्या मुझे (क्या मैं) अपने स्प्लिटपेन में एक घटक के रूप में एक जेपीनेल जोड़ सकता हूं, फिर लेयरपेन पर अलग-अलग परतों पर मेरे स्क्रॉलपैन और ओवरले (एक और जेपीनल) युक्त लेयरपेन जोड़ें? क्या इसका समर्थन करने के लिए स्क्रॉलपेन में कार्यक्षमता है? मैंने जावा स्विंग ट्यूटोरियल और एपीआई दस्तावेज को देखा है लेकिन अभी तक कुछ भी नहीं देखा है।

धन्यवाद।

अद्यतन:

लिंक, trashgod के लिए धन्यवाद। यह अपेक्षा की तुलना में यह बहुत आसान था। लेयरपेन, ग्लासपेन, एक्सओआर-आधारित कंपोजिटिंग की कोई ज़रूरत नहीं है ... मुझे नहीं पता कि मेरे ओवरले को आकर्षित करने के लिए JViewport.paint() को ओवरराइड करने का प्रयास करने के लिए ऐसा क्यों नहीं हुआ - लेकिन नीचे दिए गए कोड के साथ मैंने अवधारणा को मान्य किया मुझे वह दे दो जो मैं ढूंढ रहा हूं। बस JViewport के उप-वर्ग का उपयोग करें और यह वही करता है जो मैं चाहता था (इस मामले में व्यूपोर्ट के केंद्र में एक आयत को ओवरले करना जबकि छवि स्क्रॉल नीचे है)। मैं कोई जीयूआई विशेषज्ञ नहीं हूं, और जावा एपीआई अविश्वसनीय रूप से चौड़ा है; मुझे नहीं पता कि आप लोग इसे अपने सिर में कैसे रखते हैं - लेकिन धन्यवाद!

class MyViewport extends JViewport { 
    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 
     Graphics2D g2 = (Graphics2D)g; 
     g2.setPaint(Color.BLACK); 
     g2.drawRect(getWidth()/4,getHeight()/4,getWidth()/2,getHeight()/2); 
    } 
} 
+2

यह भी देखें ['स्क्रॉलपेनपेंट'] (http://stackoverflow.com/a/3518047/230513)।अद्यतन: यह भी देखें [* ग्लास फलक *] (http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html#glasspane)। या तो दोनों एक [एसएससीई] (http://sscce.org/) बनाने में आपकी मदद कर सकते हैं। – trashgod

+1

वह लिंक सिर्फ सही दिशा में आवश्यक था। समाधान के साथ अद्यतन सवाल। धन्यवाद trashgod। – ags

उत्तर

7

आमतौर पर, "स्विंग कार्यक्रमों अधिभावी paint() के बजाय paintComponent() ओवरराइड करना चाहिए," के रूप में Painting in AWT and Swing: The Paint Methods में उल्लेख किया है। ScrollPanePaint के आधार पर, स्क्रॉलिंग सामग्री से नीचे खींचता है, तो निम्न उदाहरण को को स्क्रॉलिंग सामग्री से ऊपर खींचने के लिए ओवरराइड करता है।

ScrollPanePaint

import java.awt.*; 
import javax.swing.*; 

/** 
* @see https://stackoverflow.com/a/10097538/230513 
* @see https://stackoverflow.com/a/2846497/230513 
* @see https://stackoverflow.com/a/3518047/230513 
*/ 
public class ScrollPanePaint extends JFrame { 

    private static final int TILE = 64; 

    public ScrollPanePaint() { 
     JViewport viewport = new MyViewport(); 
     viewport.setView(new MyPanel()); 
     JScrollPane scrollPane = new JScrollPane(); 
     scrollPane.setViewport(viewport); 
     this.add(scrollPane); 
     this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
     this.pack(); 
     this.setLocationRelativeTo(null); 
     this.setVisible(true); 
    } 

    private static class MyViewport extends JViewport { 

     public MyViewport() { 
      this.setOpaque(false); 
      this.setPreferredSize(new Dimension(6 * TILE, 6 * TILE)); 
     } 

     @Override 
     public void paint(Graphics g) { 
      super.paint(g); 
      g.setColor(Color.blue); 
      g.fillRect(TILE, TILE, 3 * TILE, 3 * TILE); 
     } 
    } 

    private static class MyPanel extends JPanel { 

     public MyPanel() { 
      this.setOpaque(false); 
      this.setPreferredSize(new Dimension(9 * TILE, 9 * TILE)); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.setColor(Color.lightGray); 
      int w = this.getWidth()/TILE + 1; 
      int h = this.getHeight()/TILE + 1; 
      for (int row = 0; row < h; row++) { 
       for (int col = 0; col < w; col++) { 
        if ((row + col) % 2 == 0) { 
         g.fillRect(col * TILE, row * TILE, TILE, TILE); 
        } 
       } 
      } 
     } 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new ScrollPanePaint(); 
      } 
     }); 
    } 
} 

नोट: स्क्रॉल फलक अजीब दृश्य कीड़े, उदाहरण के लिए तय नीले बॉक्स चलती जब स्क्रॉल दे देंगे के लिए एक दृश्य के रूप में एक अपारदर्शी घटक (उदाहरण के JTable के लिए) की स्थापना। इसे ठीक करने के लिए व्यू घटक पर setOpaque (false) का उपयोग करें।

+0

इस दृष्टिकोण का सुझाव देने के लिए @ags के लिए Kudos। – trashgod

+0

@mKorbel: क्षमा करें अगर मैंने यहां प्रोटोकॉल का पालन नहीं किया है। क्या कोई सुझाव या प्रश्न था जो मुझे याद आया? – ags

+0

मैं पेंट() बनाम पेंट कॉम्पोनेंट() के कुछ अस्पष्ट उल्लेखों में भाग गया, लेकिन अंतरों को समझने के लिए मुझे कुछ शोध करने की आवश्यकता होगी और जब प्रत्येक उपयुक्त होगा। सूचक के लिए फिर से धन्यवाद। – ags

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