2011-06-08 93 views

回答

4

Path2D.append() + EVEN_ODD纏繞規則似乎做的伎倆:

enter image description here

package com.example.test.gui; 

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.geom.Line2D; 
import java.awt.geom.Path2D; 
import java.awt.geom.Rectangle2D; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class HoleClipper extends JPanel 
{ 
    @Override protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g; 
     Rectangle2D r1 = getBounds(); 
     int margin = 50; 
     Rectangle2D r2 = new Rectangle2D.Double(
       r1.getMinX()+margin, 
       r1.getMinY()+margin, 
       r1.getWidth()-2*margin, 
       r1.getHeight()-2*margin); 

     g2d.setColor(Color.YELLOW); 
     g2d.fill(r1); 

     Path2D p = new Path2D.Double(Path2D.WIND_EVEN_ODD); 
     p.append(r1, false); 
     p.append(r2, false); 
     g2d.clip(p); 

     int spacing = 10; 
     g2d.setColor(Color.BLACK); 
     for (double d = 0; d < r1.getWidth() + r1.getHeight(); d += spacing) 
     { 
      Line2D line = new Line2D.Double(0, d, d, 0); 
      g2d.draw(line); 
     } 
    } 

    public static void main(String[] args) { 
     HoleClipper clipper = new HoleClipper(); 
     clipper.setPreferredSize(new Dimension(300, 200)); 

     JFrame frame = new JFrame("HoleClipper"); 
     frame.setContentPane(clipper); 
     frame.pack(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 
} 
+0

我需要幫助,請你在我的代碼幫助。 – 2017-02-11 13:40:31

1

GeneralPath類是Shape的實現,它可以表示帶有孔的形狀。您可以定義多個路徑段,其中一個代表「外部」,一個代表「洞」。使用GeneralPath定義您想要的裁剪區域,然後致電clip()

2

看起來像這個不被Graphics的setClip支持。當我閱讀文檔的矩形是所有支持:

公共抽象無效setClip的(形夾)

將當前的剪貼區域設置爲任意的剪貼形狀。並非所有實現Shape接口的對象都可以用來設置剪輯。保證受支持的唯一Shape對象是通過getClip方法和Rectangle對象獲取的Shape對象。此方法設置用戶剪輯,該剪輯獨立於與設備邊界和窗口可見性關聯的剪輯。

+1

不能保證工作,但它看起來像它 – 2011-06-08 15:12:58