2011-06-08 110 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