2009-08-06 15 views
9

के साथ क्लिपिंग के अंदर मुझे java.awt.Graphics का उपयोग करके एक रेखा खींचनी होगी, लेकिन आयत के बाहर स्थित रेखा का केवल भाग ही प्रस्तुत किया जाना चाहिए।जावा ग्राफिक्स

क्या ग्राफिक्स क्लिपिंग समर्थन का उपयोग करना संभव है या क्या मुझे चौराहे की गणना करने और लाइन को स्वयं क्लिप करने की आवश्यकता है?

उत्तर

10

आपको Area कक्षा का उपयोग करने की आवश्यकता है। यह उदाहरण दिखाएगा कि आप क्या पूछते हैं:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.geom.Area; 
import java.awt.geom.Rectangle2D; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 


public class Test extends JPanel { 

    public static void main(String[] args) { 
     JFrame f = new JFrame(); 
     Test t = new Test(); 
     f.getContentPane().setLayout(new BorderLayout()); 
     f.getContentPane().add(t,BorderLayout.CENTER); 
     f.pack(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setVisible(true); 
    } 

    public Test() { 
     setPreferredSize(new Dimension(300, 300)); 
    } 

    public void paintComponent(Graphics g) { 
     Graphics2D g2 = (Graphics2D)g.create(); 
     Rectangle2D rectangleNotToDrawIn = new Rectangle2D.Double(100, 100, 20, 30); 
     Area outside = calculateRectOutside(rectangleNotToDrawIn); 
     g2.setPaint(Color.white); 
     g2.fillRect(0, 0, getWidth(), getHeight()); 
     g2.setPaint(Color.black); 
     g2.setClip(outside); 
     g2.drawLine(0, 0, getWidth(), getHeight()); 

    } 


    private Area calculateRectOutside(Rectangle2D r) { 
     Area outside = new Area(new Rectangle2D.Double(0, 0, getWidth(), getHeight())); 
     outside.subtract(new Area(r)); 
     return outside; 
    } 

} 
+0

धन्यवाद, सही! – tuler

+1

+1 - मेरा से अधिक बेहतर :) – banjollity

+0

पठनीयता और विस्तारशीलता के मामले में क्षेत्र विधि बेहतर है (आप इसके बाहर कोई भी आकार और क्लिप बना सकते हैं) लेकिन मुझे लगता है कि इसमें कुछ प्रदर्शन समस्याएं हो सकती हैं (क्षेत्र वर्ग थोड़ा सा है शीर्ष पर शायद)। यदि आपको क्लिप पर कई बार आकर्षित करने की आवश्यकता है और देखें कि क्या अन्य विधि तेज है तो आपको इसे बेंचमार्क करना चाहिए। –

3

आप इसे एडब्ल्यूटी क्लिप के साथ कर सकते हैं। आपको उस आयत की सीमाओं को जानना होगा जिन्हें आप बाहर करना चाहते हैं, और आपके ड्राइंग क्षेत्र की बाहरी सीमाएं।

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

 
+-------------------+ 
| clip drawing area | 
+---+-----------+ | 
| | excluded | | 
| | area | | 
| +-----------+ | 
|     | 
+-------------------+ 

इस विधि को मैन्युअल रूप से लाइन चौराहे की गणना करने पर लाभ होता है जिसमें यह सभी एडब्ल्यूटी पेंटिंग को बाहर किए गए क्षेत्र में जाने से रोकता है। मुझे नहीं पता कि यह आपके लिए उपयोगी है या नहीं।

मेरा डेमो क्लिप के काम को चित्रित करने के लिए पूरे क्षेत्र में एक काले आयताकार और एक सफेद सफेद विकर्ण रेखा को चित्रित करता है।

public class StackOverflow extends JFrame { 
    public static void main(String[] args) { 
     new StackOverflow(); 
    } 

    private StackOverflow() { 
     setTitle("Clip with a hole"); 
     setSize(320,300); 
     getContentPane().add(new ClipPanel()); 
     setVisible(true); 
    } 
} 

class ClipPanel extends JPanel { 
    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     Polygon clip = new Polygon(
       new int[]{ 0, 100, 100, 0, 0, 20, 20, 80, 80, 0 }, 
       new int[]{ 0, 0, 60, 60, 20, 20, 40, 40, 20, 20 }, 
       10 
      ); 
     g.setClip(clip); 
     g.setColor(Color.BLACK); 
     g.fillRect(0,0,100,60); 
     g.setColor(Color.WHITE); 
     g.drawLine(0,0,100,60); 
    } 
} 
+0

भी सही। लेकिन दूसरा आसान है क्योंकि घटाव का उपयोग करता है। धन्यवाद। – tuler

+0

हाँ Savvas Dalkitsis का जवाब बहुत बेहतर है। – banjollity

+0

+1। यह उत्तर लगभग काम करता है, और जे 2 एमई पीपी द्वारा समर्थित एपीआई का उपयोग करता है। मैंने पाया कि मुझे एक संलग्न बहुभुज बनाने के लिए आकार 0,20 पर शुरू करना था। पूरा काम कोड मेरे प्रश्न में है: http://stackoverflow.com/questions/1273688/is-there-any-way-to-have-an-inverted-clip-region-for-painting-in-java –

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